summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--COPYING674
-rw-r--r--CliParser.cpp197
-rw-r--r--CliParser.h55
-rw-r--r--CompilerInfo.h15
-rw-r--r--CopyEngineManager.cpp385
-rw-r--r--CopyEngineManager.h105
-rw-r--r--CopyListener.cpp480
-rw-r--r--CopyListener.h123
-rw-r--r--Core.cpp1161
-rw-r--r--Core.h197
-rw-r--r--DebugEngine.cpp395
-rw-r--r--DebugEngine.h131
-rw-r--r--DebugEngineMacro.h28
-rw-r--r--DebugModel.cpp158
-rw-r--r--Environment.h21
-rw-r--r--EventDispatcher.cpp699
-rw-r--r--EventDispatcher.h97
-rw-r--r--ExtraSocket.cpp60
-rw-r--r--ExtraSocket.h30
-rw-r--r--FacilityEngine.cpp251
-rw-r--r--FacilityEngine.h76
-rw-r--r--HelpDialog.cpp145
-rw-r--r--HelpDialog.h48
-rw-r--r--HelpDialog.ui191
-rw-r--r--InternetUpdater.cpp110
-rw-r--r--InternetUpdater.h33
-rw-r--r--LanguagesManager.cpp287
-rw-r--r--LanguagesManager.h78
-rw-r--r--LocalListener.cpp348
-rw-r--r--LocalListener.h65
-rw-r--r--LocalPluginOptions.cpp59
-rw-r--r--LocalPluginOptions.h42
-rw-r--r--LogThread.cpp296
-rw-r--r--LogThread.h98
-rw-r--r--OSSpecific.cpp58
-rw-r--r--OSSpecific.h29
-rw-r--r--OSSpecific.ui108
-rw-r--r--OptionDialog.cpp1015
-rw-r--r--OptionDialog.h122
-rw-r--r--OptionDialog.ui988
-rw-r--r--OptionEngine.cpp242
-rw-r--r--OptionEngine.h87
-rw-r--r--PlatformMacro.h59
-rw-r--r--PluginInformation.cpp120
-rw-r--r--PluginInformation.h42
-rw-r--r--PluginInformation.ui136
-rw-r--r--PluginLoader.cpp339
-rw-r--r--PluginLoader.h82
-rw-r--r--PluginsManager.cpp932
-rw-r--r--PluginsManager.h157
-rw-r--r--README46
-rw-r--r--README.sources32
-rw-r--r--ResourcesManager.cpp216
-rw-r--r--ResourcesManager.h54
-rw-r--r--SessionLoader.cpp171
-rw-r--r--SessionLoader.h61
-rw-r--r--StructEnumDefinition.h153
-rw-r--r--StructEnumDefinition_UltracopierSpecific.h55
-rw-r--r--SystrayIcon.cpp559
-rw-r--r--SystrayIcon.h144
-rw-r--r--ThemesManager.cpp291
-rw-r--r--ThemesManager.h87
-rw-r--r--Variable.h50
-rw-r--r--cpp11addition.cpp531
-rw-r--r--cpp11addition.h203
-rw-r--r--cpp11additionstringtointcpp.cpp485
-rw-r--r--interface/FacilityInterface.h44
-rw-r--r--interface/OptionInterface.h36
-rw-r--r--interface/PluginInterface_CopyEngine.h208
-rw-r--r--interface/PluginInterface_Listener.h56
-rw-r--r--interface/PluginInterface_PluginLoader.h39
-rw-r--r--interface/PluginInterface_SessionLoader.h39
-rw-r--r--interface/PluginInterface_Themes.h115
-rw-r--r--lib/qt-tar-xz/QTarDecode.cpp174
-rw-r--r--lib/qt-tar-xz/QTarDecode.h36
-rw-r--r--lib/qt-tar-xz/QXzDecode.cpp146
-rw-r--r--lib/qt-tar-xz/QXzDecode.h40
-rw-r--r--lib/qt-tar-xz/QXzDecodeThread.cpp48
-rw-r--r--lib/qt-tar-xz/QXzDecodeThread.h37
-rw-r--r--lib/qt-tar-xz/xz.h273
-rw-r--r--lib/qt-tar-xz/xz_config.h123
-rw-r--r--lib/qt-tar-xz/xz_crc32.c52
-rw-r--r--lib/qt-tar-xz/xz_dec_bcj.c564
-rw-r--r--lib/qt-tar-xz/xz_dec_lzma2.c1175
-rw-r--r--lib/qt-tar-xz/xz_dec_stream.c822
-rw-r--r--lib/qt-tar-xz/xz_lzma2.h204
-rw-r--r--lib/qt-tar-xz/xz_private.h159
-rw-r--r--lib/qt-tar-xz/xz_stream.h57
-rw-r--r--main.cpp149
-rw-r--r--other-pro/static.pro33
-rw-r--r--other-pro/supercopier-core.pro3
-rw-r--r--other-pro/ultracopier-core.pro131
-rw-r--r--other-pro/ultracopier-static.pro6
-rw-r--r--plugins-alternative/Listener/dbus/Catchcopy.cpp17
-rw-r--r--plugins-alternative/Listener/dbus/Catchcopy.h20
-rw-r--r--plugins-alternative/Listener/dbus/DebugEngineMacro.h28
-rw-r--r--plugins-alternative/Listener/dbus/Environment.h10
-rw-r--r--plugins-alternative/Listener/dbus/StructEnumDefinition.h1
-rw-r--r--plugins-alternative/Listener/dbus/Variable.h15
-rw-r--r--plugins-alternative/Listener/dbus/documentation.dox36
-rw-r--r--plugins-alternative/Listener/dbus/informations.xml26
-rw-r--r--plugins-alternative/Listener/dbus/listener.cpp85
-rw-r--r--plugins-alternative/Listener/dbus/listener.h49
-rw-r--r--plugins-alternative/Listener/dbus/listener.pro19
-rw-r--r--plugins-alternative/Listener/dbus/plugin.json1
-rw-r--r--plugins-alternative/PluginLoader/keybinding/DebugEngineMacro.h28
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Environment.h10
-rw-r--r--plugins-alternative/PluginLoader/keybinding/KeyBind.cpp11
-rw-r--r--plugins-alternative/PluginLoader/keybinding/KeyBind.h18
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/ar/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/de/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/el/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/en/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/es/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/fr/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/hi/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/hu/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/id/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/it/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/ja/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/ko/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/nl/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/no/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/pl/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/pt/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/ru/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/th/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/tr/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Languages/zh/translation.ts4
-rw-r--r--plugins-alternative/PluginLoader/keybinding/OptionsWidget.cpp55
-rw-r--r--plugins-alternative/PluginLoader/keybinding/OptionsWidget.h31
-rw-r--r--plugins-alternative/PluginLoader/keybinding/OptionsWidget.ui31
-rw-r--r--plugins-alternative/PluginLoader/keybinding/PlatformMacro.h1
-rw-r--r--plugins-alternative/PluginLoader/keybinding/StructEnumDefinition.h1
-rw-r--r--plugins-alternative/PluginLoader/keybinding/Variable.h16
-rw-r--r--plugins-alternative/PluginLoader/keybinding/documentation.dox33
-rw-r--r--plugins-alternative/PluginLoader/keybinding/informations.xml27
-rw-r--r--plugins-alternative/PluginLoader/keybinding/plugin.json1
-rw-r--r--plugins-alternative/PluginLoader/keybinding/pluginLoader.cpp61
-rw-r--r--plugins-alternative/PluginLoader/keybinding/pluginLoader.h47
-rw-r--r--plugins-alternative/PluginLoader/keybinding/pluginLoader.pro50
-rw-r--r--plugins-alternative/SessionLoader/KDE4/DebugEngineMacro.h28
-rw-r--r--plugins-alternative/SessionLoader/KDE4/Environment.h10
-rw-r--r--plugins-alternative/SessionLoader/KDE4/StructEnumDefinition.h1
-rw-r--r--plugins-alternative/SessionLoader/KDE4/Variable.h15
-rw-r--r--plugins-alternative/SessionLoader/KDE4/documentation.dox32
-rw-r--r--plugins-alternative/SessionLoader/KDE4/informations.xml26
-rw-r--r--plugins-alternative/SessionLoader/KDE4/plugin.json1
-rw-r--r--plugins-alternative/SessionLoader/KDE4/sessionLoader.cpp58
-rw-r--r--plugins-alternative/SessionLoader/KDE4/sessionLoader.h33
-rw-r--r--plugins-alternative/SessionLoader/KDE4/sessionLoader.pro15
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ar/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/de/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/el/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/en/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/es/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/fr/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/hi/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/hu/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/id/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/it/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ja/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ko/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/nl/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/no/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/pl/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ru/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/th/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/tr/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/zh/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/StructEnumDefinition.h1
-rw-r--r--plugins-alternative/Themes/Clean/documentation.dox28
-rw-r--r--plugins-alternative/Themes/Clean/factory.cpp65
-rw-r--r--plugins-alternative/Themes/Clean/factory.h39
-rw-r--r--plugins-alternative/Themes/Clean/informations.xml26
-rw-r--r--plugins-alternative/Themes/Clean/interface.cpp426
-rw-r--r--plugins-alternative/Themes/Clean/interface.h141
-rw-r--r--plugins-alternative/Themes/Clean/interface.pro46
-rw-r--r--plugins-alternative/Themes/Clean/interface.ui131
-rw-r--r--plugins-alternative/Themes/Clean/plugin.json1
-rw-r--r--plugins-alternative/Themes/Clean/resources.qrc5
-rw-r--r--plugins-alternative/Themes/Clean/resources/SystemTrayIcon/informations.pngbin0 -> 841 bytes
-rw-r--r--plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Caught_Unix.pngbin0 -> 1093 bytes
-rw-r--r--plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Caught_Windows.pngbin0 -> 623 bytes
-rw-r--r--plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Semiuncaught_Unix.pngbin0 -> 1296 bytes
-rw-r--r--plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Semiuncaught_Windows.pngbin0 -> 841 bytes
-rw-r--r--plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Uncaught_Unix.pngbin0 -> 754 bytes
-rw-r--r--plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Uncaught_Windows.pngbin0 -> 485 bytes
-rw-r--r--plugins-alternative/Themes/Clean/resources_unix.qrc7
-rw-r--r--plugins-alternative/Themes/Clean/resources_windows.qrc7
-rw-r--r--plugins-alternative/Themes/Teracopy/DebugEngineMacro.h28
-rw-r--r--plugins-alternative/Themes/Teracopy/Environment.h10
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ar/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/de/translation.ts93
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/el/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/en/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/es/translation.ts93
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/fr/translation.ts94
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/hi/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/hu/translation.ts93
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/id/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/it/translation.ts93
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ja/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ko/translation.ts93
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/nl/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/no/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/pl/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ru/translation.ts93
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/th/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/tr/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/zh/translation.ts89
-rw-r--r--plugins-alternative/Themes/Teracopy/StructEnumDefinition.h1
-rw-r--r--plugins-alternative/Themes/Teracopy/TransferModel.cpp528
-rw-r--r--plugins-alternative/Themes/Teracopy/TransferModel.h92
-rw-r--r--plugins-alternative/Themes/Teracopy/Variable.h15
-rw-r--r--plugins-alternative/Themes/Teracopy/documentation.dox28
-rw-r--r--plugins-alternative/Themes/Teracopy/factory.cpp70
-rw-r--r--plugins-alternative/Themes/Teracopy/factory.h42
-rw-r--r--plugins-alternative/Themes/Teracopy/informations.xml26
-rw-r--r--plugins-alternative/Themes/Teracopy/interface.cpp500
-rw-r--r--plugins-alternative/Themes/Teracopy/interface.h176
-rw-r--r--plugins-alternative/Themes/Teracopy/interface.pro50
-rw-r--r--plugins-alternative/Themes/Teracopy/interface.ui394
-rw-r--r--plugins-alternative/Themes/Teracopy/plugin.json1
-rw-r--r--plugins-alternative/Themes/Teracopy/resources.qrc12
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/add.pngbin0 -> 552 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/exit.pngbin0 -> 874 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/informations.pngbin0 -> 841 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/options.pngbin0 -> 624 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Caught_Unix.pngbin0 -> 1093 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Caught_Windows.pngbin0 -> 623 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Semiuncaught_Unix.pngbin0 -> 1296 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Semiuncaught_Windows.pngbin0 -> 841 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Uncaught_Unix.pngbin0 -> 754 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Uncaught_Windows.pngbin0 -> 485 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/checkbox.pngbin0 -> 619 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/main.pngbin0 -> 623 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/player_pause.pngbin0 -> 640 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/player_play.pngbin0 -> 673 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/resources_unix.qrc7
-rw-r--r--plugins-alternative/Themes/Teracopy/resources_windows.qrc7
-rw-r--r--plugins-alternative/Themes/Windows/DebugEngineMacro.h28
-rw-r--r--plugins-alternative/Themes/Windows/Environment.h10
-rw-r--r--plugins-alternative/Themes/Windows/Languages/ar/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/de/translation.ts124
-rw-r--r--plugins-alternative/Themes/Windows/Languages/el/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/en/translation.ts124
-rw-r--r--plugins-alternative/Themes/Windows/Languages/es/translation.ts124
-rw-r--r--plugins-alternative/Themes/Windows/Languages/fr/translation.ts124
-rw-r--r--plugins-alternative/Themes/Windows/Languages/hi/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/hu/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/id/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/it/translation.ts125
-rw-r--r--plugins-alternative/Themes/Windows/Languages/ja/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/ko/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/nl/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/no/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/pl/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/ru/translation.ts127
-rw-r--r--plugins-alternative/Themes/Windows/Languages/th/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/tr/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/Languages/zh/translation.ts121
-rw-r--r--plugins-alternative/Themes/Windows/StructEnumDefinition.h1
-rw-r--r--plugins-alternative/Themes/Windows/TransferModel.cpp286
-rw-r--r--plugins-alternative/Themes/Windows/TransferModel.h90
-rw-r--r--plugins-alternative/Themes/Windows/Variable.h15
-rw-r--r--plugins-alternative/Themes/Windows/documentation.dox28
-rw-r--r--plugins-alternative/Themes/Windows/factory.cpp74
-rw-r--r--plugins-alternative/Themes/Windows/factory.h45
-rw-r--r--plugins-alternative/Themes/Windows/informations.xml26
-rw-r--r--plugins-alternative/Themes/Windows/interface.cpp414
-rw-r--r--plugins-alternative/Themes/Windows/interface.h165
-rw-r--r--plugins-alternative/Themes/Windows/interface.pro48
-rw-r--r--plugins-alternative/Themes/Windows/interface.ui415
-rw-r--r--plugins-alternative/Themes/Windows/plugin.json1
-rw-r--r--plugins-alternative/Themes/Windows/resources.qrc10
-rw-r--r--plugins-alternative/Themes/Windows/resources/SystemTrayIcon/informations.pngbin0 -> 841 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Caught_Unix.pngbin0 -> 1093 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Caught_Windows.pngbin0 -> 623 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Semiuncaught_Unix.pngbin0 -> 1296 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Semiuncaught_Windows.pngbin0 -> 841 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Uncaught_Unix.pngbin0 -> 754 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Uncaught_Windows.pngbin0 -> 485 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/arrow-down.pngbin0 -> 598 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/arrow-up.pngbin0 -> 602 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/empty.pngbin0 -> 95 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/icon-top.pngbin0 -> 2437 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/icon-top.xcfbin0 -> 4398 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources/icon.pngbin0 -> 379 bytes
-rw-r--r--plugins-alternative/Themes/Windows/resources_unix.qrc7
-rw-r--r--plugins-alternative/Themes/Windows/resources_windows.qrc7
-rw-r--r--plugins/CopyEngine/Rsync/Rsync.pro2
-rw-r--r--plugins/CopyEngine/Rsync/informations.xml23
-rw-r--r--plugins/CopyEngine/Ultracopier/AvancedQFile.cpp208
-rw-r--r--plugins/CopyEngine/Ultracopier/AvancedQFile.h45
-rw-r--r--plugins/CopyEngine/Ultracopier/CompilerInfo.h1
-rw-r--r--plugins/CopyEngine/Ultracopier/CopyEngine-collision-and-error.cpp568
-rw-r--r--plugins/CopyEngine/Ultracopier/CopyEngine.cpp1253
-rw-r--r--plugins/CopyEngine/Ultracopier/CopyEngine.h382
-rw-r--r--plugins/CopyEngine/Ultracopier/CopyEngine.pro106
-rw-r--r--plugins/CopyEngine/Ultracopier/CopyEngineFactory.cpp700
-rw-r--r--plugins/CopyEngine/Ultracopier/CopyEngineFactory.h133
-rw-r--r--plugins/CopyEngine/Ultracopier/DebugDialog.cpp54
-rw-r--r--plugins/CopyEngine/Ultracopier/DebugDialog.h39
-rw-r--r--plugins/CopyEngine/Ultracopier/DebugEngineMacro.h28
-rw-r--r--plugins/CopyEngine/Ultracopier/DiskSpace.cpp53
-rw-r--r--plugins/CopyEngine/Ultracopier/DiskSpace.h29
-rw-r--r--plugins/CopyEngine/Ultracopier/DiskSpace.ui68
-rw-r--r--plugins/CopyEngine/Ultracopier/DriveManagement.cpp105
-rw-r--r--plugins/CopyEngine/Ultracopier/DriveManagement.h34
-rw-r--r--plugins/CopyEngine/Ultracopier/Environment.h11
-rw-r--r--plugins/CopyEngine/Ultracopier/FileErrorDialog.cpp163
-rw-r--r--plugins/CopyEngine/Ultracopier/FileErrorDialog.h51
-rw-r--r--plugins/CopyEngine/Ultracopier/FileExistsDialog.cpp244
-rw-r--r--plugins/CopyEngine/Ultracopier/FileExistsDialog.h60
-rw-r--r--plugins/CopyEngine/Ultracopier/FileIsSameDialog.cpp194
-rw-r--r--plugins/CopyEngine/Ultracopier/FileIsSameDialog.h57
-rw-r--r--plugins/CopyEngine/Ultracopier/FilterRules.cpp193
-rw-r--r--plugins/CopyEngine/Ultracopier/FilterRules.h46
-rw-r--r--plugins/CopyEngine/Ultracopier/FilterRules.ui162
-rw-r--r--plugins/CopyEngine/Ultracopier/Filters.cpp460
-rw-r--r--plugins/CopyEngine/Ultracopier/Filters.h45
-rw-r--r--plugins/CopyEngine/Ultracopier/Filters.ui194
-rw-r--r--plugins/CopyEngine/Ultracopier/FolderExistsDialog.cpp205
-rw-r--r--plugins/CopyEngine/Ultracopier/FolderExistsDialog.h57
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/ar/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/de/translation.ts1290
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/el/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/en/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/es/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/fr/translation.ts1294
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/hi/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/hu/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/id/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/it/translation.ts1299
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/ja/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/ko/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/nl/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/no/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/pl/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/pt/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/ru/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/th/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/tr/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/zh/translation.ts1289
-rw-r--r--plugins/CopyEngine/Ultracopier/ListThread.cpp2399
-rw-r--r--plugins/CopyEngine/Ultracopier/ListThread.h432
-rw-r--r--plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp64
-rw-r--r--plugins/CopyEngine/Ultracopier/MkPath.cpp517
-rw-r--r--plugins/CopyEngine/Ultracopier/MkPath.h106
-rw-r--r--plugins/CopyEngine/Ultracopier/ReadThread.cpp687
-rw-r--r--plugins/CopyEngine/Ultracopier/ReadThread.h147
-rw-r--r--plugins/CopyEngine/Ultracopier/RenamingRules.cpp85
-rw-r--r--plugins/CopyEngine/Ultracopier/RenamingRules.h34
-rw-r--r--plugins/CopyEngine/Ultracopier/RenamingRules.ui129
-rw-r--r--plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp688
-rw-r--r--plugins/CopyEngine/Ultracopier/ScanFileOrFolder.h108
-rw-r--r--plugins/CopyEngine/Ultracopier/StructEnumDefinition.h1
-rw-r--r--plugins/CopyEngine/Ultracopier/StructEnumDefinition_CopyEngine.h124
-rw-r--r--plugins/CopyEngine/Ultracopier/TransferThread.cpp2091
-rw-r--r--plugins/CopyEngine/Ultracopier/TransferThread.h288
-rw-r--r--plugins/CopyEngine/Ultracopier/Variable.h43
-rw-r--r--plugins/CopyEngine/Ultracopier/WriteThread.cpp968
-rw-r--r--plugins/CopyEngine/Ultracopier/WriteThread.h160
-rw-r--r--plugins/CopyEngine/Ultracopier/copyEngineOptions.ui762
-rw-r--r--plugins/CopyEngine/Ultracopier/copyEngineResources.qrc8
-rw-r--r--plugins/CopyEngine/Ultracopier/debugDialog.ui98
-rw-r--r--plugins/CopyEngine/Ultracopier/documentation.dox39
-rw-r--r--plugins/CopyEngine/Ultracopier/fileErrorDialog.ui264
-rw-r--r--plugins/CopyEngine/Ultracopier/fileExistsDialog.ui412
-rw-r--r--plugins/CopyEngine/Ultracopier/fileIsSameDialog.ui214
-rw-r--r--plugins/CopyEngine/Ultracopier/folderExistsDialog.ui309
-rw-r--r--plugins/CopyEngine/Ultracopier/informations-rsync.xml26
-rw-r--r--plugins/CopyEngine/Ultracopier/informations.xml26
-rw-r--r--plugins/CopyEngine/Ultracopier/plugin.json1
-rw-r--r--plugins/CopyEngine/Ultracopier/resources/add.pngbin0 -> 552 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier/resources/edit.pngbin0 -> 623 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier/resources/filter.pngbin0 -> 685 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier/resources/remove.pngbin0 -> 683 bytes
-rw-r--r--plugins/Languages/ar/flag.pngbin0 -> 585 bytes
-rw-r--r--plugins/Languages/ar/informations.xml32
-rw-r--r--plugins/Languages/ar/translation.ts1256
-rw-r--r--plugins/Languages/de/flag.pngbin0 -> 712 bytes
-rw-r--r--plugins/Languages/de/informations.xml32
-rw-r--r--plugins/Languages/de/translation.ts1277
-rw-r--r--plugins/Languages/el/flag.pngbin0 -> 726 bytes
-rw-r--r--plugins/Languages/el/informations.xml32
-rw-r--r--plugins/Languages/el/translation.ts1256
-rw-r--r--plugins/Languages/es/flag.pngbin0 -> 726 bytes
-rw-r--r--plugins/Languages/es/informations.xml32
-rw-r--r--plugins/Languages/es/translation.ts1266
-rw-r--r--plugins/Languages/fr/flag.pngbin0 -> 699 bytes
-rw-r--r--plugins/Languages/fr/informations.xml35
-rw-r--r--plugins/Languages/fr/translation.ts1265
-rw-r--r--plugins/Languages/hi/flag.pngbin0 -> 728 bytes
-rw-r--r--plugins/Languages/hi/informations.xml32
-rw-r--r--plugins/Languages/hi/translation.ts1256
-rw-r--r--plugins/Languages/hu/flag.pngbin0 -> 810 bytes
-rw-r--r--plugins/Languages/hu/informations.xml29
-rw-r--r--plugins/Languages/hu/translation.ts1263
-rw-r--r--plugins/Languages/id/flag.pngbin0 -> 691 bytes
-rw-r--r--plugins/Languages/id/informations.xml32
-rw-r--r--plugins/Languages/id/translation.ts1256
-rw-r--r--plugins/Languages/it/flag.pngbin0 -> 675 bytes
-rw-r--r--plugins/Languages/it/informations.xml32
-rw-r--r--plugins/Languages/it/translation.ts1270
-rw-r--r--plugins/Languages/ja/flag.pngbin0 -> 595 bytes
-rw-r--r--plugins/Languages/ja/informations.xml33
-rw-r--r--plugins/Languages/ja/translation.ts1256
-rw-r--r--plugins/Languages/ko/flag.pngbin0 -> 650 bytes
-rw-r--r--plugins/Languages/ko/informations.xml30
-rw-r--r--plugins/Languages/ko/translation.ts1260
-rw-r--r--plugins/Languages/nl/flag.pngbin0 -> 709 bytes
-rw-r--r--plugins/Languages/nl/informations.xml32
-rw-r--r--plugins/Languages/nl/translation.ts1256
-rw-r--r--plugins/Languages/no/flag.pngbin0 -> 715 bytes
-rw-r--r--plugins/Languages/no/informations.xml32
-rw-r--r--plugins/Languages/no/translation.ts1256
-rw-r--r--plugins/Languages/pl/flag.pngbin0 -> 586 bytes
-rw-r--r--plugins/Languages/pl/informations.xml32
-rw-r--r--plugins/Languages/pl/translation.ts1256
-rw-r--r--plugins/Languages/pt/flag.pngbin0 -> 686 bytes
-rw-r--r--plugins/Languages/pt/informations.xml32
-rw-r--r--plugins/Languages/pt/translation.ts1256
-rw-r--r--plugins/Languages/ru/flag.pngbin0 -> 721 bytes
-rw-r--r--plugins/Languages/ru/informations.xml32
-rw-r--r--plugins/Languages/ru/translation.ts1260
-rw-r--r--plugins/Languages/th/flag.pngbin0 -> 731 bytes
-rw-r--r--plugins/Languages/th/informations.xml32
-rw-r--r--plugins/Languages/th/translation.ts1256
-rw-r--r--plugins/Languages/tr/flag.pngbin0 -> 634 bytes
-rw-r--r--plugins/Languages/tr/informations.xml32
-rw-r--r--plugins/Languages/tr/translation.ts1256
-rw-r--r--plugins/Languages/zh/flag.pngbin0 -> 538 bytes
-rw-r--r--plugins/Languages/zh/informations.xml35
-rw-r--r--plugins/Languages/zh/translation.ts1256
-rw-r--r--plugins/Languages/zh_TW/flag.pngbin0 -> 616 bytes
-rw-r--r--plugins/Languages/zh_TW/informations.xml32
-rw-r--r--plugins/Languages/zh_TW/translation.ts1256
-rw-r--r--plugins/Listener/catchcopy-v0002/DebugEngineMacro.h28
-rw-r--r--plugins/Listener/catchcopy-v0002/Environment.h10
-rw-r--r--plugins/Listener/catchcopy-v0002/StructEnumDefinition.h1
-rw-r--r--plugins/Listener/catchcopy-v0002/Variable.h15
-rw-r--r--plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.cpp379
-rw-r--r--plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.h113
-rw-r--r--plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.cpp38
-rw-r--r--plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.h31
-rw-r--r--plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.cpp740
-rw-r--r--plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.h144
-rw-r--r--plugins/Listener/catchcopy-v0002/catchcopy-api-0002/VariablesCatchcopy.h13
-rw-r--r--plugins/Listener/catchcopy-v0002/documentation.dox32
-rw-r--r--plugins/Listener/catchcopy-v0002/informations.xml26
-rw-r--r--plugins/Listener/catchcopy-v0002/listener.cpp123
-rw-r--r--plugins/Listener/catchcopy-v0002/listener.h59
-rw-r--r--plugins/Listener/catchcopy-v0002/listener.pro26
-rw-r--r--plugins/Listener/catchcopy-v0002/plugin.json1
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/DebugEngineMacro.h28
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Environment.h10
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/ar/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/de/translation.ts18
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/el/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/en/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/es/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/fr/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/hi/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/hu/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/id/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/it/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/ja/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/ko/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/nl/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/no/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/pl/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/pt/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/ru/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/th/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/tr/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/zh/translation.ts17
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/OptionsWidget.cpp39
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/OptionsWidget.h30
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/OptionsWidget.ui48
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/PlatformMacro.h1
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/StructEnumDefinition.h1
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Variable.h16
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/documentation.dox33
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/informations.xml26
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/plugin.json1
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/pluginLoader.cpp450
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/pluginLoader.h64
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/pluginLoader.pro53
-rw-r--r--plugins/SessionLoader/Windows/DebugEngineMacro.h28
-rw-r--r--plugins/SessionLoader/Windows/Environment.h10
-rw-r--r--plugins/SessionLoader/Windows/StructEnumDefinition.h1
-rw-r--r--plugins/SessionLoader/Windows/Variable.h15
-rw-r--r--plugins/SessionLoader/Windows/documentation.dox32
-rw-r--r--plugins/SessionLoader/Windows/informations.xml26
-rw-r--r--plugins/SessionLoader/Windows/plugin.json1
-rw-r--r--plugins/SessionLoader/Windows/sessionLoader.cpp80
-rw-r--r--plugins/SessionLoader/Windows/sessionLoader.h33
-rw-r--r--plugins/SessionLoader/Windows/sessionLoader.pro16
-rw-r--r--plugins/Themes/Oxygen/DebugEngineMacro.h28
-rw-r--r--plugins/Themes/Oxygen/Environment.h10
-rw-r--r--plugins/Themes/Oxygen/Languages/ar/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/de/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/el/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/en/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/es/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/fr/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/hi/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/hu/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/id/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/it/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/ja/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/ko/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/nl/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/no/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/pl/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/pt/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/ru/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/th/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/tr/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/Languages/zh/translation.ts341
-rw-r--r--plugins/Themes/Oxygen/StructEnumDefinition.h1
-rw-r--r--plugins/Themes/Oxygen/ThemesFactory.cpp481
-rw-r--r--plugins/Themes/Oxygen/ThemesFactory.h86
-rw-r--r--plugins/Themes/Oxygen/TransferModel.cpp588
-rw-r--r--plugins/Themes/Oxygen/TransferModel.h96
-rw-r--r--plugins/Themes/Oxygen/Variable.h18
-rw-r--r--plugins/Themes/Oxygen/documentation.dox31
-rw-r--r--plugins/Themes/Oxygen/informations.xml26
-rw-r--r--plugins/Themes/Oxygen/interface.cpp1497
-rw-r--r--plugins/Themes/Oxygen/interface.h222
-rw-r--r--plugins/Themes/Oxygen/interface.pro8
-rw-r--r--plugins/Themes/Oxygen/interface.ui848
-rw-r--r--plugins/Themes/Oxygen/interfaceInclude.pri51
-rw-r--r--plugins/Themes/Oxygen/interfaceResources.qrc22
-rw-r--r--plugins/Themes/Oxygen/interfaceResources_unix.qrc7
-rw-r--r--plugins/Themes/Oxygen/interfaceResources_windows.qrc7
-rw-r--r--plugins/Themes/Oxygen/options.ui290
-rw-r--r--plugins/Themes/Oxygen/plugin.json1
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/add.pngbin0 -> 552 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/exit.pngbin0 -> 874 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/informations.pngbin0 -> 841 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/options.pngbin0 -> 624 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Caught_Unix.pngbin0 -> 1093 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Caught_Windows.pngbin0 -> 623 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Semiuncaught_Unix.pngbin0 -> 1174 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Semiuncaught_Windows.pngbin0 -> 677 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Uncaught_Unix.pngbin0 -> 665 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Uncaught_Windows.pngbin0 -> 439 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/add.pngbin0 -> 552 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/cancel.pngbin0 -> 874 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/export-transfer-list.pngbin0 -> 455 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/import-transfer-list.pngbin0 -> 454 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/main.pngbin0 -> 623 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/moveDown.pngbin0 -> 466 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/moveUp.pngbin0 -> 466 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/player_end.pngbin0 -> 696 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/player_pause.pngbin0 -> 640 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/player_play.pngbin0 -> 673 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/putOnBottom.pngbin0 -> 676 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/putOnTop.pngbin0 -> 681 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/remove.pngbin0 -> 683 bytes
-rw-r--r--plugins/Themes/Oxygen/resources/search.pngbin0 -> 781 bytes
-rw-r--r--plugins/Themes/Oxygen/themesOptions.ui426
-rw-r--r--plugins/Themes/Supercopier/informations.xml26
-rw-r--r--plugins/Themes/Supercopier/interface.pro10
-rw-r--r--plugins/Themes/Supercopier/interfaceResources.qrc24
-rw-r--r--plugins/Themes/Supercopier/interfaceResources_unix.qrc7
-rw-r--r--plugins/Themes/Supercopier/interfaceResources_windows.qrc7
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/add.pngbin0 -> 246 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/exit.pngbin0 -> 545 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/informations.pngbin0 -> 281 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/options.pngbin0 -> 275 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Caught_Unix.pngbin0 -> 147 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Caught_Windows.pngbin0 -> 148 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Semiuncaught_Unix.pngbin0 -> 147 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Semiuncaught_Windows.pngbin0 -> 148 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Uncaught_Unix.pngbin0 -> 141 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Uncaught_Windows.pngbin0 -> 139 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/add.pngbin0 -> 240 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/cancel.pngbin0 -> 284 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/export-transfer-list.pngbin0 -> 264 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/import-transfer-list.pngbin0 -> 316 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/main.pngbin0 -> 148 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/moveDown.pngbin0 -> 191 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/moveUp.pngbin0 -> 190 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/player_end.pngbin0 -> 226 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/player_pause.pngbin0 -> 207 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/player_play.pngbin0 -> 208 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/progressbarleft.pngbin0 -> 133 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/progressbarright.pngbin0 -> 132 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/putOnBottom.pngbin0 -> 206 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/putOnTop.pngbin0 -> 208 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/remove.pngbin0 -> 254 bytes
-rw-r--r--plugins/Themes/Supercopier/resources/search.pngbin0 -> 237 bytes
-rw-r--r--plugins/static-plugins-oxygen.qrc6
-rw-r--r--plugins/static-plugins-windows.qrc6
-rw-r--r--plugins/static-plugins.qrc12
-rw-r--r--resources/Languages/en/flag.pngbin0 -> 741 bytes
-rw-r--r--resources/Languages/en/informations.xml29
-rw-r--r--resources/Languages/en/translation.ts1256
-rw-r--r--resources/bug-128x128.pngbin0 -> 6042 bytes
-rw-r--r--resources/img-src/application-exit.svgzbin0 -> 6400 bytes
-rw-r--r--resources/img-src/applications-development.svgzbin0 -> 7861 bytes
-rw-r--r--resources/img-src/arrow-down-double.svgzbin0 -> 5704 bytes
-rw-r--r--resources/img-src/arrow-down.svgzbin0 -> 5072 bytes
-rw-r--r--resources/img-src/arrow-up-double.svgzbin0 -> 5698 bytes
-rw-r--r--resources/img-src/arrow-up.svgzbin0 -> 5071 bytes
-rw-r--r--resources/img-src/checkbox.svgzbin0 -> 3936 bytes
-rw-r--r--resources/img-src/document-encrypt.svgzbin0 -> 20939 bytes
-rw-r--r--resources/img-src/document-preview.svgzbin0 -> 19169 bytes
-rw-r--r--resources/img-src/document-save_16.svgzbin0 -> 4954 bytes
-rw-r--r--resources/img-src/document-save_22.svgzbin0 -> 30302 bytes
-rw-r--r--resources/img-src/drive-removable-media-usb.svgzbin0 -> 4247 bytes
-rw-r--r--resources/img-src/help-about.svgzbin0 -> 13549 bytes
-rw-r--r--resources/img-src/kbugbuster.svgzbin0 -> 20091 bytes
-rw-r--r--resources/img-src/list-add.svgzbin0 -> 4165 bytes
-rw-r--r--resources/img-src/media-playback-pause.svgzbin0 -> 2054 bytes
-rw-r--r--resources/img-src/media-playback-start.svgzbin0 -> 1916 bytes
-rw-r--r--resources/img-src/media-skip-forward.svgzbin0 -> 2065 bytes
-rw-r--r--resources/img-src/process-stop.svgzbin0 -> 4174 bytes
-rw-r--r--resources/img-src/system-shutdown.svgzbin0 -> 6070 bytes
-rw-r--r--resources/img-src/text-formatting.svg11924
-rw-r--r--resources/moveDown.pngbin0 -> 466 bytes
-rw-r--r--resources/moveUp.pngbin0 -> 466 bytes
-rw-r--r--resources/none-128x128.pngbin0 -> 4942 bytes
-rw-r--r--resources/options.pngbin0 -> 624 bytes
-rw-r--r--resources/qt.conf2
-rw-r--r--resources/resources-windows-qt-plugin.qrc5
-rw-r--r--resources/resources-windows.rc36
-rw-r--r--resources/supercopier-128x128.pngbin0 -> 5041 bytes
-rw-r--r--resources/supercopier-16x16.pngbin0 -> 148 bytes
-rw-r--r--resources/supercopier-all-in-one.icobin0 -> 786 bytes
-rw-r--r--resources/supercopier.icnsbin0 -> 32304 bytes
-rw-r--r--resources/supercopier.icobin0 -> 1078 bytes
-rw-r--r--resources/systray_Caught_Unix.pngbin0 -> 1093 bytes
-rw-r--r--resources/systray_Caught_Windows.pngbin0 -> 623 bytes
-rw-r--r--resources/systray_Semiuncaught_Unix.pngbin0 -> 1296 bytes
-rw-r--r--resources/systray_Semiuncaught_Windows.pngbin0 -> 841 bytes
-rw-r--r--resources/systray_Uncaught_Unix.pngbin0 -> 754 bytes
-rw-r--r--resources/systray_Uncaught_Windows.pngbin0 -> 485 bytes
-rw-r--r--resources/ultracopier-128x128.pngbin0 -> 4928 bytes
-rw-r--r--resources/ultracopier-16x16.pngbin0 -> 685 bytes
-rw-r--r--resources/ultracopier-all-in-one.icobin0 -> 2594 bytes
-rw-r--r--resources/ultracopier-resources.qrc15
-rw-r--r--resources/ultracopier-resources_unix.qrc7
-rw-r--r--resources/ultracopier-resources_windows.qrc7
-rw-r--r--resources/ultracopier.desktop20
-rw-r--r--resources/ultracopier.icnsbin0 -> 36804 bytes
-rw-r--r--resources/ultracopier.icobin0 -> 34118 bytes
-rw-r--r--resources/warning.pngbin0 -> 511 bytes
-rw-r--r--tools/doc/Doxyfile1790
-rw-r--r--tools/doc/Doxyfile-plugin-template1789
-rw-r--r--tools/doc/footer.html2
-rw-r--r--tools/doc/ultracopier-logo.pngbin0 -> 3834 bytes
-rw-r--r--tools/scripts/UltraCP28
-rw-r--r--tools/scripts/UltraMV28
-rwxr-xr-xtools/to-pack/1-pre-send.sh55
-rwxr-xr-xtools/to-pack/1-update-translation.sh37
-rwxr-xr-xtools/to-pack/2-compil-wine32.sh39
-rwxr-xr-xtools/to-pack/2-compil-wine64.sh38
-rwxr-xr-xtools/to-pack/2-send-sources.sh12
-rwxr-xr-xtools/to-pack/3-compil-mac.sh37
-rwxr-xr-xtools/to-pack/4-clean-all.sh35
-rwxr-xr-xtools/to-pack/4-upload.sh38
-rwxr-xr-xtools/to-pack/5-upload.sh35
-rwxr-xr-xtools/to-pack/6-sendmail.sh35
-rwxr-xr-xtools/to-pack/data/windows/install-static.nsi162
-rwxr-xr-xtools/to-pack/data/windows/install.nsi162
-rw-r--r--tools/to-pack/data/windows/resources-windows-ultracopier-plugins.rc27
-rwxr-xr-xtools/to-pack/data/windows/ultracopier.icobin0 -> 34118 bytes
-rwxr-xr-xtools/to-pack/grouped.sh12
-rwxr-xr-xtools/to-pack/old-3-compil-linux.sh37
-rwxr-xr-xtools/to-pack/sub-script/assemble-source-version.sh129
-rw-r--r--tools/to-pack/sub-script/assemble-windows-version-32.sh153
-rw-r--r--tools/to-pack/sub-script/assemble-windows-version-64.sh149
-rw-r--r--tools/to-pack/sub-script/assemble.sh219
-rwxr-xr-xtools/to-pack/sub-script/clean-all.sh16
-rw-r--r--tools/to-pack/sub-script/compil-windows32.sh211
-rw-r--r--tools/to-pack/sub-script/compil-windows64.sh200
-rw-r--r--tools/to-pack/sub-script/compil.sh429
-rw-r--r--tools/to-pack/sub-script/doc.sh119
-rw-r--r--tools/to-pack/sub-script/linux.sh275
-rw-r--r--tools/to-pack/sub-script/mac.sh275
-rw-r--r--tools/to-pack/sub-script/sendmail.sh17
-rw-r--r--tools/to-pack/sub-script/test.sh40
-rw-r--r--tools/to-pack/sub-script/translation-local.sh30
-rwxr-xr-xtools/to-pack/sub-script/translation.sh53
-rw-r--r--tools/to-pack/sub-script/upload-local.sh33
-rw-r--r--tools/to-pack/sub-script/upload.sh80
-rwxr-xr-xtools/to-pack/test.sh55
-rw-r--r--tools/unit-tester/copyEngine.cpp1386
-rw-r--r--tools/unit-tester/copyEngine.h263
-rw-r--r--tools/unit-tester/copyEngineUnitTester.cpp104
-rw-r--r--tools/unit-tester/copyEngineUnitTester.h46
-rw-r--r--tools/unit-tester/main.cpp8
-rw-r--r--tools/unit-tester/unit-tester.pro42
-rw-r--r--ultracopier.dox39
-rw-r--r--ultracopier.pro137
700 files changed, 136115 insertions, 0 deletions
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..818433e
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/CliParser.cpp b/CliParser.cpp
new file mode 100644
index 0000000..7d375ac
--- /dev/null
+++ b/CliParser.cpp
@@ -0,0 +1,197 @@
+/** \file CliParser.cpp
+\brief To group into one class, the CLI parsing
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "CliParser.h"
+#include "cpp11addition.h"
+#include "Core.h"
+
+#include <QDebug>
+
+CliParser::CliParser(QObject *parent) :
+ QObject(parent)
+{
+ //this->core=core;
+}
+
+/** \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 std::vector<std::string> &ultracopierArguments,const bool &external,const bool &onlyCheck)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"ultracopierArguments: "+stringimplode(ultracopierArguments,';'));
+ if(ultracopierArguments.size()==1)
+ {
+ if(external)
+ {
+ //if(!core->startNewTransferOneUniqueCopyEngine())
+ {
+ #ifdef Q_OS_WIN32
+ QString message(tr("Ultracopier is already running, right click on its system tray icon (near the clock) to use it or just copy and paste"));
+ #else
+ QString message(tr("Ultracopier is already running, view all notification area icons (near the clock), right click on its system tray icon to use it or just copy and paste"));
+ #endif
+
+ QMessageBox::warning(NULL,tr("Warning"),message);
+ showSystrayMessage(message.toStdString());
+ }
+ }
+ // else do nothing, is normal starting without arguements
+ return;
+ }
+ else if(ultracopierArguments.size()==2)
+ {
+ if(ultracopierArguments.back()=="quit")
+ {
+ if(onlyCheck)
+ return;
+ QCoreApplication::exit();
+ return;
+ }
+ else if(ultracopierArguments.back()=="--help")
+ {
+ showHelp(false);
+ return;
+ }
+ else if(ultracopierArguments.back()=="--options")
+ {
+ emit showOptions();
+ return;
+ }
+ else if(stringEndsWith(ultracopierArguments.back(),".urc"))
+ {
+ tryLoadPlugin(ultracopierArguments.back());
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Command line not understand");
+ showHelp();
+ return;
+ }
+ else if(ultracopierArguments.size()==3)
+ {
+ if(ultracopierArguments.at(1)=="Transfer-list")
+ {
+ if(onlyCheck)
+ return;
+ QFile transferFile(QString::fromStdString(ultracopierArguments.back()));
+ if(transferFile.open(QIODevice::ReadOnly))
+ {
+ QString content;
+ QByteArray data=transferFile.readLine(64);
+ if(data.size()<=0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Problem reading file, or file size is 0");
+ QMessageBox::warning(NULL,tr("Warning"),tr("Problem reading file, or file size is 0"));
+ transferFile.close();
+ return;
+ }
+ content=QString::fromUtf8(data);
+ std::vector<std::string> transferListArguments=stringsplit(content.toStdString(),';');
+ transferListArguments[3].erase(std::remove(transferListArguments[3].begin(), transferListArguments[3].end(),'\n'),transferListArguments[3].end());
+ if(transferListArguments.at(0)!="Ultracopier" ||
+ transferListArguments.at(1)!="Transfer-list" ||
+ (transferListArguments.at(2)!="Transfer" && transferListArguments.at(2)!="Copy" && transferListArguments.at(2)!="Move")
+ )
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"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.at(3),transferListArguments.at(2),ultracopierArguments.back());
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to open the transfer list file: "+transferFile.errorString().toStdString());
+ QMessageBox::warning(NULL,tr("Warning"),tr("Unable to open the transfer list file"));
+ return;
+ }
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Command line not understand");
+ showHelp();
+ return;
+ }
+ else if(ultracopierArguments.size()>3)
+ {
+ if(ultracopierArguments.at(1)=="Copy" || ultracopierArguments.at(1)=="cp")
+ {
+ if(onlyCheck)
+ return;
+ std::vector<std::string> transferList=ultracopierArguments;
+ transferList.erase(transferList.cbegin());
+ transferList.erase(transferList.cbegin());
+ if(transferList.back()=="?")
+ {
+ transferList.erase(transferList.cbegin());
+ emit newCopyWithoutDestination(transferList);
+ }
+ else
+ {
+ std::string destination=transferList.back();
+ transferList.erase(transferList.cbegin());
+ emit newCopy(transferList,destination);
+ }
+ return;
+ }
+ else if(ultracopierArguments.at(1)=="Move" || ultracopierArguments.at(1)=="mv")
+ {
+ if(onlyCheck)
+ return;
+ std::vector<std::string> transferList=ultracopierArguments;
+ transferList.erase(transferList.cbegin());
+ transferList.erase(transferList.cbegin());
+ if(transferList.back()=="?")
+ {
+ transferList.erase(transferList.cbegin());
+ emit newMoveWithoutDestination(transferList);
+ }
+ else
+ {
+ std::string destination=transferList.back();
+ transferList.erase(transferList.cbegin());
+ emit newMove(transferList,destination);
+ }
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Command line not understand");
+ showHelp();
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"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 possible are:");
+ qDebug() << "--help : "+tr("To display this help");
+ qDebug() << "--options : "+tr("To display the options");
+ qDebug() << "quit : "+tr("To quit the other instances (if running)");
+ qDebug() << "Transfer-list [transfer list file] : "+tr("Open transfer list");
+ qDebug() << "cp [source [source2]] [destination] : "+tr("To copy sources to destination, separated by space. If destination is \"?\", ultracopier will ask the user");
+ qDebug() << "mv [source [source2]] [destination] : "+tr("To move sources to destination, separated by space. If destination is \"?\", ultracopier will ask the user");
+
+ QString message;
+ if(incorrectArguments)
+ message+="<b>"+tr("Command not valid")+"</b><br />\n";
+ message+=+"<b></b>"+tr("The arguments possible are:")+"\n<ul>";
+ message+="<li><b>--help</b> : "+tr("To display this help")+"</li>\n";
+ message+="<li><b>--options</b> : "+tr("To display the options")+"</li>\n";
+ message+="<li><b>quit</b> : "+tr("To quit the other instances (if running)")+"</li>\n";
+ message+="<li><b>Transfer-list [transfer list file]</b> : "+tr("Open transfer list")+"</li>\n";
+ message+="<li><b>cp [source [source2]] [destination]</b> : "+tr("To copy sources to destination, separated by space. If destination is \"?\", ultracopier will ask the user")+"</li>\n";
+ message+="<li><b>mv [source [source2]] [destination]</b> : "+tr("To move sources to destination, separated by space. If destination is \"?\", ultracopier will ask the user")+"</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
new file mode 100644
index 0000000..edcf115
--- /dev/null
+++ b/CliParser.h
@@ -0,0 +1,55 @@
+/** \file CliParser.h
+\brief To group into one class, the CLI parsing
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef CLIPARSER_H
+#define CLIPARSER_H
+
+#include <QObject>
+#include <QMessageBox>
+#include <QCoreApplication>
+#include <QFile>
+
+#include "Environment.h"
+
+class Core;
+/** \brief class to parse all command line options */
+class CliParser : public QObject
+{
+ Q_OBJECT
+public:
+ explicit CliParser(/*Core *core,*/QObject *parent = 0);
+public slots:
+ /** \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 cli(const std::vector<std::string> &ultracopierArguments,const bool &external,const bool &onlyCheck);
+signals:
+ /** new copy without destination have been pased by the CLI */
+ void newCopyWithoutDestination(std::vector<std::string> sources) const;
+ /** new copy with destination have been pased by the CLI */
+ void newCopy(std::vector<std::string> sources,std::string destination) const;
+ /** new move without destination have been pased by the CLI */
+ void newMoveWithoutDestination(std::vector<std::string> sources) const;
+ /** new move with destination have been pased by the CLI */
+ void newMove(std::vector<std::string> sources,std::string destination) const;
+ /** new transfer list pased by the CLI */
+ void newTransferList(std::string engine,std::string mode,std::string file) const;
+
+ void tryLoadPlugin(const std::string &file) const;
+ /// \brief Show the help option
+ void showOptions() const;
+
+ /// \brief For show a message linked to the systray icon
+ void showSystrayMessage(const std::string& text);
+private:
+ /** \brief show the help
+ *\param incorrectArguments if the help is call because the arguments are wrong */
+ void showHelp(const bool &incorrectArguments=true);
+
+ //Core *core;
+};
+
+#endif // CLIPARSER_H
diff --git a/CompilerInfo.h b/CompilerInfo.h
new file mode 100644
index 0000000..78ba379
--- /dev/null
+++ b/CompilerInfo.h
@@ -0,0 +1,15 @@
+/** \file CompilerInfo.h
+\brief Define the compiler info
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+/// \def COMPILERINFO the string to identify the compiler
+#if defined(Q_CC_GNU)
+ #define COMPILERINFO std::string("GCC ")+std::to_string(__GNUC__)+"."+std::to_string(__GNUC_MINOR__)+"."+std::to_string(__GNUC_PATCHLEVEL__)+" build: "+__DATE__+" "+__TIME__
+#else
+ #if defined(__DATE__) && defined(__TIME__)
+ #define COMPILERINFO std::string("Unknown compiler: ")+__DATE__+" "+__TIME__
+ #else
+ #define COMPILERINFO std::string("Unknown compiler")
+ #endif
+#endif
diff --git a/CopyEngineManager.cpp b/CopyEngineManager.cpp
new file mode 100644
index 0000000..a3934b3
--- /dev/null
+++ b/CopyEngineManager.cpp
@@ -0,0 +1,385 @@
+/** \file CopyEngineManager.cpp
+\brief Define the copy engine manager
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QMessageBox>
+
+#include "CopyEngineManager.h"
+#include "LanguagesManager.h"
+#include "cpp11addition.h"
+
+#ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#include "plugins/CopyEngine/Ultracopier/CopyEngineFactory.h"
+#endif
+
+CopyEngineManager::CopyEngineManager(OptionDialog *optionDialog)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->optionDialog=optionDialog;
+ //setup the ui layout
+ PluginsManager::pluginsManager->lockPluginListEdition();
+ connect(this,&CopyEngineManager::previouslyPluginAdded, this,&CopyEngineManager::onePluginAdded,Qt::QueuedConnection);
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginAdded, this,&CopyEngineManager::onePluginAdded,Qt::QueuedConnection);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginWillBeRemoved, this,&CopyEngineManager::onePluginWillBeRemoved,Qt::DirectConnection);
+ #endif
+ connect(PluginsManager::pluginsManager,&PluginsManager::pluginListingIsfinish, this,&CopyEngineManager::allPluginIsloaded,Qt::QueuedConnection);
+ std::vector<PluginsAvailable> list=PluginsManager::pluginsManager->getPluginsByCategory(PluginType_CopyEngine);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
+ PluginsManager::pluginsManager->unlockPluginListEdition();
+ //load the options
+ isConnected=false;
+}
+
+void CopyEngineManager::onePluginAdded(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_CopyEngine)
+ return;
+ //setFileName
+ std::string pluginPath=plugin.path+PluginsManager::getResolvedPluginName("copyEngine");
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ /*more IO
+ if(!QFile(pluginPath).exists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The plugin binary is missing: "+pluginPath);
+ return;
+ }*/
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+pluginPath);
+ //search into loaded session
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).pluginPath==pluginPath)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Engine already found!");
+ return;
+ }
+ index++;
+ }
+ CopyEnginePlugin newItem;
+ newItem.pluginPath=pluginPath;
+ newItem.path=plugin.path;
+ newItem.name=plugin.name;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ newItem.pointer=new QPluginLoader(QString::fromStdString(newItem.pluginPath));
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ QObjectList objectList=QPluginLoader::staticInstances();
+ index=0;
+ QObject *pluginObject;
+ while(index<objectList.size())
+ {
+ pluginObject=objectList.at(index);
+ newItem.factory = qobject_cast<PluginInterface_CopyEngineFactory *>(pluginObject);
+ if(newItem.factory!=NULL)
+ break;
+ index++;
+ }
+ if(index==objectList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"static copy engine not found");
+ return;
+ }
+ #else
+ QObject *pluginObject = newItem.pointer->instance();
+ if(pluginObject==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to load the plugin: "+newItem.pointer->errorString().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to load the plugin for "+newItem.pluginPath);
+ newItem.pointer->unload();
+ return;
+ }
+ newItem.factory = qobject_cast<PluginInterface_CopyEngineFactory *>(pluginObject);
+ //check if found
+ index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).factory==newItem.factory)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Plugin already found");
+ newItem.pointer->unload();
+ return;
+ }
+ index++;
+ }
+ if(newItem.factory==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to cast the plugin: "+newItem.pointer->errorString().toStdString());
+ newItem.pointer->unload();
+ return;
+ }
+ #endif
+ #else
+ newItem.factory=new CopyEngineFactory();
+ #endif
+
+ #ifdef ULTRACOPIER_DEBUG
+ connect(newItem.factory,&PluginInterface_CopyEngineFactory::debugInformation,this,&CopyEngineManager::debugInformation,Qt::QueuedConnection);
+ #endif // ULTRACOPIER_DEBUG
+ newItem.options=new LocalPluginOptions("CopyEngine-"+newItem.name);
+ newItem.factory->setResources(newItem.options,plugin.writablePath,plugin.path,&FacilityEngine::facilityEngine,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ newItem.optionsWidget=newItem.factory->options();
+ newItem.supportedProtocolsForTheSource=newItem.factory->supportedProtocolsForTheSource();
+ newItem.supportedProtocolsForTheDestination=newItem.factory->supportedProtocolsForTheDestination();
+ newItem.canDoOnlyCopy=newItem.factory->canDoOnlyCopy();
+ newItem.type=newItem.factory->getCopyType();
+ newItem.transferListOperation=newItem.factory->getTransferListOperation();
+ optionDialog->addPluginOptionWidget(PluginType_CopyEngine,newItem.name,newItem.optionsWidget);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"plugin: "+newItem.name+" loaded, send options");
+ //emit newCopyEngineOptions(plugin.path,newItem.name,newItem.optionsWidget);
+ pluginList.push_back(newItem);
+ connect(LanguagesManager::languagesManager,&LanguagesManager::newLanguageLoaded,newItem.factory,&PluginInterface_CopyEngineFactory::newLanguageLoaded);
+ if(PluginsManager::pluginsManager->allPluginHaveBeenLoaded())
+ allPluginIsloaded();
+ if(isConnected)
+ emit addCopyEngine(newItem.name,newItem.canDoOnlyCopy);
+}
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+void CopyEngineManager::onePluginWillBeRemoved(const PluginsAvailable &plugin)
+{
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).path==plugin.path)
+ {
+ if(pluginList.at(index).intances.size()<=0)
+ {
+ emit removeCopyEngine(pluginList.at(index).name);
+ pluginList.erase(pluginList.begin()+index);
+ allPluginIsloaded();
+ return;
+ }
+ }
+ index++;
+ }
+}
+
+void CopyEngineManager::onePluginWillBeUnloaded(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_CopyEngine)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).path==plugin.path)
+ {
+ delete pluginList.at(index).options;
+ delete pluginList.at(index).factory;
+ pluginList.at(index).pointer->unload();
+ return;
+ }
+ index++;
+ }
+}
+#endif
+
+CopyEngineManager::returnCopyEngine CopyEngineManager::getCopyEngine(const Ultracopier::CopyMode &mode,
+ const std::vector<std::string> &protocolsUsedForTheSources,const std::string &protocolsUsedForTheDestination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, pluginList.size(): "+std::to_string(pluginList.size())+", mode: "+std::to_string((int)mode)+", and particular protocol");
+ returnCopyEngine temp;
+ unsigned int index=0;
+ bool isTheGoodEngine=false;
+ while(index<pluginList.size())
+ {
+ const CopyEnginePlugin &copyEnginePlugin=pluginList.at(index);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"pluginList.at("+std::to_string(index)+").name: "+copyEnginePlugin.name);
+ isTheGoodEngine=false;
+ if(mode!=Ultracopier::Move || !copyEnginePlugin.canDoOnlyCopy)
+ {
+ if(protocolsUsedForTheSources.size()==0)
+ isTheGoodEngine=true;
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"copyEnginePlugin.supportedProtocolsForTheDestination: "+stringimplode(copyEnginePlugin.supportedProtocolsForTheDestination,";"));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"protocolsUsedForTheDestination: "+protocolsUsedForTheDestination);
+ if(protocolsUsedForTheDestination.empty() || vectorcontainsAtLeastOne(copyEnginePlugin.supportedProtocolsForTheDestination,protocolsUsedForTheDestination))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"copyEnginePlugin.supportedProtocolsForTheSource: "+stringimplode(copyEnginePlugin.supportedProtocolsForTheSource,";"));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"protocolsUsedForTheSources.at(indexProto): "+stringimplode(protocolsUsedForTheSources,";"));
+ isTheGoodEngine=true;
+ unsigned int indexProto=0;
+ while(indexProto<protocolsUsedForTheSources.size())
+ {
+ if(!vectorcontainsAtLeastOne(copyEnginePlugin.supportedProtocolsForTheSource,protocolsUsedForTheSources.at(indexProto)))
+ {
+ isTheGoodEngine=false;
+ break;
+ }
+ indexProto++;
+ }
+ }
+ }
+ }
+ if(isTheGoodEngine)
+ {
+ pluginList[index].intances.push_back(pluginList.at(index).factory->getInstance());
+ temp.engine=pluginList.at(index).intances.back();
+ temp.canDoOnlyCopy=pluginList.at(index).canDoOnlyCopy;
+ temp.type=pluginList.at(index).type;
+ temp.transferListOperation=pluginList.at(index).transferListOperation;
+ return temp;
+ }
+ index++;
+ }
+ if(mode==Ultracopier::Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Cannot find any copy engine with move support");
+ QMessageBox::critical(NULL,tr("Warning"),tr("Cannot find any copy engine with move support"));
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Cannot find any compatible engine!");
+ QMessageBox::critical(NULL,tr("Warning"),tr("Cannot find any compatible engine!"));
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"protocolsUsedForTheSources: "+stringimplode(protocolsUsedForTheSources,";")+", protocolsUsedForTheDestination: "+protocolsUsedForTheDestination);
+
+ temp.engine=NULL;
+ temp.type=Ultracopier::File;
+ temp.canDoOnlyCopy=true;
+ return temp;
+}
+
+CopyEngineManager::returnCopyEngine CopyEngineManager::getCopyEngine(const Ultracopier::CopyMode &mode,const std::string &name)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, pluginList.size(): "+std::to_string(pluginList.size())+", with mode: "+std::to_string((int)mode)+", and name: "+name);
+ returnCopyEngine temp;
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Check matching: "+pluginList.at(index).name);
+ if(pluginList.at(index).name==name || name.empty())
+ {
+ if(mode==Ultracopier::Move && pluginList.at(index).canDoOnlyCopy)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"This copy engine does not support move: pluginList.at(index).canDoOnlyCopy: "+std::to_string(pluginList.at(index).canDoOnlyCopy));
+ QMessageBox::critical(NULL,tr("Warning"),tr("This copy engine does not support move"));
+ temp.engine=NULL;
+ return temp;
+ }
+ pluginList[index].intances.push_back(pluginList.at(index).factory->getInstance());
+ temp.engine=pluginList.at(index).intances.back();
+ temp.canDoOnlyCopy=pluginList.at(index).canDoOnlyCopy;
+ temp.type=pluginList.at(index).type;
+ temp.transferListOperation=pluginList.at(index).transferListOperation;
+ return temp;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Cannot find any engine with this name: "+name);
+ QMessageBox::critical(NULL,tr("Warning"),tr("Cannot find any engine with this name: %1").arg(QString::fromStdString(name)));
+ temp.engine=NULL;
+ temp.type=Ultracopier::File;
+ temp.canDoOnlyCopy=true;
+ return temp;
+}
+
+#ifdef ULTRACOPIER_DEBUG
+void CopyEngineManager::debugInformation(const Ultracopier::DebugLevel &level,const std::string& fonction,const std::string& text,const std::string& file,const int& ligne)
+{
+ DebugEngine::addDebugInformationStatic(level,fonction,text,file,ligne,"Copy Engine plugin");
+}
+#endif // ULTRACOPIER_DEBUG
+
+/// \brief To notify when new value into a group have changed
+void CopyEngineManager::newOptionValue(const std::string &groupName,const std::string &variableName,const std::string &value)
+{
+ if(groupName=="CopyEngine" && variableName=="List")
+ {
+ Q_UNUSED(value)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"start(\""+groupName+"\",\""+variableName+"\",\""+value+"\")");
+ allPluginIsloaded();
+ }
+}
+
+void CopyEngineManager::setIsConnected()
+{
+ /* ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ prevent bug, I don't know why, in one case it bug here
+ */
+ isConnected=true;
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ emit addCopyEngine(pluginList.at(index).name,pluginList.at(index).canDoOnlyCopy);
+ index++;
+ }
+}
+
+void CopyEngineManager::allPluginIsloaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ std::vector<std::string> actualList;
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ actualList.push_back(pluginList.at(index).name);
+ index++;
+ }
+ std::vector<std::string> preferedList=stringsplit(OptionEngine::optionEngine->getOptionValue("CopyEngine","List"),';');
+ vectorRemoveDuplicatesForSmallList(preferedList);
+ vectorRemoveDuplicatesForSmallList(actualList);
+ index=0;
+ while(index<preferedList.size())
+ {
+ if(!vectorcontainsAtLeastOne(actualList,preferedList.at(index)))
+ {
+ preferedList.erase(preferedList.cbegin()+index);
+ index--;
+ }
+ index++;
+ }
+ index=0;
+ while(index<actualList.size())
+ {
+ if(!vectorcontainsAtLeastOne(preferedList,actualList.at(index)))
+ preferedList.push_back( actualList.at(index));
+ index++;
+ }
+ OptionEngine::optionEngine->setOptionValue("CopyEngine","List",stringimplode(preferedList,';'));
+ std::vector<CopyEnginePlugin> newPluginList;
+ index=0;
+ while(index<preferedList.size())
+ {
+ unsigned int pluginListIndex=0;
+ while(pluginListIndex<pluginList.size())
+ {
+ if(preferedList.at(index)==pluginList.at(pluginListIndex).name)
+ {
+ newPluginList.push_back(pluginList.at(pluginListIndex));
+ break;
+ }
+ pluginListIndex++;
+ }
+ index++;
+ }
+ pluginList=newPluginList;
+}
+
+bool CopyEngineManager::protocolsSupportedByTheCopyEngine(PluginInterface_CopyEngine * engine,const std::vector<std::string> &protocolsUsedForTheSources,const std::string &protocolsUsedForTheDestination)
+{
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ const CopyEnginePlugin &copyEnginePlugin=pluginList.at(index);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"pluginList.at("+std::to_string(index)+").name: "+copyEnginePlugin.name);
+ if(vectorcontainsAtLeastOne(copyEnginePlugin.intances,engine))
+ {
+ if(!vectorcontainsAtLeastOne(copyEnginePlugin.supportedProtocolsForTheDestination,protocolsUsedForTheDestination))
+ return false;
+ unsigned int indexProto=0;
+ while(indexProto<protocolsUsedForTheSources.size())
+ {
+ if(!vectorcontainsAtLeastOne(copyEnginePlugin.supportedProtocolsForTheSource,protocolsUsedForTheSources.at(indexProto)))
+ return false;
+ indexProto++;
+ }
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/CopyEngineManager.h b/CopyEngineManager.h
new file mode 100644
index 0000000..904508c
--- /dev/null
+++ b/CopyEngineManager.h
@@ -0,0 +1,105 @@
+/** \file CopyEngineManager.h
+\brief Define the copy engine manager
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef COPYENGINEMANAGER_H
+#define COPYENGINEMANAGER_H
+
+#include <QObject>
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#include <QPluginLoader>
+#endif
+#include <QList>
+#include <QWidget>
+#include <QString>
+
+#include "Environment.h"
+#include "LocalPluginOptions.h"
+#include "OptionDialog.h"
+#include "interface/PluginInterface_CopyEngine.h"
+#include "FacilityEngine.h"
+
+namespace Ui {
+ class CopyEngineOptions;
+}
+
+/** \brief Manage copy engine plugins and their instance */
+class CopyEngineManager : public QObject
+{
+ Q_OBJECT
+public:
+ /** \brief internal structure to return one copy engine instance */
+ struct returnCopyEngine
+ {
+ PluginInterface_CopyEngine * engine; ///< The copy engine instance
+ bool canDoOnlyCopy; ///< true if can do only the copy (not move)
+ Ultracopier::CopyType type; ///< Kind of copy what it can do
+ Ultracopier::TransferListOperation transferListOperation;
+ };
+ explicit CopyEngineManager(OptionDialog *optionDialog);
+ /** \brief return copy engine instance when know the sources and destinations
+ \param mode the mode (copy/move)
+ \param protocolsUsedForTheSources list of sources used
+ \param protocolsUsedForTheDestination list of destination used
+ \see getCopyEngine()
+ */
+ returnCopyEngine getCopyEngine(const Ultracopier::CopyMode &mode,const std::vector<std::string> &protocolsUsedForTheSources,const std::string &protocolsUsedForTheDestination);
+ /** \brief return copy engine instance with specific engine
+ \param mode the mode (copy/move)
+ \param name name of the engine needed
+ \see getCopyEngine()
+ */
+ returnCopyEngine getCopyEngine(const Ultracopier::CopyMode &mode,const std::string &name);
+ //bool currentEngineCanDoOnlyCopy(std::vector<std::string> protocolsUsedForTheSources,std::string protocolsUsedForTheDestination="");
+ //CopyType currentEngineGetCopyType(std::vector<std::string> protocolsUsedForTheSources,std::string protocolsUsedForTheDestination="");
+ /** \brief to send all signal because all object is connected on it */
+ void setIsConnected();
+ /** \brief check if the protocols given is supported by the copy engine
+ \see Core::newCopy()
+ \see Core::newMove()
+ */
+ bool protocolsSupportedByTheCopyEngine(PluginInterface_CopyEngine * engine,const std::vector<std::string> &protocolsUsedForTheSources,const std::string &protocolsUsedForTheDestination);
+private slots:
+ void onePluginAdded(const PluginsAvailable &plugin);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void onePluginWillBeRemoved(const PluginsAvailable &plugin);
+ void onePluginWillBeUnloaded(const PluginsAvailable &plugin);
+ #endif
+ #ifdef ULTRACOPIER_DEBUG
+ void debugInformation(const Ultracopier::DebugLevel &level, const std::string& fonction, const std::string& text, const std::string& file, const int& ligne);
+ #endif // ULTRACOPIER_DEBUG
+ /// \brief To notify when new value into a group have changed
+ void newOptionValue(const std::string &groupName,const std::string &variableName,const std::string &value);
+ void allPluginIsloaded();
+private:
+ /// \brief the option interface
+ struct CopyEnginePlugin
+ {
+ std::string path;
+ std::string name;
+ std::string pluginPath;
+ std::vector<std::string> supportedProtocolsForTheSource;
+ std::vector<std::string> supportedProtocolsForTheDestination;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ QPluginLoader * pointer;
+ #endif
+ PluginInterface_CopyEngineFactory * factory;
+ std::vector<PluginInterface_CopyEngine *> intances;
+ bool canDoOnlyCopy;
+ Ultracopier::CopyType type;
+ Ultracopier::TransferListOperation transferListOperation;
+ LocalPluginOptions *options;
+ QWidget *optionsWidget;
+ };
+ std::vector<CopyEnginePlugin> pluginList;
+ OptionDialog *optionDialog;
+ bool isConnected;
+signals:
+ //void newCopyEngineOptions(std::string,std::string,QWidget *);
+ void addCopyEngine(std::string name,bool canDoOnlyCopy) const;
+ void removeCopyEngine(std::string name) const;
+ void previouslyPluginAdded(PluginsAvailable) const;
+};
+
+#endif // COPYENGINEMANAGER_H
diff --git a/CopyListener.cpp b/CopyListener.cpp
new file mode 100644
index 0000000..3c72695
--- /dev/null
+++ b/CopyListener.cpp
@@ -0,0 +1,480 @@
+/** \file CopyListener.h
+\brief Define the copy listener
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "CopyListener.h"
+#include "LanguagesManager.h"
+#include "cpp11addition.h"
+
+#ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#include "plugins/Listener/catchcopy-v0002/listener.h"
+#endif
+
+#include <QRegularExpression>
+#include <QMessageBox>
+
+CopyListener::CopyListener(OptionDialog *optionDialog)
+{
+ stopIt=false;
+ this->optionDialog=optionDialog;
+ pluginLoader=new PluginLoader(optionDialog);
+ //load the options
+ tryListen=false;
+ PluginsManager::pluginsManager->lockPluginListEdition();
+ std::vector<PluginsAvailable> list=PluginsManager::pluginsManager->getPluginsByCategory(PluginType_Listener);
+ connect(this,&CopyListener::previouslyPluginAdded, this,&CopyListener::onePluginAdded,Qt::QueuedConnection);
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginAdded, this,&CopyListener::onePluginAdded,Qt::QueuedConnection);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginWillBeRemoved, this,&CopyListener::onePluginWillBeRemoved,Qt::DirectConnection);
+ #endif
+ connect(PluginsManager::pluginsManager,&PluginsManager::pluginListingIsfinish, this,&CopyListener::allPluginIsloaded,Qt::QueuedConnection);
+ connect(pluginLoader,&PluginLoader::pluginLoaderReady, this,&CopyListener::pluginLoaderReady);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
+ PluginsManager::pluginsManager->unlockPluginListEdition();
+ last_state=Ultracopier::NotListening;
+ last_have_plugin=false;
+ last_inWaitOfReply=false;
+ stripSeparatorRegex=std::regex("[\\\\/]+$");
+}
+
+CopyListener::~CopyListener()
+{
+ stopIt=true;
+ if(pluginLoader!=NULL)
+ {
+ delete pluginLoader;
+ pluginLoader=NULL;
+ }
+}
+
+void CopyListener::resendState()
+{
+ if(PluginsManager::pluginsManager->allPluginHaveBeenLoaded())
+ {
+ sendState(true);
+ if(pluginLoader!=NULL)
+ pluginLoader->resendState();
+ }
+}
+
+void CopyListener::onePluginAdded(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_Listener)
+ return;
+ PluginListener newPluginListener;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"try load: "+plugin.path+PluginsManager::getResolvedPluginName("listener"));
+ //setFileName
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ PluginInterface_Listener *listen;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ QObjectList objectList=QPluginLoader::staticInstances();
+ int index=0;
+ QObject *pluginObject;
+ while(index<objectList.size())
+ {
+ pluginObject=objectList.at(index);
+ listen = qobject_cast<PluginInterface_Listener *>(pluginObject);
+ if(listen!=NULL)
+ break;
+ index++;
+ }
+ if(index==objectList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"static listener not found");
+ return;
+ }
+ #else
+ listen=new Listener();
+ #endif
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ newPluginListener.pluginLoader=NULL;
+ #endif
+ #else
+ QPluginLoader *pluginOfPluginLoader=new QPluginLoader(QString::fromStdString(plugin.path+PluginsManager::getResolvedPluginName("listener")));
+ QObject *pluginInstance = pluginOfPluginLoader->instance();
+ if(!pluginInstance)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to load the plugin: "+pluginOfPluginLoader->errorString().toStdString());
+ return;
+ }
+ PluginInterface_Listener *listen = qobject_cast<PluginInterface_Listener *>(pluginInstance);
+ if(!listen)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to load the plugin: "+pluginOfPluginLoader->errorString().toStdString());
+ return;
+ }
+ //check if found
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).listenInterface==listen)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Plugin already found "+pluginList.at(index).path+" for "+plugin.path);
+ pluginOfPluginLoader->unload();
+ return;
+ }
+ index++;
+ }
+ newPluginListener.pluginLoader = pluginOfPluginLoader;
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Plugin correctly loaded");
+ #ifdef ULTRACOPIER_DEBUG
+ connect(listen,&PluginInterface_Listener::debugInformation,this,&CopyListener::debugInformation,Qt::DirectConnection);
+ #endif // ULTRACOPIER_DEBUG
+ connect(listen,&PluginInterface_Listener::error, this,&CopyListener::error,Qt::DirectConnection);
+ connect(listen,&PluginInterface_Listener::newCopyWithoutDestination, this,&CopyListener::newPluginCopyWithoutDestination,Qt::DirectConnection);
+ connect(listen,&PluginInterface_Listener::newCopy, this,&CopyListener::newPluginCopy,Qt::DirectConnection);
+ connect(listen,&PluginInterface_Listener::newMoveWithoutDestination, this,&CopyListener::newPluginMoveWithoutDestination,Qt::DirectConnection);
+ connect(listen,&PluginInterface_Listener::newMove, this,&CopyListener::newPluginMove,Qt::DirectConnection);
+ connect(listen,&PluginInterface_Listener::newClientList, this,&CopyListener::reloadClientList,Qt::DirectConnection);
+ newPluginListener.listenInterface = listen;
+
+ newPluginListener.path = plugin.path+PluginsManager::getResolvedPluginName("listener");
+ newPluginListener.state = Ultracopier::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(LanguagesManager::languagesManager,&LanguagesManager::newLanguageLoaded,newPluginListener.listenInterface,&PluginInterface_Listener::newLanguageLoaded,Qt::DirectConnection);
+ pluginList.push_back(newPluginListener);
+ connect(pluginList.back().listenInterface,&PluginInterface_Listener::newState,this,&CopyListener::newState,Qt::DirectConnection);
+ if(tryListen)
+ {
+ pluginList.back().inWaitOfReply=true;
+ listen->listen();
+ }
+}
+
+#ifdef ULTRACOPIER_DEBUG
+void CopyListener::debugInformation(const Ultracopier::DebugLevel &level, const std::string& fonction, const std::string& text, const std::string& file, const int& ligne)
+{
+ DebugEngine::addDebugInformationStatic(level,fonction,text,file,ligne,"Listener plugin");
+}
+#endif // ULTRACOPIER_DEBUG
+
+void CopyListener::error(const std::string &error)
+{
+ QMessageBox::critical(NULL,tr("Error"),tr("Error during the reception of the copy/move list\n%1").arg(QString::fromStdString(error)));
+}
+
+bool CopyListener::oneListenerIsLoaded()
+{
+ return (pluginList.size()>0);
+}
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+void CopyListener::onePluginWillBeRemoved(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_Listener)
+ return;
+ unsigned int indexPlugin=0;
+ while(indexPlugin<pluginList.size())
+ {
+ if((plugin.path+PluginsManager::getResolvedPluginName("listener"))==pluginList.at(indexPlugin).path)
+ {
+ unsigned int index=0;
+ while(index<copyRunningList.size())
+ {
+ if(copyRunningList.at(index).listenInterface==pluginList.at(indexPlugin).listenInterface)
+ copyRunningList[index].listenInterface=NULL;
+ index++;
+ }
+ if(pluginList.at(indexPlugin).listenInterface!=NULL)
+ {
+ pluginList.at(indexPlugin).listenInterface->close();
+ delete pluginList.at(indexPlugin).listenInterface;
+ }
+ if(pluginList.at(indexPlugin).pluginLoader!=NULL)
+ {
+ pluginList.at(indexPlugin).pluginLoader->unload();
+ delete pluginList.at(indexPlugin).options;
+ }
+ pluginList.erase(pluginList.cbegin()+indexPlugin);
+ sendState();
+ return;
+ }
+ indexPlugin++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"not found");
+}
+#endif
+
+void CopyListener::newState(const Ultracopier::ListeningState &state)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ PluginInterface_Listener *temp=qobject_cast<PluginInterface_Listener *>(QObject::sender());
+ if(temp==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"listener not located!");
+ return;
+ }
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(temp==pluginList.at(index).listenInterface)
+ {
+ pluginList[index].state=state;
+ pluginList[index].inWaitOfReply=false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"new state for the plugin "+std::to_string(index)+": "+std::to_string((int)state));
+ sendState(true);
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"listener not found!");
+}
+
+void CopyListener::listen()
+{
+ tryListen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ pluginList[index].inWaitOfReply=true;
+ pluginList.at(index).listenInterface->listen();
+ index++;
+ }
+ if(pluginLoader!=NULL)
+ pluginLoader->load();
+}
+
+void CopyListener::close()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ tryListen=false;
+ if(pluginLoader!=NULL)
+ pluginLoader->unload();
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ pluginList[index].inWaitOfReply=true;
+ pluginList.at(index).listenInterface->close();
+ index++;
+ }
+ copyRunningList.clear();
+}
+
+std::vector<std::string> CopyListener::stripSeparator(std::vector<std::string> sources)
+{
+ unsigned int index=0;
+ while(index<sources.size())
+ {
+ std::regex_replace(sources[index],stripSeparatorRegex,"");
+ index++;
+ }
+ return sources;
+}
+
+/** new copy without destination have been pased by the CLI */
+void CopyListener::copyWithoutDestination(std::vector<std::string> sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ std::vector<std::string> list;
+ list.push_back("file");
+ emit newCopyWithoutDestination(incrementOrderId(),list,stripSeparator(sources));
+}
+
+/** new copy with destination have been pased by the CLI */
+void CopyListener::copy(std::vector<std::string> sources,std::string destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ std::vector<std::string> list;
+ list.push_back("file");
+ emit newCopy(incrementOrderId(),list,stripSeparator(sources),"file",destination);
+}
+
+/** new move without destination have been pased by the CLI */
+void CopyListener::moveWithoutDestination(std::vector<std::string> sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ std::vector<std::string> list;
+ list.push_back("file");
+ emit newMoveWithoutDestination(incrementOrderId(),list,stripSeparator(sources));
+}
+
+/** new move with destination have been pased by the CLI */
+void CopyListener::move(std::vector<std::string> sources,std::string destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ std::vector<std::string> list;
+ list.push_back("file");
+ emit newMove(incrementOrderId(),list,stripSeparator(sources),"file",destination);
+}
+
+void CopyListener::copyFinished(const quint32 & orderId,const bool &withError)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<copyRunningList.size())
+ {
+ if(orderId==copyRunningList.at(index).orderId)
+ {
+ vectorRemoveAll(orderList,orderId);
+ if(copyRunningList.at(index).listenInterface!=NULL)
+ copyRunningList.at(index).listenInterface->transferFinished(copyRunningList.at(index).pluginOrderId,withError);
+ copyRunningList.erase(copyRunningList.cbegin()+index);
+ return;
+ }
+ index++;
+ }
+}
+
+void CopyListener::copyCanceled(const uint32_t & orderId)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<copyRunningList.size())
+ {
+ if(orderId==copyRunningList.at(index).orderId)
+ {
+ vectorRemoveAll(orderList,orderId);
+ if(copyRunningList.at(index).listenInterface!=NULL)
+ copyRunningList.at(index).listenInterface->transferCanceled(copyRunningList.at(index).pluginOrderId);
+ copyRunningList.erase(copyRunningList.cbegin()+index);
+ return;
+ }
+ index++;
+ }
+}
+
+void CopyListener::newPluginCopyWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sources: "+stringimplode(sources,";"));
+ PluginInterface_Listener *plugin = qobject_cast<PluginInterface_Listener *>(sender());
+ CopyRunning newCopyInformation;
+ newCopyInformation.listenInterface = plugin;
+ newCopyInformation.pluginOrderId = orderId;
+ newCopyInformation.orderId = incrementOrderId();
+ copyRunningList.push_back(newCopyInformation);
+ std::vector<std::string> stringList;stringList.push_back("file");
+ emit newCopyWithoutDestination(orderId,stringList,stripSeparator(sources));
+}
+
+void CopyListener::newPluginCopy(const quint32 &orderId,const std::vector<std::string> &sources,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sources: "+stringimplode(sources,";")+", destination: "+destination);
+ PluginInterface_Listener *plugin = qobject_cast<PluginInterface_Listener *>(sender());
+ CopyRunning newCopyInformation;
+ newCopyInformation.listenInterface = plugin;
+ newCopyInformation.pluginOrderId = orderId;
+ newCopyInformation.orderId = incrementOrderId();
+ copyRunningList.push_back(newCopyInformation);
+ std::vector<std::string> stringList;stringList.push_back("file");
+ emit newCopy(orderId,stringList,stripSeparator(sources),"file",destination);
+}
+
+void CopyListener::newPluginMoveWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sources: "+stringimplode(sources,";"));
+ PluginInterface_Listener *plugin = qobject_cast<PluginInterface_Listener *>(sender());
+ CopyRunning newCopyInformation;
+ newCopyInformation.listenInterface = plugin;
+ newCopyInformation.pluginOrderId = orderId;
+ newCopyInformation.orderId = incrementOrderId();
+ copyRunningList.push_back(newCopyInformation);
+ std::vector<std::string> stringList;stringList.push_back("file");
+ emit newMoveWithoutDestination(orderId,stringList,stripSeparator(sources));
+}
+
+void CopyListener::newPluginMove(const quint32 &orderId,const std::vector<std::string> &sources,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sources: "+stringimplode(sources,";")+", destination: "+destination);
+ PluginInterface_Listener *plugin = qobject_cast<PluginInterface_Listener *>(sender());
+ CopyRunning newCopyInformation;
+ newCopyInformation.listenInterface = plugin;
+ newCopyInformation.pluginOrderId = orderId;
+ newCopyInformation.orderId = incrementOrderId();
+ copyRunningList.push_back(newCopyInformation);
+ std::vector<std::string> stringList;stringList.push_back("file");
+ emit newMove(orderId,stringList,stripSeparator(sources),"file",destination);
+}
+
+uint32_t CopyListener::incrementOrderId()
+{
+ do
+ {
+ nextOrderId++;
+ if(nextOrderId>2000000)
+ nextOrderId=0;
+ } while(vectorcontainsAtLeastOne(orderList,nextOrderId));
+ return nextOrderId;
+}
+
+void CopyListener::allPluginIsloaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"with value: "+std::to_string(pluginList.size()>0));
+ sendState(true);
+ reloadClientList();
+}
+
+void CopyListener::reloadClientList()
+{
+ if(!PluginsManager::pluginsManager->allPluginHaveBeenLoaded())
+ return;
+ std::vector<std::string> clients;
+ unsigned int indexPlugin=0;
+ while(indexPlugin<pluginList.size())
+ {
+ if(pluginList.at(indexPlugin).listenInterface!=NULL)
+ {
+ const PluginListener &pluginListener=pluginList.at(indexPlugin);
+ const std::vector<std::string> &clientsList=pluginListener.listenInterface->clientsList();
+ clients.insert(clients.cbegin(),clientsList.cbegin(),clientsList.cend());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"ask client to: "+pluginList.at(indexPlugin).path);
+ }
+ indexPlugin++;
+ }
+ emit newClientList(clients);
+}
+
+void CopyListener::sendState(bool force)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, pluginList.size(): "+std::to_string(pluginList.size())+", force: "+std::to_string(force));
+ Ultracopier::ListeningState current_state=Ultracopier::NotListening;
+ bool found_not_listen=false,found_listen=false,found_inWaitOfReply=false;
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(current_state==Ultracopier::NotListening)
+ {
+ if(pluginList.at(index).state==Ultracopier::SemiListening)
+ current_state=Ultracopier::SemiListening;
+ else if(pluginList.at(index).state==Ultracopier::NotListening)
+ found_not_listen=true;
+ else if(pluginList.at(index).state==Ultracopier::FullListening)
+ found_listen=true;
+ }
+ if(pluginList.at(index).inWaitOfReply)
+ found_inWaitOfReply=true;
+ index++;
+ }
+ if(current_state==Ultracopier::NotListening)
+ {
+ if(found_not_listen && found_listen)
+ current_state=Ultracopier::SemiListening;
+ else if(found_not_listen)
+ current_state=Ultracopier::NotListening;
+ else if(!found_not_listen && found_listen)
+ current_state=Ultracopier::FullListening;
+ else
+ current_state=Ultracopier::SemiListening;
+ }
+ bool have_plugin=pluginList.size()>0;
+ if(force || current_state!=last_state || have_plugin!=last_have_plugin || found_inWaitOfReply!=last_inWaitOfReply)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"send listenerReady("+std::to_string(current_state)+","+std::to_string(have_plugin)+","+std::to_string(found_inWaitOfReply)+")");
+ emit listenerReady(current_state,have_plugin,found_inWaitOfReply);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Skip the signal sending");
+ last_state=current_state;
+ last_have_plugin=have_plugin;
+ last_inWaitOfReply=found_inWaitOfReply;
+}
diff --git a/CopyListener.h b/CopyListener.h
new file mode 100644
index 0000000..3003aec
--- /dev/null
+++ b/CopyListener.h
@@ -0,0 +1,123 @@
+/** \file CopyListener.h
+\brief Define the class to load the plugin and lunch it
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef COPYLISTENER_H
+#define COPYLISTENER_H
+
+#include <QObject>
+#include <QList>
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#include <QPluginLoader>
+#endif
+
+#include "interface/PluginInterface_Listener.h"
+#include "Environment.h"
+#include "PluginLoader.h"
+#include "OptionDialog.h"
+
+/** \brief to load all the listener and parse all event */
+class CopyListener : public QObject
+{
+ Q_OBJECT
+ public:
+ explicit CopyListener(OptionDialog *optionDialog);
+ ~CopyListener();
+ /** \brief send of one listener is loaded */
+ bool oneListenerIsLoaded();
+ /** \brief to resend the state */
+ void resendState();
+ private slots:
+ //void newPlugin();
+ void newPluginCopyWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources);
+ void newPluginCopy(const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination);
+ void newPluginMoveWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources);
+ void newPluginMove(const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination);
+ void onePluginAdded(const PluginsAvailable &plugin);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void onePluginWillBeRemoved(const PluginsAvailable &plugin);
+ #endif
+ void newState(const Ultracopier::ListeningState &state);
+ #ifdef ULTRACOPIER_DEBUG
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string& fonction,const std::string& text,const std::string& file,const int& ligne);
+ #endif // ULTRACOPIER_DEBUG
+ void error(const std::string &error);
+ void allPluginIsloaded();
+ void reloadClientList();
+ public slots:
+ /** \brief the copy is finished
+ \param orderId id used when it have send the copy
+ \param withError true if it have found error
+ \see newCopy()
+ \see newMove()
+ */
+ void copyFinished(const uint32_t & orderId,const bool &withError);
+ /** \brief the copy is canceled by the user
+ \param orderId id used when it have send the copy
+ \see newCopy()
+ \see newMove()
+ */
+ void copyCanceled(const uint32_t & orderId);
+ /** \brief try listen, to get copy/move from external source (mainly the file manager)
+ \see close()
+ */
+ void listen();
+ /** \brief stop listen, to get copy/move from external source (mainly the file manager)
+ \see listen()
+ */
+ void close();
+ /** new copy without destination have been pased by the CLI */
+ void copyWithoutDestination(std::vector<std::string> sources);
+ /** new copy with destination have been pased by the CLI */
+ void copy(std::vector<std::string> sources,std::string destination);
+ /** new move without destination have been pased by the CLI */
+ void moveWithoutDestination(std::vector<std::string> sources);
+ /** new move with destination have been pased by the CLI */
+ void move(std::vector<std::string> sources,std::string destination);
+ signals:
+ void newCopyWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources) const;
+ void newCopy(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources,const std::string &protocolsUsedForTheDestination,const std::string &destination) const;
+ void newMoveWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources) const;
+ void newMove(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources,const std::string &protocolsUsedForTheDestination,const std::string &destination) const;
+ void listenerReady(const Ultracopier::ListeningState &state,const bool &havePlugin,const bool &someAreInWaitOfReply) const;
+ void pluginLoaderReady(const Ultracopier::CatchState &state,const bool &havePlugin,const bool &someAreInWaitOfReply) const;
+ void previouslyPluginAdded(const PluginsAvailable &) const;
+ void newClientList(const std::vector<std::string> &clientsList) const;
+ private:
+ struct PluginListener
+ {
+ PluginInterface_Listener *listenInterface;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ QPluginLoader *pluginLoader;
+ #endif
+ std::string path;
+ Ultracopier::ListeningState state;
+ bool inWaitOfReply;
+ LocalPluginOptions *options;
+ };
+ std::vector<PluginListener> pluginList;
+ //for the options
+ uint32_t nextOrderId;
+ std::vector<uint32_t> orderList;
+ //for the copy as suspend
+ struct CopyRunning
+ {
+ PluginInterface_Listener *listenInterface;
+ uint32_t pluginOrderId;
+ uint32_t orderId;
+ };
+ std::vector<CopyRunning> copyRunningList;
+ uint32_t incrementOrderId();
+ bool tryListen;
+ PluginLoader *pluginLoader;
+ Ultracopier::ListeningState last_state;
+ bool last_have_plugin,last_inWaitOfReply;
+ void sendState(bool force=false);
+ std::vector<std::string> stripSeparator(std::vector<std::string> sources);
+ OptionDialog *optionDialog;
+ bool stopIt;
+ std::regex stripSeparatorRegex;
+};
+
+#endif // COPYLISTENER_H
diff --git a/Core.cpp b/Core.cpp
new file mode 100644
index 0000000..9f0e8eb
--- /dev/null
+++ b/Core.cpp
@@ -0,0 +1,1161 @@
+/** \file Core.cpp
+\brief Define the class for the core
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QMessageBox>
+#include <QtPlugin>
+#include <cmath>
+
+#include "Core.h"
+#include "ThemesManager.h"
+#include "cpp11addition.h"
+
+Core::Core(CopyEngineManager *copyEngineList)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->copyEngineList=copyEngineList;
+ nextId=0;
+ forUpateInformation.setInterval(ULTRACOPIER_TIME_INTERFACE_UPDATE);
+ loadInterface();
+ //connect(&copyEngineList, &CopyEngineManager::newCanDoOnlyCopy, this, &Core::newCanDoOnlyCopy);
+ connect(ThemesManager::themesManager, &ThemesManager::theThemeNeedBeUnloaded, this, &Core::unloadInterface);
+ connect(ThemesManager::themesManager, &ThemesManager::theThemeIsReloaded, this, &Core::loadInterface, Qt::QueuedConnection);
+ connect(&forUpateInformation, &QTimer::timeout, this, &Core::periodicSynchronization);
+}
+
+Core::~Core()
+{
+ unsigned int index=0;
+ while(index<copyList.size())
+ {
+ copyList[index].engine->cancel();
+ delete copyList.at(index).nextConditionalSync;
+ delete copyList.at(index).interface;
+ delete copyList.at(index).engine;
+ index++;
+ }
+}
+
+void Core::newCopyWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(openNewCopyEngineInstance(Ultracopier::Copy,false,protocolsUsedForTheSources)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
+ copyList.back().orderId.push_back(orderId);
+ copyList.back().engine->newCopy(sources);
+ copyList.back().interface->haveExternalOrder();
+}
+
+void Core::newTransfer(const Ultracopier::CopyMode &mode,const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources,const std::string &protocolsUsedForTheDestination,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+stringimplode(sources,";")+", dest: "+destination+", mode: "+std::to_string(mode));
+ //search to group the window
+ int GroupWindowWhen=stringtoint32(OptionEngine::optionEngine->getOptionValue("Ultracopier","GroupWindowWhen"));
+ bool haveSameSource=false,haveSameDestination=false;
+ if(GroupWindowWhen!=0)
+ {
+ bool needConfirmation=stringtobool(OptionEngine::optionEngine->getOptionValue("Ultracopier","confirmToGroupWindows"));
+ unsigned int index=0;
+ while(index<copyList.size())
+ {
+ bool rightMode=false;
+ if(mode==Ultracopier::Copy)
+ rightMode=copyList.at(index).mode==Ultracopier::Copy;
+ else
+ rightMode=copyList.at(index).mode==Ultracopier::Move;
+ if(!copyList.at(index).ignoreMode && rightMode && !copyList.at(index).canceled)
+ {
+ if(GroupWindowWhen!=5)
+ {
+ if(GroupWindowWhen!=2)
+ haveSameSource=copyList.at(index).engine->haveSameSource(sources);
+ if(GroupWindowWhen!=1)
+ haveSameDestination=copyList.at(index).engine->haveSameDestination(destination);
+ }
+ if(
+ GroupWindowWhen==5 ||
+ (GroupWindowWhen==1 && haveSameSource) ||
+ (GroupWindowWhen==2 && haveSameDestination) ||
+ (GroupWindowWhen==3 && (haveSameSource && haveSameDestination)) ||
+ (GroupWindowWhen==4 && (haveSameSource || haveSameDestination))
+ )
+ {
+ /*protocols are same*/
+ if(copyEngineList->protocolsSupportedByTheCopyEngine(copyList.at(index).engine,protocolsUsedForTheSources,protocolsUsedForTheDestination))
+ {
+ bool confirmed=true;
+ if(needConfirmation)
+ {
+ QMessageBox::StandardButton reply = QMessageBox::question(copyList.at(index).interface,tr("Group window"),tr("Do you want group the transfer with another actual running transfer?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
+ confirmed=(reply==QMessageBox::Yes);
+ }
+ if(confirmed)
+ {
+ copyList[index].orderId.push_back(orderId);
+ if(mode==Ultracopier::Copy)
+ copyList.at(index).engine->newCopy(sources,destination);
+ else
+ copyList.at(index).engine->newMove(sources,destination);
+ copyList.at(index).interface->haveExternalOrder();
+ return;
+ }
+ }
+ }
+ }
+ index++;
+ }
+ }
+ //else open new windows
+ if(openNewCopyEngineInstance(mode,false,protocolsUsedForTheSources,protocolsUsedForTheDestination)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to get a engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a engine instance"));
+ return;
+ }
+ copyList.back().orderId.push_back(orderId);
+ if(mode==Ultracopier::Copy)
+ copyList.back().engine->newCopy(sources,destination);
+ else
+ copyList.back().engine->newMove(sources,destination);
+ copyList.back().interface->haveExternalOrder();
+}
+
+void Core::newCopy(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources,const std::string &protocolsUsedForTheDestination,const std::string &destination)
+{
+ newTransfer(Ultracopier::Copy,orderId,protocolsUsedForTheSources,sources,protocolsUsedForTheDestination,destination);
+}
+
+void Core::newMove(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources,const std::string &protocolsUsedForTheDestination,const std::string &destination)
+{
+ newTransfer(Ultracopier::Move,orderId,protocolsUsedForTheSources,sources,protocolsUsedForTheDestination,destination);
+}
+
+void Core::newMoveWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources)
+{
+ if(openNewCopyEngineInstance(Ultracopier::Move,false,protocolsUsedForTheSources)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
+ copyList.back().orderId.push_back(orderId);
+ copyList.back().engine->newMove(sources);
+ copyList.back().interface->haveExternalOrder();
+}
+
+/// \brief name to open the right copy engine
+void Core::addWindowCopyMove(const Ultracopier::CopyMode &mode,const std::string &name)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+name);
+ if(openNewCopyEngineInstance(mode,false,name)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::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=static_cast<ActionOnManualOpen>(stringtoint32(OptionEngine::optionEngine->getOptionValue("Ultracopier","ActionOnManualOpen")));
+ if(ActionOnManualOpen_value!=ActionOnManualOpen_Nothing)
+ {
+ if(ActionOnManualOpen_value==ActionOnManualOpen_Folder)
+ copyList.back().engine->userAddFolder(mode);
+ else
+ copyList.back().engine->userAddFile(mode);
+ }
+}
+
+/// \brief name to open the right copy engine
+void Core::addWindowTransfer(const std::string &name)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start"+name);
+ if(openNewCopyEngineInstance(Ultracopier::Copy,true,name)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::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(std::string engine,std::string mode,std::string file)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"engine: "+engine+", mode: "+mode+", file: "+file);
+ if(mode=="Transfer")
+ {
+ if(openNewCopyEngineInstance(Ultracopier::Copy,true,engine)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::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(Ultracopier::Copy,false,engine)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::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(Ultracopier::Move,false,engine)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::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(Ultracopier::DebugLevel_Warning,"The argument for the mode is not valid");
+ QMessageBox::critical(NULL,tr("Error"),tr("The argument for the mode is not valid"));
+ return;
+ }
+ copyList.back().engine->newTransferList(file);
+}
+
+bool Core::startNewTransferOneUniqueCopyEngine()
+{
+ if(copyList.size()!=1)
+ return false;
+
+ if(openNewCopyEngineInstance(Ultracopier::Copy,true,std::string())==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return false;
+ }
+ return true;
+}
+
+void Core::loadInterface()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //load the extra files to check the themes availability
+ if(copyList.size()>0)
+ {
+ bool error=false;
+ unsigned int index=0;
+ while(index<copyList.size())
+ {
+ copyList[index].interface=ThemesManager::themesManager->getThemesInstance();
+ if(copyList.at(index).interface==NULL)
+ {
+ copyInstanceCanceledByIndex(index);
+ error=true;
+ }
+ else
+ {
+ if(!copyList.at(index).ignoreMode)
+ copyList.at(index).interface->forceCopyMode(copyList.at(index).mode);
+ connectInterfaceAndSync(static_cast<unsigned int>(copyList.size()-1));
+ copyList.at(index).engine->syncTransferList();
+ index++;
+ }
+ }
+ if(error)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to load the interface, copy aborted");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to load the interface, copy aborted"));
+ }
+ }
+}
+
+void Core::unloadInterface()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ size_t index=0;
+ while(index<copyList.size())
+ {
+ if(copyList.at(index).interface!=NULL)
+ {
+ //disconnectInterface(index);
+ delete copyList.at(index).interface;
+ copyList[index].interface=NULL;
+ copyList[index].copyEngineIsSync=false;
+ }
+ index++;
+ }
+}
+
+unsigned int Core::incrementId()
+{
+ do
+ {
+ nextId++;
+ if(nextId>2000000)
+ nextId=0;
+ } while(vectorcontainsAtLeastOne(idList,nextId));
+ return nextId;
+}
+
+/** 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 Ultracopier::CopyMode &mode,const bool &ignoreMode,
+ const std::vector<std::string> &protocolsUsedForTheSources,const std::string &protocolsUsedForTheDestination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ CopyEngineManager::returnCopyEngine returnInformations=copyEngineList->getCopyEngine(mode,protocolsUsedForTheSources,protocolsUsedForTheDestination);
+ if(returnInformations.engine==NULL)
+ return -1;
+ return connectCopyEngine(mode,ignoreMode,returnInformations);
+}
+
+/** 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 Ultracopier::CopyMode &mode,const bool &ignoreMode,const std::string &name)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, mode: "+std::to_string(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 Ultracopier::CopyMode &mode,bool ignoreMode,const CopyEngineManager::returnCopyEngine &returnInformations)
+{
+ if(returnInformations.canDoOnlyCopy)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Mode force for unknow reason");
+ ignoreMode=false;//force mode if need, normaly not used
+ }
+ CopyInstance newItem;
+ newItem.engine=returnInformations.engine;
+ if(newItem.engine!=NULL)
+ {
+ PluginInterface_Themes *theme=ThemesManager::themesManager->getThemesInstance();
+ if(theme!=NULL)
+ {
+ newItem.id=incrementId();
+ newItem.lastProgression=0;
+ newItem.interface=theme;
+ newItem.ignoreMode=ignoreMode;
+ newItem.mode=mode;
+ newItem.type=returnInformations.type;
+ newItem.transferListOperation=returnInformations.transferListOperation;
+ newItem.numberOfFile=0;
+ newItem.numberOfTransferedFile=0;
+ newItem.currentProgression=0;
+ newItem.totalProgression=0;
+ newItem.action=Ultracopier::Idle;
+ newItem.lastProgression=0;//store the real byte transfered, used in time remaining calculation
+ newItem.isPaused=false;
+ newItem.isRunning=false;
+ newItem.haveError=false;
+ newItem.lastConditionalSync.start();
+ newItem.nextConditionalSync=new QTimer();
+ newItem.nextConditionalSync->setSingleShot(true);
+ newItem.copyEngineIsSync=true;
+ newItem.canceled=false;
+
+ switch(stringtoint32(OptionEngine::optionEngine->getOptionValue("Ultracopier","remainingTimeAlgorithm")))
+ {
+ default:
+ case 0:
+ newItem.remainingTimeAlgo=Ultracopier::RemainingTimeAlgo_Traditional;
+ break;
+ case 1:
+ newItem.remainingTimeAlgo=Ultracopier::RemainingTimeAlgo_Logarithmic;
+ {
+ int index=0;
+ while(index<ULTRACOPIER_MAXREMAININGTIMECOL)
+ {
+ RemainingTimeLogarithmicColumn remainingTimeLogarithmicColumn;
+ remainingTimeLogarithmicColumn.totalSize=0;
+ remainingTimeLogarithmicColumn.transferedSize=0;
+ newItem.remainingTimeLogarithmicValue.push_back(remainingTimeLogarithmicColumn);
+ index++;
+ }
+ }
+ break;
+ }
+
+ if(!ignoreMode)
+ {
+ newItem.interface->forceCopyMode(mode);
+ newItem.engine->forceMode(mode);
+ }
+ if(copyList.size()==0)
+ forUpateInformation.start();
+ copyList.push_back(newItem);
+ connectEngine(static_cast<unsigned int>(copyList.size()-1));
+ connectInterfaceAndSync(static_cast<unsigned int>(copyList.size()-1));
+ return static_cast<int>(newItem.id);
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::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
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to load the copy engine, copy aborted");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to load the copy engine, copy aborted"));
+ }
+ return -1;
+}
+
+void Core::resetSpeedDetectedEngine()
+{
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ resetSpeedDetected(static_cast<unsigned int>(index));
+}
+
+void Core::resetSpeedDetectedInterface()
+{
+ int index=indexCopySenderInterface();
+ if(index!=-1)
+ resetSpeedDetected(static_cast<unsigned int>(index));
+}
+
+void Core::resetSpeedDetected(const unsigned int &bindex)
+{
+ const size_t &index=bindex;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start on "+std::to_string(index));
+ switch(copyList.at(index).remainingTimeAlgo)
+ {
+ case Ultracopier::RemainingTimeAlgo_Logarithmic:
+ {
+ size_t sub_index=0;
+ while(sub_index<ULTRACOPIER_MAXREMAININGTIMECOL)
+ {
+ copyList[index].remainingTimeLogarithmicValue[sub_index].lastProgressionSpeed.clear();
+ copyList[index].remainingTimeLogarithmicValue[sub_index].totalSize=0;
+ copyList[index].remainingTimeLogarithmicValue[sub_index].transferedSize=0;
+ sub_index++;
+ }
+ }
+ break;
+ default:
+ case Ultracopier::RemainingTimeAlgo_Traditional:
+ copyList[index].lastSpeedDetected.clear();
+ copyList[index].lastSpeedTime.clear();
+ copyList[index].lastAverageSpeedDetected.clear();
+ copyList[index].lastAverageSpeedTime.clear();
+ break;
+ }
+}
+
+void Core::doneTime(const std::vector<std::pair<uint64_t,uint32_t> > &timeList)
+{
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ {
+ CopyInstance &copyInstance=copyList[index];
+ switch(copyInstance.remainingTimeAlgo)
+ {
+ case Ultracopier::RemainingTimeAlgo_Logarithmic:
+ if(copyInstance.remainingTimeLogarithmicValue.size()<ULTRACOPIER_MAXREMAININGTIMECOL)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"bug, copyInstance.remainingTimeLogarithmicValue.size() "+std::to_string(copyInstance.remainingTimeLogarithmicValue.size())+" <ULTRACOPIER_MAXREMAININGTIMECOL");
+ else
+ {
+ unsigned int sub_index=0;
+ while(sub_index<timeList.size())
+ {
+ const std::pair<uint64_t,uint32_t> &timeUnit=timeList.at(sub_index);
+ const uint8_t &col=fileCatNumber(timeUnit.first);
+ RemainingTimeLogarithmicColumn &remainingTimeLogarithmicColumn=copyInstance.remainingTimeLogarithmicValue[col];
+ if(copyInstance.remainingTimeLogarithmicValue.size()<=col)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"bug, copyInstance.remainingTimeLogarithmicValue.size() "+std::to_string(copyInstance.remainingTimeLogarithmicValue.size())+" < col %2"+std::to_string(col));
+ break;
+ }
+ else
+ {
+ if(timeUnit.second>0)
+ {
+ remainingTimeLogarithmicColumn.lastProgressionSpeed.push_back(static_cast<unsigned int>(timeUnit.first/timeUnit.second));
+ if(remainingTimeLogarithmicColumn.lastProgressionSpeed.size()>ULTRACOPIER_MAXVALUESPEEDSTORED)
+ remainingTimeLogarithmicColumn.lastProgressionSpeed.pop_back();
+ }
+ }
+ sub_index++;
+ }
+ }
+ break;
+ default:
+ case Ultracopier::RemainingTimeAlgo_Traditional:
+ break;
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the interface sender");
+}
+
+void Core::actionInProgess(const Ultracopier::EngineActionInProgress &action)
+{
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action: "+std::to_string(action)+", from "+std::to_string(index));
+ //drop here the duplicate action
+ if(copyList.at(index).action==action)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"The copy engine have send 2x the same EngineActionInProgress");
+ return;
+ }
+ //update time runing for time remaning caculation
+ if(action==Ultracopier::Copying || action==Ultracopier::CopyingAndListing)
+ {
+ if(!copyList.at(index).isRunning)
+ copyList[index].isRunning=true;
+ }
+ else
+ {
+ if(copyList.at(index).isRunning)
+ copyList[index].isRunning=false;
+ }
+ //do sync
+ periodicSynchronizationWithIndex(index);
+ copyList[index].action=action;
+ if(copyList.at(index).interface!=NULL)
+ copyList.at(index).interface->actionInProgess(action);
+ if(action==Ultracopier::Idle)
+ {
+ unsigned int index_sub_loop=0;
+ while(index_sub_loop<copyList.at(index).orderId.size())
+ {
+ emit copyCanceled(copyList.at(index).orderId.at(index_sub_loop));
+ index_sub_loop++;
+ }
+ copyList[index].orderId.clear();
+ resetSpeedDetected(index);
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the interface sender");
+}
+
+void Core::newFolderListing(const std::string &path)
+{
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ {
+ copyList[index].folderListing=path;
+ copyList.at(index).interface->newFolderListing(path);
+ }
+}
+
+void Core::isInPause(const bool &isPaused)
+{
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ {
+ if(!isPaused)
+ resetSpeedDetected(index);
+ copyList[index].isPaused=isPaused;
+ copyList.at(index).interface->isInPause(isPaused);
+ }
+}
+
+/// \brief get the right copy instance (copy engine + interface), by signal emited from copy engine
+int Core::indexCopySenderCopyEngine()
+{
+ const 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(Ultracopier::DebugLevel_Warning,"Qt sender() NULL");
+ return -1;
+ }
+ unsigned int index=0;
+ while(index<copyList.size())
+ {
+ if(copyList.at(index).engine==senderObject)
+ return index;
+ index++;
+ }
+ //QMessageBox::critical(NULL,tr("Internal error"),tr("A communication error occured between the interface and the copy plugin. Please report this bug."));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Sender not located in the list");
+ return -1;
+}
+
+/// \brief get the right copy instance (copy engine + interface), by signal emited from interface
+int Core::indexCopySenderInterface()
+{
+ 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(Ultracopier::DebugLevel_Warning,"Qt sender() NULL");
+ return -1;
+ }
+ unsigned int index=0;
+ while(index<copyList.size())
+ {
+ if(copyList.at(index).interface==senderObject)
+ return index;
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to locate QObject * sender");
+ PluginInterface_Themes * interface = qobject_cast<PluginInterface_Themes *>(senderObject);
+ if(interface==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(Ultracopier::DebugLevel_Warning,"Qt sender themes NULL");
+ return -1;
+ }
+ index=0;
+ while(index<copyList.size())
+ {
+ if(copyList.at(index).interface==interface)
+ return index;
+ index++;
+ }
+ //QMessageBox::critical(NULL,tr("Internal error"),tr("A communication error occured between the interface and the copy plugin. Please report this bug."));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Sender not located in the list");
+ return -1;
+}
+
+void Core::connectEngine(const unsigned int &index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start with index: "+std::to_string(index)+": "+std::to_string((uint64_t)sender()));
+ //disconnectEngine(index);
+
+ CopyInstance& currentCopyInstance=copyList[index];
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::newFolderListing, this,&Core::newFolderListing,Qt::QueuedConnection))//to check to change
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for newFolderListing()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::actionInProgess, this,&Core::actionInProgess,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for actionInProgess()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::isInPause, this,&Core::isInPause,Qt::QueuedConnection))//to check to change
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for isInPause()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::cancelAll, this,&Core::copyInstanceCanceledByEngine,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for cancelAll()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::error, this,&Core::error,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for error()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::rmPath, this,&Core::rmPath,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for rmPath()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::mkPath, this,&Core::mkPath,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for mkPath()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::syncReady, this,&Core::syncReady,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for syncReady()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::canBeDeleted, this,&Core::deleteCopyEngine,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for syncReady()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::doneTime, this,&Core::doneTime,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the engine can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for doneTime()");
+}
+
+void Core::connectInterfaceAndSync(const unsigned int &index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start with index: "+std::to_string(index)+": "+std::to_string((uint64_t)sender()));
+ //disconnectInterface(index);
+
+ CopyInstance& currentCopyInstance=copyList[index];
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::pause, currentCopyInstance.engine,&PluginInterface_CopyEngine::pause))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for pause()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::resume, currentCopyInstance.engine,&PluginInterface_CopyEngine::resume))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for resume()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::skip, currentCopyInstance.engine,&PluginInterface_CopyEngine::skip))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for skip()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::newSpeedLimitation, currentCopyInstance.engine,&PluginInterface_CopyEngine::setSpeedLimitation))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for newSpeedLimitation()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::userAddFolder, currentCopyInstance.engine,&PluginInterface_CopyEngine::userAddFolder))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for userAddFolder()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::userAddFile, currentCopyInstance.engine,&PluginInterface_CopyEngine::userAddFile))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for userAddFile()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::removeItems, currentCopyInstance.engine,&PluginInterface_CopyEngine::removeItems))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for removeItems()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::moveItemsOnTop, currentCopyInstance.engine,&PluginInterface_CopyEngine::moveItemsOnTop))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for moveItemsOnTop()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::moveItemsUp, currentCopyInstance.engine,&PluginInterface_CopyEngine::moveItemsUp))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for moveItemsUp()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::moveItemsDown, currentCopyInstance.engine,&PluginInterface_CopyEngine::moveItemsDown))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for moveItemsDown()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::moveItemsOnBottom, currentCopyInstance.engine,&PluginInterface_CopyEngine::moveItemsOnBottom))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for moveItemsOnBottom()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::exportTransferList, currentCopyInstance.engine,&PluginInterface_CopyEngine::exportTransferList))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for exportTransferList()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::exportErrorIntoTransferList, currentCopyInstance.engine,&PluginInterface_CopyEngine::exportErrorIntoTransferList))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for exportErrorIntoTransferList()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::importTransferList, currentCopyInstance.engine,&PluginInterface_CopyEngine::importTransferList))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for importTransferList()");
+
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::newSpeedLimitation, this,&Core::resetSpeedDetectedInterface))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for newSpeedLimitation()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::resume, this,&Core::resetSpeedDetectedInterface))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for resume()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::cancel, this,&Core::copyInstanceCanceledByInterface,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for cancel()");
+ if(!connect(currentCopyInstance.interface,&PluginInterface_Themes::urlDropped, this,&Core::urlDropped,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for urlDropped()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::newActionOnList,this,&Core::getActionOnList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for newActionOnList()");
+
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::pushFileProgression, currentCopyInstance.interface,&PluginInterface_Themes::setFileProgression, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for pushFileProgression()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::pushGeneralProgression, currentCopyInstance.interface,&PluginInterface_Themes::setGeneralProgression, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for pushGeneralProgression()");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::pushGeneralProgression, this,&Core::pushGeneralProgression, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for pushGeneralProgression() for this");
+ if(!connect(currentCopyInstance.engine,&PluginInterface_CopyEngine::errorToRetry, currentCopyInstance.interface,&PluginInterface_Themes::errorToRetry, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"error at connect, the interface can not work correctly: "+std::to_string(index)+": "+std::to_string((uint64_t)sender())+" for errorToRetry() for this");
+
+ currentCopyInstance.interface->setSupportSpeedLimitation(currentCopyInstance.engine->supportSpeedLimitation());
+ currentCopyInstance.interface->setCopyType(currentCopyInstance.type);
+ currentCopyInstance.interface->setTransferListOperation(currentCopyInstance.transferListOperation);
+ currentCopyInstance.interface->actionInProgess(currentCopyInstance.action);
+ currentCopyInstance.interface->isInPause(currentCopyInstance.isPaused);
+ if(currentCopyInstance.haveError)
+ currentCopyInstance.interface->errorDetected();
+ 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
+ periodicSynchronizationWithIndex(index);
+}
+
+void Core::periodicSynchronization()
+{
+ unsigned int index_sub_loop=0;
+ while(index_sub_loop<copyList.size())
+ {
+ if(copyList.at(index_sub_loop).action==Ultracopier::Copying || copyList.at(index_sub_loop).action==Ultracopier::CopyingAndListing)
+ periodicSynchronizationWithIndex(index_sub_loop);
+ index_sub_loop++;
+ }
+}
+
+void Core::periodicSynchronizationWithIndex(const int &index)
+{
+ CopyInstance& currentCopyInstance=copyList[index];
+ if(currentCopyInstance.engine==NULL || currentCopyInstance.interface==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"some thread is null");
+ return;
+ }
+
+ /** ***************** Do time calcul ******************* **/
+ if(!currentCopyInstance.isPaused)
+ {
+ //calcul the last difference of the transfere
+ realByteTransfered=currentCopyInstance.engine->realByteTransfered();
+ quint64 diffCopiedSize=0;
+ if(realByteTransfered>=currentCopyInstance.lastProgression)
+ diffCopiedSize=realByteTransfered-currentCopyInstance.lastProgression;
+ currentCopyInstance.lastProgression=realByteTransfered;
+
+ // 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
+
+ //remaining time: (total byte - lastProgression)/byte per ms since the start
+ /*if(currentCopyInstance.totalProgression==0 || currentCopyInstance.currentProgression==0)
+ currentCopyInstance.interface->remainingTime(-1);
+ else if((currentCopyInstance.totalProgression-currentCopyInstance.currentProgression)>1024)
+ currentCopyInstance.interface->remainingTime(transferAddedTime*((double)currentCopyInstance.totalProgression/(double)currentCopyInstance.currentProgression-1)/1000);*/
+
+ //do the speed calculation
+ if(lastProgressionTime.isNull())
+ lastProgressionTime.start();
+ else
+ {
+ if((currentCopyInstance.action==Ultracopier::Copying || currentCopyInstance.action==Ultracopier::CopyingAndListing))
+ {
+ currentCopyInstance.lastSpeedTime.push_back(lastProgressionTime.elapsed());
+ currentCopyInstance.lastSpeedDetected.push_back(diffCopiedSize);
+ currentCopyInstance.lastAverageSpeedTime.push_back(lastProgressionTime.elapsed());
+ currentCopyInstance.lastAverageSpeedDetected.push_back(diffCopiedSize);
+ while(currentCopyInstance.lastSpeedTime.size()>ULTRACOPIER_MAXVALUESPEEDSTORED)
+ currentCopyInstance.lastSpeedTime.erase(currentCopyInstance.lastSpeedTime.cbegin());
+ while(currentCopyInstance.lastSpeedDetected.size()>ULTRACOPIER_MAXVALUESPEEDSTORED)
+ currentCopyInstance.lastSpeedDetected.erase(currentCopyInstance.lastSpeedDetected.cbegin());
+ while(currentCopyInstance.lastAverageSpeedTime.size()>ULTRACOPIER_MAXVALUESPEEDSTOREDTOREMAININGTIME)
+ currentCopyInstance.lastAverageSpeedTime.erase(currentCopyInstance.lastAverageSpeedTime.cbegin());
+ while(currentCopyInstance.lastAverageSpeedDetected.size()>ULTRACOPIER_MAXVALUESPEEDSTOREDTOREMAININGTIME)
+ currentCopyInstance.lastAverageSpeedDetected.erase(currentCopyInstance.lastAverageSpeedDetected.cbegin());
+ double totTime=0,totAverageTime=0;
+ double totSpeed=0,totAverageSpeed=0;
+
+ //current speed
+ unsigned int index_sub_loop=0;
+ while(index_sub_loop<currentCopyInstance.lastSpeedDetected.size())
+ {
+ totTime+=currentCopyInstance.lastSpeedTime.at(index_sub_loop);
+ totSpeed+=currentCopyInstance.lastSpeedDetected.at(index_sub_loop);
+ index_sub_loop++;
+ }
+ totTime/=1000;
+
+ //speed to calculate the remaining time
+ index_sub_loop=0;
+ while(index_sub_loop<currentCopyInstance.lastAverageSpeedDetected.size())
+ {
+ totAverageTime+=currentCopyInstance.lastAverageSpeedTime.at(index_sub_loop);
+ totAverageSpeed+=currentCopyInstance.lastAverageSpeedDetected.at(index_sub_loop);
+ index_sub_loop++;
+ }
+ totAverageTime/=1000;
+
+ if(totTime>0)
+ if(currentCopyInstance.lastAverageSpeedDetected.size()>=ULTRACOPIER_MINVALUESPEED)
+ currentCopyInstance.interface->detectedSpeed(totSpeed/totTime);
+
+ if(totAverageTime>0)
+ if(currentCopyInstance.lastAverageSpeedDetected.size()>=ULTRACOPIER_MINVALUESPEEDTOREMAININGTIME)
+ {
+ if(currentCopyInstance.remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Traditional)
+ {
+ if(totSpeed>0)
+ {
+ //remaining time: (total byte - lastProgression)/byte per ms since the start
+ if(currentCopyInstance.totalProgression==0 || currentCopyInstance.currentProgression==0)
+ currentCopyInstance.interface->remainingTime(-1);
+ else if((currentCopyInstance.totalProgression-currentCopyInstance.currentProgression)>1024)
+ currentCopyInstance.interface->remainingTime((currentCopyInstance.totalProgression-currentCopyInstance.currentProgression)/(totAverageSpeed/totAverageTime));
+ }
+ else
+ currentCopyInstance.interface->remainingTime(-1);
+ }
+ else if(currentCopyInstance.remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Logarithmic)
+ {
+ int remainingTimeValue=0;
+ //calculate for each file class
+ index_sub_loop=0;
+ while(index_sub_loop<currentCopyInstance.remainingTimeLogarithmicValue.size())
+ {
+ const RemainingTimeLogarithmicColumn &remainingTimeLogarithmicColumn=currentCopyInstance.remainingTimeLogarithmicValue.at(index_sub_loop);
+ //normal detect
+ const quint64 &remainingSize=remainingTimeLogarithmicColumn.totalSize-remainingTimeLogarithmicColumn.transferedSize;
+ if(remainingTimeLogarithmicColumn.lastProgressionSpeed.size()>=ULTRACOPIER_MINVALUESPEED)
+ {
+ int average_speed=0;
+ unsigned int temp_loop_index=0;
+ while(temp_loop_index<remainingTimeLogarithmicColumn.lastProgressionSpeed.size())
+ {
+ average_speed+=remainingTimeLogarithmicColumn.lastProgressionSpeed.at(temp_loop_index);
+ temp_loop_index++;
+ }
+ average_speed/=remainingTimeLogarithmicColumn.lastProgressionSpeed.size();
+ remainingTimeValue+=remainingSize/average_speed;
+ }
+ //fallback
+ else
+ {
+ if(totSpeed>0)
+ {
+ //remaining time: (total byte - lastProgression)/byte per ms since the start
+ if(currentCopyInstance.totalProgression==0 || currentCopyInstance.currentProgression==0)
+ remainingTimeValue+=1;
+ else if((currentCopyInstance.totalProgression-currentCopyInstance.currentProgression)>1024)
+ remainingTimeValue+=remainingSize/totAverageSpeed;
+ }
+ else
+ remainingTimeValue+=1;
+ }
+ index_sub_loop++;
+ }
+ currentCopyInstance.interface->remainingTime(remainingTimeValue);
+ }
+ else
+ {}//error case
+ }
+ }
+ lastProgressionTime.restart();
+ }
+ }
+}
+
+uint8_t Core::fileCatNumber(uint64_t size)
+{
+ //all is in base 10 to understand more easily
+ //drop the big value
+ if(size>ULTRACOPIER_REMAININGTIME_BIGFILEMEGABYTEBASE10*1000*1000)
+ size=ULTRACOPIER_REMAININGTIME_BIGFILEMEGABYTEBASE10*1000*1000;
+ size=size/100;//to group all the too small file into the value 0
+ return log10(size);
+}
+
+/// \brief the copy engine have canceled the transfer
+void Core::copyInstanceCanceledByEngine()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ copyInstanceCanceledByIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the copy engine sender");
+}
+
+/// \brief the interface have canceled the transfer
+void Core::copyInstanceCanceledByInterface()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ int index=indexCopySenderInterface();
+ if(index!=-1)
+ copyInstanceCanceledByIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the copy engine sender");
+}
+
+/// \brief the transfer have been canceled
+void Core::copyInstanceCanceledByIndex(const unsigned int &index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, remove with the index: "+std::to_string(index));
+ //disconnectEngine(index);
+ //disconnectInterface(index);
+ copyList[index].canceled=true;
+ CopyInstance& currentCopyInstance=copyList[index];
+ currentCopyInstance.engine->cancel();
+ delete currentCopyInstance.nextConditionalSync;
+ delete currentCopyInstance.interface;
+ unsigned int index_sub_loop=0;
+ while(index_sub_loop<currentCopyInstance.orderId.size())
+ {
+ emit copyCanceled(currentCopyInstance.orderId.at(index_sub_loop));
+ index_sub_loop++;
+ }
+ currentCopyInstance.orderId.clear();
+ copyList.erase(copyList.cbegin()+index);
+ if(copyList.size()==0)
+ forUpateInformation.stop();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"copyList.size(): "+std::to_string(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(Ultracopier::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(Ultracopier::DebugLevel_Warning,"Qt sender() NULL");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, delete the copy engine");
+ delete copyEngine;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop, delete the copy engine");
+}
+
+//error occurred
+void Core::error(const std::string &path,const uint64_t &size,const uint64_t &mtime,const std::string &error)
+{
+ log.error(path,size,mtime,error);
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ {
+ copyList[index].haveError=true;
+ copyList.at(index).interface->errorDetected();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the copy engine sender");
+}
+
+//for the extra logging
+void Core::rmPath(const std::string &path)
+{
+ log.rmPath(path);
+}
+
+void Core::mkPath(const std::string &path)
+{
+ log.mkPath(path);
+}
+
+/// \brief to rsync after a new interface connection
+void Core::syncReady()
+{
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ copyList[index].copyEngineIsSync=true;
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the copy engine sender");
+}
+
+void Core::getActionOnList(const std::vector<Ultracopier::ReturnActionOnCopyList> &actionList)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //send the the interface
+ const int &index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start2");
+ if(copyList.at(index).copyEngineIsSync)
+ copyList.at(index).interface->getActionOnList(actionList);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start3");
+ //log to the file and compute the remaining time
+ if(log.logTransfer() || copyList.at(index).remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Logarithmic)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start4");
+ unsigned int sub_index=0;
+ if(log.logTransfer() && copyList.at(index).remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Logarithmic)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start5");
+ while(sub_index<actionList.size())
+ {
+ const Ultracopier::ReturnActionOnCopyList &returnAction=actionList.at(sub_index);
+ switch(returnAction.type)
+ {
+ case Ultracopier::PreOperation:
+ log.newTransferStart(returnAction.addAction);
+ break;
+ case Ultracopier::RemoveItem:
+ if(returnAction.userAction.moveAt==0)
+ log.newTransferStop(returnAction.addAction);
+ else
+ log.transferSkip(returnAction.addAction);
+ if(copyList.at(index).remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Logarithmic)
+ {
+ const quint8 &col=fileCatNumber(returnAction.addAction.size);
+ copyList[index].remainingTimeLogarithmicValue[col].transferedSize+=returnAction.addAction.size;
+ }
+ break;
+ case Ultracopier::AddingItem:
+ if(copyList.at(index).remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Logarithmic)
+ {
+ const quint8 &col=fileCatNumber(returnAction.addAction.size);
+ copyList[index].remainingTimeLogarithmicValue[col].totalSize+=returnAction.addAction.size;
+ }
+ break;
+ default:
+ break;
+ }
+ sub_index++;
+ }
+ }
+ else if(log.logTransfer())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start6");
+ while(sub_index<actionList.size())
+ {
+ const Ultracopier::ReturnActionOnCopyList &returnAction=actionList.at(sub_index);
+ switch(returnAction.type)
+ {
+ case Ultracopier::PreOperation:
+ log.newTransferStart(returnAction.addAction);
+ break;
+ case Ultracopier::RemoveItem:
+ if(returnAction.userAction.moveAt==0)
+ log.newTransferStop(returnAction.addAction);
+ else
+ log.transferSkip(returnAction.addAction);
+ if(copyList.at(index).remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Logarithmic)
+ {
+ const quint8 &col=fileCatNumber(returnAction.addAction.size);
+ copyList[index].remainingTimeLogarithmicValue[col].transferedSize+=returnAction.addAction.size;
+ }
+ break;
+ default:
+ break;
+ }
+ sub_index++;
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start7");
+ while(sub_index<actionList.size())
+ {
+ const Ultracopier::ReturnActionOnCopyList &returnAction=actionList.at(sub_index);
+ switch(returnAction.type)
+ {
+ case Ultracopier::RemoveItem:
+ if(copyList.at(index).remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Logarithmic)
+ {
+ const quint8 &col=fileCatNumber(returnAction.addAction.size);
+ copyList[index].remainingTimeLogarithmicValue[col].transferedSize+=returnAction.addAction.size;
+ }
+ break;
+ case Ultracopier::AddingItem:
+ if(copyList.at(index).remainingTimeAlgo==Ultracopier::RemainingTimeAlgo_Logarithmic)
+ {
+ const quint8 &col=fileCatNumber(returnAction.addAction.size);
+ copyList[index].remainingTimeLogarithmicValue[col].totalSize+=returnAction.addAction.size;
+ }
+ break;
+ default:
+ break;
+ }
+ sub_index++;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start8");
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start9");
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the copy engine sender");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start end");
+}
+
+void Core::pushGeneralProgression(const uint64_t &current,const uint64_t &total)
+{
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ {
+ copyList[index].currentProgression=current;
+ copyList[index].totalProgression=total;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the copy engine sender");
+}
+
+/// \brief used to drag and drop files
+void Core::urlDropped(const std::vector<std::string> &urls)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ int bindex=indexCopySenderInterface();
+ if(bindex!=-1)
+ {
+ const unsigned int &index=static_cast<unsigned int>(bindex);
+ std::vector<std::string> sources;
+ unsigned int index_loop=0;
+ while(index_loop<urls.size())
+ {
+ if(!urls.at(index_loop).empty())
+ sources.push_back(urls.at(index_loop));
+ index_loop++;
+ }
+ if(sources.size()==0)
+ return;
+ else
+ {
+ if(copyList.at(index).ignoreMode)
+ {
+ QMessageBox::StandardButton reply=QMessageBox::question(copyList.at(index).interface,tr("Transfer mode"),tr("Do you want to copy? If no, it will be moved."),QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,QMessageBox::Cancel);
+ if(reply==QMessageBox::Yes)
+ copyList.at(index).engine->newCopy(sources);
+ if(reply==QMessageBox::No)
+ copyList.at(index).engine->newMove(sources);
+ }
+ else
+ {
+ if(copyList.at(index).mode==Ultracopier::Copy)
+ copyList.at(index).engine->newCopy(sources);
+ else
+ copyList.at(index).engine->newMove(sources);
+ }
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to locate the copy engine sender");
+}
diff --git a/Core.h b/Core.h
new file mode 100644
index 0000000..cd8733e
--- /dev/null
+++ b/Core.h
@@ -0,0 +1,197 @@
+/** \file Core.h
+\brief Define the class definition for core, the Copy of each copy/move window
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef CORE_H
+#define CORE_H
+
+#include <QObject>
+#include <QStringList>
+#include <QString>
+#include <QList>
+#include <QTimer>
+#include <QTime>
+#include <QFile>
+#include <QUrl>
+
+#include "Environment.h"
+#include "StructEnumDefinition.h"
+#include "CopyEngineManager.h"
+#include "LogThread.h"
+#include "interface/PluginInterface_CopyEngine.h"
+#include "interface/PluginInterface_Themes.h"
+
+/** \brief Define the class definition for core, the Copy of each copy/move window
+
+This class provide a core for dispatch the event of signal/slot, it checks too if not other instance is running */
+class Core : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief Initate the core of one copy or move window, dispatch the event specific at this window
+ Core(CopyEngineManager *copyEngineList);
+ ~Core();
+ private:
+ CopyEngineManager *copyEngineList;
+ struct RunningTransfer
+ {
+ Ultracopier::ItemOfCopyList item;
+ bool progression;
+ };
+ struct RemainingTimeLogarithmicColumn
+ {
+ std::vector<int> lastProgressionSpeed;
+ uint64_t totalSize;
+ uint64_t transferedSize;
+ };
+
+ struct CopyInstance
+ {
+ unsigned int id;
+ PluginInterface_CopyEngine * engine;
+ PluginInterface_Themes * interface;
+ bool ignoreMode;
+ Ultracopier::CopyMode mode;
+ uint64_t numberOfFile;
+ uint64_t numberOfTransferedFile;
+ uint64_t currentProgression,totalProgression;//store the file byte transfered, used into the remaining time
+ Ultracopier::EngineActionInProgress action;
+ uint64_t lastProgression;//store the real byte transfered, used in speed calculation
+ std::vector<RunningTransfer> transferItemList;//full info of started item, to have wich progression to poll
+ std::vector<uint32_t> orderId;//external order send via listener plugin
+ std::string folderListing;
+ std::string collisionAction;
+ std::string errorAction;
+ bool isPaused;
+ bool isRunning;
+ Ultracopier::CopyType type;
+ Ultracopier::TransferListOperation transferListOperation;
+ bool haveError;
+ QTime lastConditionalSync;
+ QTimer *nextConditionalSync;
+ bool copyEngineIsSync;
+ bool canceled;//to not try groun when is in canceling
+
+ Ultracopier::RemainingTimeAlgo remainingTimeAlgo;
+
+ /** for RemainingTimeAlgo_Traditional **/
+ //this speed is for instant speed
+ std::vector<uint64_t> lastSpeedDetected;//stored in bytes
+ std::vector<double> lastSpeedTime;//stored in ms
+ //this speed is average speed on more time to calculate the remaining time
+ std::vector<uint64_t> lastAverageSpeedDetected;//stored in bytes
+ std::vector<double> lastAverageSpeedTime;//stored in ms
+
+ /** for RemainingTimeAlgo_Logarithmic **/
+ std::vector<RemainingTimeLogarithmicColumn> remainingTimeLogarithmicValue;
+ };
+ std::vector<CopyInstance> copyList;
+ /** 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 Ultracopier::CopyMode &mode,const bool &ignoreMode,const std::vector<std::string> &protocolsUsedForTheSources=std::vector<std::string>(),const std::string &protocolsUsedForTheDestination="");
+ /** open with specific copy engine
+ \param move Copy or move
+ \param ignoreMode if need ignore the mode
+ \param name protocols used for sources
+ */
+ int openNewCopyEngineInstance(const Ultracopier::CopyMode &mode,const bool &ignoreMode,const std::string &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 unsigned int &index);
+ void connectInterfaceAndSync(const unsigned int &index);
+ //void disconnectEngine(const int &index);
+ //void disconnectInterface(const int &index);
+
+ /** \brief update at periodic interval, the synchronization between copy engine and interface, but for specific entry
+ \see forUpateInformation */
+ void periodicSynchronizationWithIndex(const int &index);
+
+ //for the internal management
+ unsigned int incrementId();
+ unsigned int nextId;
+ std::vector<unsigned int> idList;
+ QTime lastProgressionTime;
+ QTimer forUpateInformation;///< used to call \see periodicSynchronization()
+ void resetSpeedDetected(const unsigned int &bindex);
+
+ /** Connect the copy engine instance provided previously to the management */
+ int connectCopyEngine(const Ultracopier::CopyMode &mode,bool ignoreMode,const CopyEngineManager::returnCopyEngine &returnInformations);
+
+ LogThread log;///< To save the log like mkpath, rmpath, error, copy, ...
+ uint64_t realByteTransfered;
+
+ static uint8_t fileCatNumber(uint64_t size);
+ signals:
+ void copyFinished(const uint32_t & orderId,bool withError) const;
+ void copyCanceled(const uint32_t & orderId) const;
+ public slots:
+ /** \brief do copy with sources, but ask the destination */
+ void newCopyWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources);
+ void newTransfer(const Ultracopier::CopyMode &mode,const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources,const std::string &protocolsUsedForTheDestination,const std::string &destination);
+ /** \brief do copy with sources and destination */
+ void newCopy(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources,const std::string &protocolsUsedForTheDestination,const std::string &destination);
+ /** \brief do move with sources, but ask the destination */
+ void newMoveWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources);
+ /** \brief do move with sources and destination */
+ void newMove(const uint32_t &orderId,const std::vector<std::string> &protocolsUsedForTheSources,const std::vector<std::string> &sources,const std::string &protocolsUsedForTheDestination,const std::string &destination);
+ /** \brief open copy/move windows with specific engine */
+ void addWindowCopyMove(const Ultracopier::CopyMode &mode,const std::string &name);
+ /** \brief open transfer (copy+move) windows with specific engine */
+ void addWindowTransfer(const std::string &name);
+ /** new transfer list pased by the CLI */
+ void newTransferList(std::string engine,std::string mode,std::string file);
+
+ bool startNewTransferOneUniqueCopyEngine();
+ 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 unsigned 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 Ultracopier::EngineActionInProgress &action);
+ void newFolderListing(const std::string &path);
+ void isInPause(const bool&);
+
+ /** \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 std::string &path,const uint64_t &size,const uint64_t &mtime,const std::string &error);
+ //for the extra logging
+ void rmPath(const std::string &path);
+ void mkPath(const std::string &path);
+
+ /// \brief used to drag and drop files
+ void urlDropped(const std::vector<std::string> &urls);
+ /// \brief to rsync after a new interface connection
+ void syncReady();
+ void doneTime(const std::vector<std::pair<uint64_t,uint32_t> > &timeList);
+
+ void getActionOnList(const std::vector<Ultracopier::ReturnActionOnCopyList> & actionList);
+ void pushGeneralProgression(const uint64_t &current,const uint64_t &total);
+};
+
+#endif // CORE_H
diff --git a/DebugEngine.cpp b/DebugEngine.cpp
new file mode 100644
index 0000000..2168210
--- /dev/null
+++ b/DebugEngine.cpp
@@ -0,0 +1,395 @@
+/** \file DebugEngine.cpp
+\brief Define the class for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QDir>
+#include <QMessageBox>
+#include <QFileDialog>
+#include <QLocalSocket>
+#include <regex>
+#include <iostream>
+
+#include "Variable.h"
+#include "DebugEngine.h"
+#include "ExtraSocket.h"
+#include "cpp11addition.h"
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \brief The local macro: ULTRACOPIER_DEBUGCONSOLE
+#if defined (__FILE__) && defined (__LINE__)
+# define ULTRACOPIER_DEBUGCONSOLE(a,b) addDebugInformation(a,__func__,b,__FILE__,__LINE__)
+#else
+# define ULTRACOPIER_DEBUGCONSOLE(a,b) addDebugInformation(a,__func__,b)
+#endif
+
+#ifdef ULTRACOPIER_DEBUG
+
+/// \brief initiate the ultracopier event dispatcher and check if no other session is running
+DebugEngine::DebugEngine()
+{
+ //fileNameCleaner=std::regex("\\.\\.?[/\\\\]([^/]+[/\\\\])?");
+ quit=false;
+ QStringList ultracopierArguments=QCoreApplication::arguments();
+ if(ultracopierArguments.size()==2)
+ if(ultracopierArguments.last()=="quit")
+ quit=true;
+ addDebugInformationCallNumber=0;
+ //Load the first content
+ debugHtmlContent+="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">";
+ debugHtmlContent+="<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\">";
+ debugHtmlContent+="<head>";
+ debugHtmlContent+="<meta name=\"Language\" content=\"en\" />";
+ debugHtmlContent+="<meta http-equiv=\"content-language\" content=\"english\" />";
+ debugHtmlContent+="<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />";
+ debugHtmlContent+="<style type=\"text/css\">";
+ debugHtmlContent+="body{font-family:\"DejaVu Sans Mono\";font-size:9pt;}";
+ debugHtmlContent+=".Information td{color:#7485df;}";
+ debugHtmlContent+=".Critical td{color:#ff0c00;background-color:#FFFE8C;}";
+ debugHtmlContent+=".Warning td{color:#efa200;}";
+ debugHtmlContent+=".Notice td{color:#999;}";
+ debugHtmlContent+=".time{font-weight:bold;}";
+ debugHtmlContent+=".Note{font-weight:bold;font-size:1.5em}";
+ debugHtmlContent+=".function{font-style:italic;text-decoration:underline}";
+ debugHtmlContent+=".location{padding-right:15px;}";
+ debugHtmlContent+="td {white-space:nowrap;}";
+ debugHtmlContent+="</style>";
+ debugHtmlContent+="<title>";
+ debugHtmlContent+="Ultracopier";
+ debugHtmlContent+=" "+std::string(ULTRACOPIER_VERSION)+" "+ULTRACOPIER_PLATFORM_NAME.toStdString()+", debug report</title>";
+ debugHtmlContent+="</head>";
+ debugHtmlContent+="<body>";
+ debugHtmlContent+="<table>";
+ //Load the start time at now
+ startTime.start();
+ //Load the log file end
+ endOfLogFile="</table></body></html>";
+ //check if other instance is running, then switch to memory backend
+ if(tryConnect())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_custom_Notice,"currentBackend: File because other session is runing");
+ currentBackend=Memory;
+ return;
+ }
+ //The lock and log file path is not defined
+ bool fileNameIsLoaded=false;
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ #ifdef ULTRACOPIER_VERSION_PORTABLEAPPS
+ //Load the data folder path
+ QDir dir(QCoreApplication::applicationDirPath());
+ dir.cdUp();
+ dir.cdUp();
+ dir.cd("Data");
+ logFile.setFileName(dir.absolutePath()+FacilityEngine::separator()+"log.html");
+ lockFile.setFileName(dir.absolutePath()+FacilityEngine::separator()+"ultracopier.lock");
+ fileNameIsLoaded=true;
+ #else
+ //Load the ultracopier path
+ QDir dir(QCoreApplication::applicationDirPath());
+ logFile.setFileName(dir.absolutePath()+FacilityEngine::separator()+"log.html");
+ lockFile.setFileName(dir.absolutePath()+FacilityEngine::separator()+"ultracopier.lock");
+ fileNameIsLoaded=true;
+ #endif
+ #else
+ #ifdef Q_OS_WIN32
+ #define EXTRA_HOME_PATH "\\ultracopier\\"
+ #else
+ #define EXTRA_HOME_PATH "/.config/Ultracopier/"
+ #endif
+ //Load the user path only if exists and writable
+ QDir dir(QDir::homePath()+EXTRA_HOME_PATH);
+ bool errorFound=false;
+ //If user's directory not exists create it
+ if(!dir.exists())
+ {
+ //If failed not load the file
+ if(!dir.mkpath(dir.absolutePath()))
+ {
+ errorFound=true;
+ puts(qPrintable("Unable to make path: "+dir.absolutePath()+", disable file log"));
+ }
+ }
+ //If no error found set the file name
+ if(errorFound==false)
+ {
+ fileNameIsLoaded=true;
+ logFile.setFileName(dir.absolutePath()+QDir::separator()+"log.html");
+ lockFile.setFileName(dir.absolutePath()+QDir::separator()+"ultracopier.lock");
+ }
+ //errorFound=false;
+ #endif
+ //If the file name is loaded
+ if(fileNameIsLoaded)
+ {
+ //If the previous file is here, then crash previous, ask if the user want to save
+ if(lockFile.exists() && logFile.exists() && !quit)
+ {
+ //Try open the file as read only to propose save it as the user
+ //Don't ask it if unable to write, because unable to remove, then alert at all start
+ if(removeTheLockFile())
+ {
+ //Ask to the user
+ QMessageBox::StandardButton reply = QMessageBox::question(NULL,"Save the previous report",
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ QString("Supercopier")+
+ #else
+ QString("Ultracopier")+
+ #endif
+ " seam have crashed, do you want save the previous report for report it to the forum?",QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
+ if(reply==QMessageBox::Yes)
+ saveBugReport();
+ }
+ else
+ puts(qPrintable(logFile.fileName()+" unable to open it as read"));
+ }
+ //Now try to create and open the log file and lock file
+ if(!lockFile.open(QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Unbuffered))
+ {
+ currentBackend=Memory;
+ puts(qPrintable(lockFile.fileName()+" unable to open it as write, log into file disabled"));
+ }
+ else
+ {
+ if(!logFile.open(QIODevice::ReadWrite|QIODevice::Truncate|QIODevice::Unbuffered))
+ {
+ currentBackend=Memory;
+ puts(qPrintable(logFile.fileName()+" unable to open it as write, log into file disabled"));
+ removeTheLockFile();
+ }
+ else
+ {
+ logFile.resize(0);
+ currentBackend=File;
+ logFile.write(debugHtmlContent.data(),static_cast<qint64>(debugHtmlContent.size()));
+ }
+ }
+ }
+}
+
+/// \brief Destroy the ultracopier event dispatcher
+DebugEngine::~DebugEngine()
+{
+ if(currentBackend==File)
+ {
+ removeTheLockFile();
+ //Finalize the log file
+ logFile.write(endOfLogFile.data(),static_cast<qint64>(endOfLogFile.size()));
+ logFile.close();
+ }
+}
+
+/// \brief ask to the user where save the bug report
+void DebugEngine::saveBugReport()
+{
+ bool errorFound;
+ do
+ {
+ errorFound=false;
+ //Ask where it which save it
+ QString fileName = QFileDialog::getSaveFileName(NULL,"Save file","ultracopier-bug-report.log.html","Log file (*.log.html)");
+ if(fileName!="")
+ {
+ if(QFile::exists(fileName))
+ {
+ if(!QFile::remove(fileName))
+ {
+ errorFound=true;
+ puts(qPrintable(fileName+" unable remove it"));
+ QMessageBox::critical(NULL,"Error","Unable to save the bug report");
+ }
+ }
+ if(!errorFound)
+ {
+ //Open the destination as write
+ if(!logFile.copy(fileName))
+ {
+ errorFound=true;
+ puts(qPrintable(fileName+" unable to open it as write: "+logFile.errorString()));
+ QMessageBox::critical(NULL,"Error","Unable to save the bug report"+logFile.errorString());
+ }
+ }
+ }
+ } while(errorFound!=false);
+}
+
+/// \brief Internal function to remove the lock file
+bool DebugEngine::removeTheLockFile()
+{
+ //close the file and remove it
+ lockFile.close();
+ if(!lockFile.remove())
+ {
+ puts(qPrintable(lockFile.fileName()+" unable to remove it, crash report at the next start"));
+ return false;
+ }
+ else
+ return true;
+}
+
+void DebugEngine::addDebugInformationStatic(const Ultracopier::DebugLevel &level,const std::string& function,const std::string& text,const std::string& file,const int& ligne,const std::string& location)
+{
+ if(DebugEngine::debugEngine==NULL)
+ {
+ std::cerr << "After close: " << function << file << ligne;
+ return;
+ }
+ DebugLevel_custom tempLevel=DebugLevel_custom_Information;
+ switch(level)
+ {
+ case Ultracopier::DebugLevel_Information:
+ tempLevel=DebugLevel_custom_Information;
+ break;
+ case Ultracopier::DebugLevel_Critical:
+ tempLevel=DebugLevel_custom_Critical;
+ break;
+ case Ultracopier::DebugLevel_Warning:
+ tempLevel=DebugLevel_custom_Warning;
+ break;
+ case Ultracopier::DebugLevel_Notice:
+ tempLevel=DebugLevel_custom_Notice;
+ break;
+ default:
+ tempLevel=DebugLevel_custom_Notice;
+ }
+ DebugEngine::debugEngine->addDebugInformation(tempLevel,function,text,file,ligne,location);
+}
+
+void DebugEngine::addDebugNote(const std::string& text)
+{
+ if(DebugEngine::debugEngine==NULL)
+ return;
+ DebugEngine::debugEngine->addDebugInformation(DebugLevel_custom_UserNote,"",text,"",-1,"Core");
+}
+
+/// \brief For add message info, this function is thread safe
+void DebugEngine::addDebugInformation(const DebugLevel_custom &level,const std::string& function,const std::string& text,std::string file,const int& ligne,const std::string& location)
+{
+ if(DebugEngine::debugEngine==NULL)
+ {
+ std::cerr << "After close: " << function << file << ligne;
+ return;
+ }
+ //Remove the compiler extra patch generated
+ //file=file.remove(fileNameCleaner);don't clean, too many performance heart
+ std::string addDebugInformation_lignestring=std::to_string(ligne);
+ std::string addDebugInformation_fileString=file;
+ if(ligne!=-1)
+ addDebugInformation_fileString+=":"+addDebugInformation_lignestring;
+ //Load the time from start
+ std::string addDebugInformation_time = std::to_string(startTime.elapsed());
+ std::string addDebugInformation_htmlFormat;
+ bool important=true;
+ switch(level)
+ {
+ case DebugLevel_custom_Information:
+ addDebugInformation_htmlFormat="<tr class=\"Information\"><td class=\"time\">";
+ break;
+ case DebugLevel_custom_Critical:
+ addDebugInformation_htmlFormat="<tr class=\"Critical\"><td class=\"time\">";
+ break;
+ case DebugLevel_custom_Warning:
+ addDebugInformation_htmlFormat="<tr class=\"Warning\"><td class=\"time\">";
+ break;
+ case DebugLevel_custom_Notice:
+ {
+ addDebugInformation_htmlFormat="<tr class=\"Notice\"><td class=\"time\">";
+ important=false;
+ }
+ break;
+ case DebugLevel_custom_UserNote:
+ addDebugInformation_htmlFormat="<tr class=\"Note\"><td class=\"time\">";
+ break;
+ }
+ addDebugInformation_htmlFormat+=addDebugInformation_time+"</span></td><td>"+addDebugInformation_fileString+"</td><td class=\"function\">"+function+"()</td><td class=\"location\">"+location+"</td><td>"+htmlEntities(text)+"</td></tr>\n";
+ //To prevent access of string in multi-thread
+ {
+ //Show the text in console
+ std::string addDebugInformation_textFormat;
+ if(addDebugInformation_time.size()<8)
+ addDebugInformation_time=std::string(8-addDebugInformation_time.size(),' ')+addDebugInformation_time;
+ addDebugInformation_textFormat = "("+addDebugInformation_time+") ";
+ if(!file.empty() && ligne!=-1)
+ addDebugInformation_textFormat += file+":"+addDebugInformation_lignestring+":";
+ addDebugInformation_textFormat += function+"(), (location: "+location+"): "+text;
+ QMutexLocker lock_mutex(&mutex);
+ if(currentBackend==File)
+ {
+ if(logFile.size()<ULTRACOPIER_DEBUG_MAX_ALL_SIZE*1024*1024 || (important && logFile.size()<ULTRACOPIER_DEBUG_MAX_IMPORTANT_SIZE*1024*1024))
+ {
+ std::cout << addDebugInformation_textFormat << std::endl;
+ logFile.write(addDebugInformation_htmlFormat.data(),static_cast<qint64>(addDebugInformation_htmlFormat.size()));
+ }
+ }
+ else
+ {
+ if(debugHtmlContent.size()<ULTRACOPIER_DEBUG_MAX_ALL_SIZE*1024*1024 || (important && debugHtmlContent.size()<ULTRACOPIER_DEBUG_MAX_IMPORTANT_SIZE*1024*1024))
+ {
+ std::cout << addDebugInformation_textFormat << std::endl;
+ debugHtmlContent+=addDebugInformation_htmlFormat;
+ }
+ }
+ //Send the new line
+ if(addDebugInformationCallNumber<ULTRACOPIER_DEBUG_MAX_GUI_LINE)
+ {
+ addDebugInformationCallNumber++;
+ DebugModel::debugModel->addDebugInformation(startTime.elapsed(),level,function,text,file,static_cast<const unsigned int>(ligne),location);
+ }
+ }
+}
+
+/// \brief Get the html text info for re-show it
+std::string DebugEngine::getTheDebugHtml()
+{
+ if(currentBackend==File)
+ {
+ logFile.seek(0);
+ if(!logFile.isOpen())
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_custom_Warning,"The log file is not open");
+ const QByteArray &data=logFile.readAll();
+ return std::string(data.constData(),static_cast<size_t>(data.size()))+endOfLogFile;
+ }
+ else
+ return debugHtmlContent+endOfLogFile;
+}
+
+/// \brief Get the html end
+std::string DebugEngine::getTheDebugEnd()
+{
+ return endOfLogFile;
+}
+
+/// \brief Drop the html entities
+std::string DebugEngine::htmlEntities(const std::string &text)
+{
+ std::string newText(text);
+ stringreplaceAll(newText,"&","&amp;");
+ /*stringreplaceAll(newText,"\"","&quot;");
+ stringreplaceAll(newText,"\\","&#039;");*/
+ stringreplaceAll(newText,"<","&lt;");
+ stringreplaceAll(newText,">","&gt;");
+ return newText;
+}
+
+/// \brief return the current backend
+DebugEngine::Backend DebugEngine::getCurrentBackend()
+{
+ return currentBackend;
+}
+
+bool DebugEngine::tryConnect()
+{
+ QLocalSocket localSocket;
+ localSocket.connectToServer(QString::fromStdString(ExtraSocket::pathSocket(ULTRACOPIER_SOCKETNAME)),QIODevice::WriteOnly|QIODevice::Unbuffered);
+ if(localSocket.waitForConnected(1000))
+ {
+ localSocket.disconnectFromServer();
+ return true;
+ }
+ else
+ return false;
+}
+
+#endif
diff --git a/DebugEngine.h b/DebugEngine.h
new file mode 100644
index 0000000..7a75264
--- /dev/null
+++ b/DebugEngine.h
@@ -0,0 +1,131 @@
+/** \file DebugEngine.h
+\brief Define the class for the debug
+\author alpha_one_x86
+\note This class don't need be thread safe because ultracopier is done with one thread, but I have implement some basic thread protection
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUG_ENGINE_H
+#define DEBUG_ENGINE_H
+
+#include <QObject>
+#include <QString>
+#include <string>
+#include <QFile>
+#include <QMutex>
+#include <QTime>
+#include <QTimer>
+#include <QList>
+#include <QCoreApplication>
+#include <QAbstractTableModel>
+#include <QRegularExpression>
+#include <regex>
+
+#include "Variable.h"
+#include "PlatformMacro.h"
+#include "StructEnumDefinition.h"
+#include "StructEnumDefinition_UltracopierSpecific.h"
+
+#ifdef ULTRACOPIER_DEBUG
+
+class DebugModel : public QAbstractTableModel
+{
+ Q_OBJECT
+public:
+ /// \brief the transfer item displayed
+ struct DebugItem
+ {
+ unsigned int time;
+ DebugLevel_custom level;
+ std::string function;
+ std::string text;
+ std::string file;
+ std::string location;
+ };
+
+ static DebugModel *debugModel;
+ DebugModel();
+ ~DebugModel();
+
+ virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
+ virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+ virtual bool setData(const QModelIndex&, const QVariant&, int = Qt::EditRole);
+
+ void addDebugInformation(const int &time, const DebugLevel_custom &level, const std::string& function, const std::string& text, const std::string &file="", const unsigned int& ligne=0, const std::string& location="Core");
+ void setupTheTimer();
+ QTimer *updateDisplayTimer;
+ bool displayed;
+ bool inWaitOfDisplay;
+private:
+ std::vector<DebugItem> list;
+private slots:
+ void updateDisplay();
+};
+
+/** \brief Define the class for the debug
+
+This class provide all needed for the debug mode of ultracopier */
+class DebugEngine : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief Initiate the ultracopier event dispatcher and check if no other session is running
+ DebugEngine();
+ /** \brief Destroy the ultracopier event dispatcher
+ \note This function is thread safe */
+ ~DebugEngine();
+ /** \brief Get the html text info for re-show it
+ \note This function is thread safe */
+ std::string getTheDebugHtml();
+ /// \brief Enumeration of backend
+ enum Backend
+ {
+ Memory, //Do intensive usage of memory, used only if the file backend is not available
+ File //Store all directly into file, at crash the backtrace is into the file
+ };
+ /// \brief return the current backend
+ Backend getCurrentBackend();
+ /// \brief Get the html end
+ std::string getTheDebugEnd();
+ /** \brief For add message info, this function
+ \note This function is reentrant */
+ static void addDebugInformationStatic(const Ultracopier::DebugLevel &level,const std::string& function,const std::string& text,const std::string& file="",const int& ligne=-1,const std::string& location="Core");
+ static void addDebugNote(const std::string& text);
+ static DebugEngine *debugEngine;
+ public slots:
+ /** \brief ask to the user where save the bug report
+ \warning This function can be only call by the graphical thread */
+ void saveBugReport();
+ void addDebugInformation(const DebugLevel_custom &level,const std::string& fonction,const std::string& text,std::string file="",const int& ligne=-1,const std::string& location="Core");
+ private:
+ /// \brief Path for log file
+ QFile logFile;
+ /// \brief Path for lock file
+ QFile lockFile;
+ /// \brief Internal function to remove the lock file
+ bool removeTheLockFile();
+ /** \brief Do thread safe part for the addDebugInformation()
+ \see addDebugInformation() */
+ QMutex mutex;
+ QMutex mutexList;
+ /// \brief For record the start time
+ QTime startTime;
+ /// \brief String for the end of log file
+ std::string endOfLogFile;
+ /// \brief Drop the html entities
+ std::string htmlEntities(const std::string &text);
+ /// \brief To store the debug informations
+ std::string debugHtmlContent;
+ /// \brief The current backend
+ Backend currentBackend;
+ /// try connect to send to the current running instance the arguements
+ bool tryConnect();
+ int addDebugInformationCallNumber;
+ bool quit;
+ //std::regex fileNameCleaner;don't clean, too many performance heart
+};
+
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUG_ENGINE_H
diff --git a/DebugEngineMacro.h b/DebugEngineMacro.h
new file mode 100644
index 0000000..c3822cd
--- /dev/null
+++ b/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \brief Macro for the debug log
+#ifdef ULTRACOPIER_DEBUG
+# include "DebugEngine.h"
+# if defined (__FILE__) && defined (__LINE__)
+# define ULTRACOPIER_DEBUGCONSOLE(a,b) DebugEngine::addDebugInformationStatic(a,__func__,b,__FILE__,__LINE__)
+# else
+# define ULTRACOPIER_DEBUGCONSOLE(a,b) DebugEngine::addDebugInformationStatic(a,__func__,b)
+# endif
+#else // ULTRACOPIER_DEBUG
+# define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
diff --git a/DebugModel.cpp b/DebugModel.cpp
new file mode 100644
index 0000000..5afa3ba
--- /dev/null
+++ b/DebugModel.cpp
@@ -0,0 +1,158 @@
+#include "DebugEngine.h"
+
+#include <QColor>
+
+#ifdef ULTRACOPIER_DEBUG
+
+#define COLUMN_COUNT 5
+
+// Model
+
+DebugModel::DebugModel()
+{
+ displayed = false;
+ inWaitOfDisplay = false;
+ updateDisplayTimer = NULL;
+}
+
+DebugModel::~DebugModel()
+{
+ if(updateDisplayTimer!=NULL)
+ delete updateDisplayTimer;
+}
+
+int DebugModel::columnCount( const QModelIndex& parent ) const
+{
+ return parent == QModelIndex() ? COLUMN_COUNT : 0;
+}
+
+QVariant DebugModel::data( const QModelIndex& index, int role ) const
+{
+ int row,column;
+ row=index.row();
+ column=index.column();
+ if(index.parent()!=QModelIndex() || row < 0 || row >= (int)list.size() || column < 0 || column >= COLUMN_COUNT)
+ return QVariant();
+
+ const DebugItem& item = list.at(row);
+ if(role==Qt::UserRole)
+ return row;
+ else if(role==Qt::DisplayRole)
+ {
+ switch(column)
+ {
+ case 0:
+ return item.time;
+ break;
+ case 1:
+ return QString::fromStdString(item.file);
+ break;
+ case 2:
+ return QString::fromStdString(item.function);
+ break;
+ case 3:
+ return QString::fromStdString(item.location);
+ break;
+ case 4:
+ return QString::fromStdString(item.text);
+ break;
+ default:
+ return QVariant();
+ }
+ }
+ else if(role==Qt::DecorationRole)
+ return QVariant();
+ else if(role==Qt::ForegroundRole)
+ {
+ switch(item.level)
+ {
+ case DebugLevel_custom_Information:
+ return QColor(94,165,255);
+ break;
+ case DebugLevel_custom_Critical:
+ return QColor(255,0,0);
+ break;
+ case DebugLevel_custom_Warning:
+ return QColor(255,178,0);
+ break;
+ case DebugLevel_custom_Notice:
+ return QColor(128,128,128);
+ break;
+ case DebugLevel_custom_UserNote:
+ return QColor(0,0,0);
+ break;
+ }
+ return QVariant();
+ }
+ return QVariant();
+}
+
+int DebugModel::rowCount( const QModelIndex& parent ) const
+{
+ return parent == QModelIndex() ? list.size() : 0;
+}
+
+QVariant DebugModel::headerData( int section, Qt::Orientation orientation, int role ) const
+{
+ if ( role == Qt::DisplayRole && orientation == Qt::Horizontal && section >= 0 && section < COLUMN_COUNT ) {
+ switch ( section ) {
+ case 0:
+ return QStringLiteral("Time");
+ case 1:
+ return QStringLiteral("File");
+ case 2:
+ return QStringLiteral("Function");
+ case 3:
+ return QStringLiteral("Location");
+ case 4:
+ return QStringLiteral("Text");
+ }
+ }
+
+ return QAbstractTableModel::headerData( section, orientation, role );
+}
+
+bool DebugModel::setData( const QModelIndex&, const QVariant&, int)
+{
+ return false;
+}
+
+void DebugModel::addDebugInformation(const int &time, const DebugLevel_custom &level, const std::string &function, const std::string &text, const std::string &file, const unsigned int& ligne, const std::string &location)
+{
+ DebugItem item;
+ item.time=time;
+ item.level=level;
+ item.function=function;
+ item.text=text;
+ item.file=file+":"+std::to_string(ligne);
+ item.location=location;
+ list.push_back(item);
+ if(!displayed)
+ {
+ displayed=true;
+ emit layoutChanged();
+ }
+ else
+ inWaitOfDisplay=true;
+}
+
+void DebugModel::setupTheTimer()
+{
+ if(updateDisplayTimer!=NULL)
+ return;
+ updateDisplayTimer=new QTimer();
+ connect(updateDisplayTimer,&QTimer::timeout,this,&DebugModel::updateDisplay);
+ updateDisplayTimer->start(100);
+}
+
+void DebugModel::updateDisplay()
+{
+ displayed=false;
+ if(!inWaitOfDisplay)
+ {
+ inWaitOfDisplay=false;
+ displayed=true;
+ emit layoutChanged();
+ }
+}
+#endif
diff --git a/Environment.h b/Environment.h
new file mode 100644
index 0000000..d653c5f
--- /dev/null
+++ b/Environment.h
@@ -0,0 +1,21 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "StructEnumDefinition_UltracopierSpecific.h"
+#include "PlatformMacro.h"
+#include "DebugEngineMacro.h"
+
+#ifdef ULTRACOPIER_VERSION_PORTABLE
+ #define ULTRACOPIER_VERSION_PORTABLE_BOOL true
+#else
+ #define ULTRACOPIER_VERSION_PORTABLE_BOOL false
+#endif
+
+#ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+#undef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+#endif
diff --git a/EventDispatcher.cpp b/EventDispatcher.cpp
new file mode 100644
index 0000000..b2595fb
--- /dev/null
+++ b/EventDispatcher.cpp
@@ -0,0 +1,699 @@
+/** \file EventDispatcher.cpp
+\brief Define the class of the event dispatcher
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QCoreApplication>
+#include <QMessageBox>
+#include <QWidget>
+#include <QStorageInfo>
+#include <iostream>
+
+#include "EventDispatcher.h"
+#include "ExtraSocket.h"
+#include "CompilerInfo.h"
+#include "ThemesManager.h"
+#include "cpp11addition.h"
+
+#ifdef Q_OS_UNIX
+ #include <unistd.h>
+ #include <sys/types.h>
+#endif
+#ifdef Q_OS_WIN32
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+ #include <tchar.h>
+ #include <stdio.h>
+ #include <strsafe.h>
+ typedef void (WINAPI *PGNSI) (LPSYSTEM_INFO);
+ typedef BOOL (WINAPI *PGPI) (DWORD, DWORD, DWORD, DWORD, PDWORD);
+#endif
+#ifdef Q_OS_MAC
+#include <QStringList>
+#include <QFile>
+#include <QDomDocument>
+#include <QDomElement>
+#endif
+
+#ifdef ULTRACOPIER_VERSION_ULTIMATE
+#include <QInputDialog>
+#endif
+
+/// \brief Initiate the ultracopier event dispatcher and check if no other session is running
+EventDispatcher::EventDispatcher()
+{
+ qRegisterMetaType<QList<Ultracopier::ReturnActionOnCopyList> >("QList<Ultracopier::ReturnActionOnCopyList>");
+ qRegisterMetaType<QList<Ultracopier::ProgressionItem> >("QList<Ultracopier::ProgressionItem>");
+ qRegisterMetaType<Ultracopier::EngineActionInProgress>("Ultracopier::EngineActionInProgress");
+ qRegisterMetaType<QList<QUrl> >("QList<QUrl>");
+ qRegisterMetaType<Ultracopier::ItemOfCopyList>("Ultracopier::ItemOfCopyList");
+ qRegisterMetaType<std::string>("std::string");
+ qRegisterMetaType<uint64_t>("uint64_t");
+ qRegisterMetaType<std::vector<Ultracopier::ProgressionItem> >("std::vector<Ultracopier::ProgressionItem>");
+ qRegisterMetaType<std::vector<Ultracopier::ReturnActionOnCopyList> >("std::vector<Ultracopier::ReturnActionOnCopyList>");
+ qRegisterMetaType<std::vector<std::string> >("std::vector<std::string>");
+
+ copyServer=new CopyListener(&optionDialog);
+ if(!connect(&localListener, &LocalListener::cli, &cliParser, &CliParser::cli,Qt::QueuedConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(ThemesManager::themesManager, &ThemesManager::newThemeOptions, &optionDialog, &OptionDialog::newThemeOptions))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(&cliParser, &CliParser::newCopyWithoutDestination, copyServer, &CopyListener::copyWithoutDestination))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(&cliParser, &CliParser::newCopy, copyServer, &CopyListener::copy))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(&cliParser, &CliParser::newMoveWithoutDestination, copyServer, &CopyListener::moveWithoutDestination))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(&cliParser, &CliParser::newMove, copyServer, &CopyListener::move))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(copyServer, &CopyListener::newClientList, &optionDialog, &OptionDialog::newClientList))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ if(!connect(&cliParser, &CliParser::tryLoadPlugin, PluginsManager::pluginsManager, &PluginsManager::tryLoadPlugin))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ #endif
+ copyMoveEventIdIndex=0;
+ backgroundIcon=NULL;
+ stopIt=false;
+
+
+ #ifndef ULTRACOPIER_VERSION_PORTABLE
+ sessionloader=new SessionLoader(&optionDialog);
+ #endif
+ copyEngineList=new CopyEngineManager(&optionDialog);
+ core=new Core(copyEngineList);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //show the ultracopier information
+ #if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Windows version: "+GetOSDisplayString());
+ #endif
+ #ifdef __STDC_VERSION__
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"__STDC_VERSION__: "+std::to_string(__STDC_VERSION__));
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,std::string("ULTRACOPIER_VERSION: ")+ULTRACOPIER_VERSION);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,std::string("Qt version: ")+qVersion()+" "+std::to_string(QT_VERSION));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,std::string("ULTRACOPIER_PLATFORM_NAME: ")+ULTRACOPIER_PLATFORM_NAME.toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Application path: "+QCoreApplication::applicationFilePath().toStdString()+" "+std::to_string(QCoreApplication::applicationPid()));
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,COMPILERINFO);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Local socket: "+ExtraSocket::pathSocket(ULTRACOPIER_SOCKETNAME));
+ #if defined(ULTRACOPIER_DEBUG) && defined(ULTRACOPIER_PLUGIN_ALL_IN_ONE)
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Version as all in one");
+ QObjectList objectList=QPluginLoader::staticInstances();
+ int index=0;
+ while(index<objectList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"static plugin: "+objectList.at(index)->metaObject()->className().toStdString());
+ index++;
+ }
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Version as all in one, direct");
+ #endif
+ #endif
+
+ {
+ const QList<QStorageInfo> mountedVolumesList=QStorageInfo::mountedVolumes();
+ int index=0;
+ while(index<mountedVolumesList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"mountSysPoint: "+mountedVolumesList.at(index).rootPath().toStdString());
+ index++;
+ }
+ if(mountedVolumesList.isEmpty())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"mountSysPoint is empty");
+ }
+
+ //To lunch some initialization after QApplication::exec() to quit eventually
+ lunchInitFunction.setInterval(0);
+ lunchInitFunction.setSingleShot(true);
+ connect(&lunchInitFunction,&QTimer::timeout,this,&EventDispatcher::initFunction,Qt::QueuedConnection);
+ lunchInitFunction.start();
+ if(OptionEngine::optionEngine->getOptionValue("Ultracopier","Last_version_used")!="na" && OptionEngine::optionEngine->getOptionValue("Ultracopier","Last_version_used")!=ULTRACOPIER_VERSION)
+ {
+ //then ultracopier have been updated
+ }
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","Last_version_used",ULTRACOPIER_VERSION);
+ unsigned int a=stringtouint32(OptionEngine::optionEngine->getOptionValue("Ultracopier","ActionOnManualOpen"));
+ if(a>2)
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","ActionOnManualOpen","1");
+ a=stringtouint32(OptionEngine::optionEngine->getOptionValue("Ultracopier","GroupWindowWhen"));
+ if(a>5)
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","GroupWindowWhen","0");
+
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ #ifdef ULTRACOPIER_ILLEGAL
+ static bool crackedVersion=true;
+ #else
+ static bool crackedVersion=false;
+ #endif
+ if(!crackedVersion)
+ {
+ while(1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"ultimate key");
+ QString key=QString::fromStdString(OptionEngine::optionEngine->getOptionValue("Ultracopier","key"));
+ if(!key.isEmpty())
+ {
+ QCryptographicHash hash(QCryptographicHash::Sha224);
+ hash.addData(QStringLiteral("U2NgvbKVrVwlaXnx").toUtf8());
+ hash.addData(key.toUtf8());
+ const QByteArray &result=hash.result();
+ if(!result.isEmpty() && result.at(0)==0x00 && result.at(1)==0x00)
+ break;
+ }
+ key=QInputDialog::getText(NULL,tr("Key"),tr("Give the key of this software, more information on <a href=\"http://ultracopier.first-world.info/\">ultracopier.first-world.info</a>"));
+ if(key.isEmpty())
+ {
+ QCoreApplication::quit();
+ stopIt=true;
+ return;
+ }
+ {
+ QCryptographicHash hash(QCryptographicHash::Sha224);
+ hash.addData(QStringLiteral("U2NgvbKVrVwlaXnx").toUtf8());
+ hash.addData(key.toUtf8());
+ const QByteArray &result=hash.result();
+ if(!result.isEmpty() && result.at(0)==0x00 && result.at(1)==0x00)
+ {
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","key",key.toStdString());
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ connect(&cliParser, &CliParser::newTransferList,core, &Core::newTransferList);
+}
+
+/// \brief Destroy the ultracopier event dispatcher
+EventDispatcher::~EventDispatcher()
+{
+ if(core!=NULL)
+ {
+ delete core;
+ core=NULL;
+ }
+ if(copyEngineList!=NULL)
+ {
+ delete copyEngineList;
+ copyEngineList=NULL;
+ }
+ #ifndef ULTRACOPIER_VERSION_PORTABLE
+ if(sessionloader!=NULL)
+ {
+ delete sessionloader;
+ sessionloader=NULL;
+ }
+ #endif
+ if(backgroundIcon!=NULL)
+ {
+ delete backgroundIcon;
+ backgroundIcon=NULL;
+ }
+ if(copyServer!=NULL)
+ {
+ delete copyServer;
+ copyServer=NULL;
+ }
+}
+
+/// \brief return if need be close
+bool EventDispatcher::shouldBeClosed()
+{
+ return stopIt;
+}
+
+/// \brief Quit ultracopier
+void EventDispatcher::quit()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Will quit ultracopier");
+ //disconnect(QCoreApplication::instance(),SIGNAL(aboutToQuit()),this,SLOT(quit()));
+ QCoreApplication::exit();
+}
+
+/// \brief Called when event loop is setup
+void EventDispatcher::initFunction()
+{
+ if(core==NULL || copyEngineList==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Unable to initialize correctly the software");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Initialize the variable of event loop");
+ if(!connect(copyServer, &CopyListener::newCopyWithoutDestination, core, &Core::newCopyWithoutDestination,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(copyServer, &CopyListener::newCopy, core, &Core::newCopy,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(copyServer, &CopyListener::newMoveWithoutDestination, core, &Core::newMoveWithoutDestination,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(copyServer, &CopyListener::newMove, core, &Core::newMove,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(core, &Core::copyFinished, copyServer, &CopyListener::copyFinished,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(core, &Core::copyCanceled, copyServer, &CopyListener::copyCanceled,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(localListener.tryConnect())
+ {
+ stopIt=true;
+ QCoreApplication::exit(1);//by 1, return process is in progress
+ return;
+ }
+ localListener.listenServer();
+ //load the systray icon
+ if(backgroundIcon==NULL)
+ {
+ backgroundIcon=new SystrayIcon();
+ //connect the slot
+ //quit is for this object
+// connect(core, &Core::newCanDoOnlyCopy, backgroundIcon, &SystrayIcon::newCanDoOnlyCopy,Qt::DirectConnection);
+ if(!connect(backgroundIcon, &SystrayIcon::quit,this,&EventDispatcher::quit))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ //show option is for OptionEngine object
+ if(!connect(backgroundIcon, &SystrayIcon::showOptions, &optionDialog, &OptionDialog::show,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(&cliParser, &CliParser::showOptions, &optionDialog, &OptionDialog::show,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(copyServer, &CopyListener::listenerReady, backgroundIcon, &SystrayIcon::listenerReady,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(copyServer, &CopyListener::pluginLoaderReady, backgroundIcon, &SystrayIcon::pluginLoaderReady,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(backgroundIcon, &SystrayIcon::tryCatchCopy, copyServer, &CopyListener::listen,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(backgroundIcon, &SystrayIcon::tryUncatchCopy, copyServer, &CopyListener::close,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(stringtobool(OptionEngine::optionEngine->getOptionValue("CopyListener","CatchCopyAsDefault")))
+ copyServer->listen();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"copyServer.oneListenerIsLoaded(): "+std::to_string(copyServer->oneListenerIsLoaded()));
+ //backgroundIcon->readyToListen(copyServer.oneListenerIsLoaded());
+
+ #ifdef ULTRACOPIER_DEBUG
+ if(!connect(backgroundIcon, &SystrayIcon::saveBugReport, DebugEngine::debugEngine, &DebugEngine::saveBugReport,Qt::QueuedConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ #endif
+ if(!connect(backgroundIcon, &SystrayIcon::addWindowCopyMove, core, &Core::addWindowCopyMove,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(backgroundIcon, &SystrayIcon::addWindowTransfer, core, &Core::addWindowTransfer,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(copyEngineList, &CopyEngineManager::addCopyEngine, backgroundIcon, &SystrayIcon::addCopyEngine,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ if(!connect(copyEngineList, &CopyEngineManager::removeCopyEngine, backgroundIcon, &SystrayIcon::removeCopyEngine,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ #ifdef ULTRACOPIER_INTERNET_SUPPORT
+ if(!connect(&internetUpdater,&InternetUpdater::newUpdate, backgroundIcon, &SystrayIcon::newUpdate))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ #endif
+ copyEngineList->setIsConnected();
+ copyServer->resendState();
+
+ connect(&cliParser, &CliParser::showSystrayMessage, backgroundIcon,&SystrayIcon::showSystrayMessage,Qt::QueuedConnection);
+ }
+ //conntect the last chance signal before quit
+ if(!connect(QCoreApplication::instance(),&QCoreApplication::aboutToQuit,this,&EventDispatcher::quit,Qt::DirectConnection))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ //connect the slot for the help dialog
+ if(!connect(backgroundIcon,&SystrayIcon::showHelp,&theHelp,&HelpDialog::show))
+ {
+ std::cerr << "connect error at " << __FILE__ << ":" << std::to_string(__LINE__) << std::endl;
+ abort();
+ }
+ #ifdef ULTRACOPIER_DEBUG
+ DebugModel::debugModel->setupTheTimer();
+ #endif
+}
+
+#ifdef Q_OS_WIN32
+std::string EventDispatcher::GetOSDisplayString()
+{
+ QString Os;
+ OSVERSIONINFOEX osvi;
+ SYSTEM_INFO si;
+ PGNSI pGNSI;
+ PGPI pGPI;
+ BOOL bOsVersionInfoEx;
+ DWORD dwType;
+
+ ZeroMemory(&si, sizeof(SYSTEM_INFO));
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+ bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);
+
+ if(bOsVersionInfoEx == 0)
+ return "Os detection blocked";
+
+ // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
+
+ pGNSI = (PGNSI) GetProcAddress(
+ GetModuleHandle(TEXT("kernel32.dll")),
+ "GetNativeSystemInfo");
+ if(NULL != pGNSI)
+ pGNSI(&si);
+ else GetSystemInfo(&si);
+
+ if(VER_PLATFORM_WIN32_NT==osvi.dwPlatformId && osvi.dwMajorVersion>4)
+ {
+ if(osvi.dwMajorVersion==6)
+ {
+ switch(osvi.dwMinorVersion)
+ {
+ case 0:
+ if(osvi.wProductType==VER_NT_WORKSTATION)
+ Os+=QStringLiteral("Windows Vista ");
+ else Os+=QStringLiteral("Windows Server 2008 ");
+ break;
+ case 1:
+ if(osvi.wProductType==VER_NT_WORKSTATION)
+ Os+=QStringLiteral("Windows 7 ");
+ else Os+=QStringLiteral("Windows Server 2008 R2 ");
+ break;
+ case 2:
+ if(osvi.wProductType==VER_NT_WORKSTATION)
+ Os+=QStringLiteral("Windows 8 ");
+ else Os+=QStringLiteral("Windows Server 2012 ");
+ break;
+ default:
+ if(osvi.wProductType==VER_NT_WORKSTATION)
+ Os+=QStringLiteral("Windows (dwMajorVersion: %1, dwMinorVersion: %2)").arg(osvi.dwMinorVersion).arg(osvi.dwMinorVersion);
+ else Os+=QStringLiteral("Windows Server (dwMajorVersion: %1, dwMinorVersion: %2)").arg(osvi.dwMinorVersion).arg(osvi.dwMinorVersion);
+ break;
+ }
+
+ pGPI = (PGPI) GetProcAddress(
+ GetModuleHandle(TEXT("kernel32.dll")),
+ "GetProductInfo");
+
+ pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);
+
+ switch(dwType)
+ {
+ case PRODUCT_ULTIMATE:
+ Os+=QStringLiteral("Ultimate Edition");
+ break;
+ case PRODUCT_PROFESSIONAL:
+ Os+=QStringLiteral("Professional");
+ break;
+ case PRODUCT_HOME_PREMIUM:
+ Os+=QStringLiteral("Home Premium Edition");
+ break;
+ case PRODUCT_HOME_BASIC:
+ Os+=QStringLiteral("Home Basic Edition");
+ break;
+ case PRODUCT_ENTERPRISE:
+ Os+=QStringLiteral("Enterprise Edition");
+ break;
+ case PRODUCT_BUSINESS:
+ Os+=QStringLiteral("Business Edition");
+ break;
+ case PRODUCT_STARTER:
+ Os+=QStringLiteral("Starter Edition");
+ break;
+ case PRODUCT_CLUSTER_SERVER:
+ Os+=QStringLiteral("Cluster Server Edition");
+ break;
+ case PRODUCT_DATACENTER_SERVER:
+ Os+=QStringLiteral("Datacenter Edition");
+ break;
+ case PRODUCT_DATACENTER_SERVER_CORE:
+ Os+=QStringLiteral("Datacenter Edition (core installation)");
+ break;
+ case PRODUCT_ENTERPRISE_SERVER:
+ Os+=QStringLiteral("Enterprise Edition");
+ break;
+ case PRODUCT_ENTERPRISE_SERVER_CORE:
+ Os+=QStringLiteral("Enterprise Edition (core installation)");
+ break;
+ case PRODUCT_ENTERPRISE_SERVER_IA64:
+ Os+=QStringLiteral("Enterprise Edition for Itanium-based Systems");
+ break;
+ case PRODUCT_SMALLBUSINESS_SERVER:
+ Os+=QStringLiteral("Small Business Server");
+ break;
+ case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
+ Os+=QStringLiteral("Small Business Server Premium Edition");
+ break;
+ case PRODUCT_STANDARD_SERVER:
+ Os+=QStringLiteral("Standard Edition");
+ break;
+ case PRODUCT_STANDARD_SERVER_CORE:
+ Os+=QStringLiteral("Standard Edition (core installation)");
+ break;
+ case PRODUCT_WEB_SERVER:
+ Os+=QStringLiteral("Web Server Edition");
+ break;
+ }
+ }
+ else if(osvi.dwMajorVersion==5)
+ {
+ switch(osvi.dwMinorVersion)
+ {
+ case 0:
+ Os+=QStringLiteral("Windows 2000 ");
+ if(osvi.wProductType==VER_NT_WORKSTATION)
+ Os+=QStringLiteral("Professional");
+ else
+ {
+ if(osvi.wSuiteMask & VER_SUITE_DATACENTER)
+ Os+=QStringLiteral("Datacenter Server");
+ else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
+ Os+=QStringLiteral("Advanced Server");
+ else Os+=QStringLiteral("Server");
+ }
+ break;
+ case 1:
+ Os+=QStringLiteral("Windows XP ");
+ if(osvi.wSuiteMask & VER_SUITE_PERSONAL)
+ Os+=QStringLiteral("Home Edition");
+ else Os+=QStringLiteral("Professional");
+ break;
+ case 2:
+ if(GetSystemMetrics(SM_SERVERR2))
+ Os+=QStringLiteral("Windows Server 2003 R2, ");
+ else if(osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER )
+ Os+=QStringLiteral("Windows Storage Server 2003");
+ else if(osvi.wSuiteMask & VER_SUITE_WH_SERVER )
+ Os+=QStringLiteral("Windows Home Server");
+ else if(osvi.wProductType==VER_NT_WORKSTATION && si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
+ Os+=QStringLiteral("Windows XP Professional x64 Edition");
+ else Os+=QStringLiteral("Windows Server 2003, ");
+ // Test for the server type.
+ if(osvi.wProductType!=VER_NT_WORKSTATION )
+ {
+ if(si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64)
+ {
+ if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
+ Os+=QStringLiteral("Datacenter Edition for Itanium-based Systems");
+ else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
+ Os+=QStringLiteral("Enterprise Edition for Itanium-based Systems");
+ }
+ else if(si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
+ {
+ if(osvi.wSuiteMask & VER_SUITE_DATACENTER)
+ Os+=QStringLiteral("Datacenter x64 Edition");
+ else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
+ Os+=QStringLiteral("Enterprise x64 Edition");
+ else Os+=QStringLiteral("Standard x64 Edition");
+ }
+ else
+ {
+ if(osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
+ Os+=QStringLiteral("Compute Cluster Edition");
+ else if( osvi.wSuiteMask & VER_SUITE_DATACENTER)
+ Os+=QStringLiteral("Datacenter Edition");
+ else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
+ Os+=QStringLiteral("Enterprise Edition");
+ else if(osvi.wSuiteMask & VER_SUITE_BLADE)
+ Os+=QStringLiteral("Web Edition");
+ else Os+=QStringLiteral("Standard Edition");
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ if(osvi.wProductType==VER_NT_WORKSTATION)
+ Os+=QStringLiteral("Windows (dwMajorVersion: %1, dwMinorVersion: %2)").arg(osvi.dwMinorVersion).arg(osvi.dwMinorVersion);
+ else Os+=QStringLiteral("Windows Server (dwMajorVersion: %1, dwMinorVersion: %2)").arg(osvi.dwMinorVersion).arg(osvi.dwMinorVersion);
+ }
+
+ // Include service pack (if any) and build number.
+ QString QszCSDVersion=QString::fromUtf16((ushort*)osvi.szCSDVersion);
+ if(!QszCSDVersion.isEmpty())
+ Os+=QStringLiteral(" %1").arg(QszCSDVersion);
+ Os+=QStringLiteral(" (build %1)").arg(osvi.dwBuildNumber);
+ if(osvi.dwMajorVersion >= 6)
+ {
+ if(si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
+ Os+=QStringLiteral(", 64-bit");
+ else if(si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL)
+ Os+=QStringLiteral(", 32-bit");
+ }
+ }
+ else
+ {
+ if(osvi.wProductType==VER_NT_WORKSTATION)
+ Os+=QStringLiteral("Windows (dwMajorVersion: %1, dwMinorVersion: %2)").arg(osvi.dwMinorVersion).arg(osvi.dwMinorVersion);
+ else Os+=QStringLiteral("Windows Server (dwMajorVersion: %1, dwMinorVersion: %2)").arg(osvi.dwMinorVersion).arg(osvi.dwMinorVersion);
+ }
+ return Os.toStdString();
+}
+#endif
+
+#ifdef Q_OS_MAC
+std::string EventDispatcher::GetOSDisplayString()
+{
+ QStringList key;
+ QStringList string;
+ QFile xmlFile(QStringLiteral("/System/Library/CoreServices/SystemVersion.plist"));
+ if(xmlFile.open(QIODevice::ReadOnly))
+ {
+ QString content=xmlFile.readAll();
+ xmlFile.close();
+ QString errorStr;
+ int errorLine;
+ int errorColumn;
+ QDomDocument domDocument;
+ if (!domDocument.setContent(content, false, &errorStr,&errorLine,&errorColumn))
+ return "Mac OS X";
+ else
+ {
+ QDomElement root = domDocument.documentElement();
+ if(root.tagName()!=QStringLiteral("plist"))
+ return "Mac OS X";
+ else
+ {
+ if(root.isElement())
+ {
+ QDomElement SubChild=root.firstChildElement(QStringLiteral("dict"));
+ while(!SubChild.isNull())
+ {
+ if(SubChild.isElement())
+ {
+ QDomElement SubChild2=SubChild.firstChildElement(QStringLiteral("key"));
+ while(!SubChild2.isNull())
+ {
+ if(SubChild2.isElement())
+ key << SubChild2.text();
+ else
+ return "Mac OS X";
+ SubChild2 = SubChild2.nextSiblingElement(QStringLiteral("key"));
+ }
+ SubChild2=SubChild.firstChildElement(QStringLiteral("string"));
+ while(!SubChild2.isNull())
+ {
+ if(SubChild2.isElement())
+ string << SubChild2.text();
+ else
+ return "Mac OS X";
+ SubChild2 = SubChild2.nextSiblingElement(QStringLiteral("string"));
+ }
+ }
+ else
+ return "Mac OS X";
+ SubChild = SubChild.nextSiblingElement(QStringLiteral("property"));
+ }
+ }
+ else
+ return "Mac OS X";
+ }
+ }
+ }
+ if(key.size()!=string.size())
+ return "Mac OS X";
+ int index=0;
+ while(index<key.size())
+ {
+ if(key.at(index)==QStringLiteral("ProductVersion"))
+ return "Mac OS X "+string.at(index).toStdString();
+ index++;
+ }
+ return "Mac OS X";
+}
+#endif
diff --git a/EventDispatcher.h b/EventDispatcher.h
new file mode 100644
index 0000000..77b1948
--- /dev/null
+++ b/EventDispatcher.h
@@ -0,0 +1,97 @@
+/** \file EventDispatcher.h
+\brief Define the class of the event dispatcher
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef EVENT_DISPATCHER_H
+#define EVENT_DISPATCHER_H
+
+#include <QObject>
+#include <QStringList>
+#include <QString>
+#include <QTimer>
+#include <QList>
+#include <QUrl>
+
+#include "Environment.h"
+#include "Core.h"
+#include "SystrayIcon.h"
+#include "OptionEngine.h"
+#include "HelpDialog.h"
+#ifndef ULTRACOPIER_VERSION_PORTABLE
+#include "SessionLoader.h"
+#endif
+#ifdef ULTRACOPIER_INTERNET_SUPPORT
+#include "InternetUpdater.h"
+#endif
+#include "CopyListener.h"
+#include "OptionDialog.h"
+#include "CopyEngineManager.h"
+#include "LocalListener.h"
+#include "CliParser.h"
+
+/** \brief Define the class of the event dispatcher
+
+This class provide a core for dispatch the event of signal/slot, it checks too if not other instance is running */
+class EventDispatcher : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief Initiate the ultracopier event dispatcher and check if no other session is running
+ EventDispatcher();
+ /// \brief Destroy the ultracopier event dispatcher
+ ~EventDispatcher();
+ /// \brief return if need be close
+ bool shouldBeClosed();
+ #if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
+ static std::string GetOSDisplayString();
+ #endif
+ public slots:
+ /// \brief Quit ultracopier
+ void quit();
+ signals:
+ /** \brief Send that's caught state have changed for CatchedState::Uncatched or CatchedState::Semicatched or CatchedState::Catched
+ \see CatchState
+ \see tryCatchCopy()
+ \see tryUncatchCopy()
+ \param State is the new state */
+ void catchCopyStateChanged(Ultracopier::CatchState state) const;
+ /** \brief Send that's copy/move task is finished in returning the copyMoveEventId
+ \see routeCopyMoveEvent()
+ \param copyMoveEventId The task id generated by routeCopyMoveEvent() */
+ void copyMoveEventIsFinish(int copyMoveEventId) const;
+ private:
+ /// \brief To have counter for increment the copyMoveEventId at each request
+ int copyMoveEventIdIndex;
+ /// \brief To store windows windows session
+ struct CoreSession
+ {
+ Core * CoreWindow;
+ std::vector<int> copyMoveEventIdManaged;
+ };
+ /// \brief the systray icon
+ SystrayIcon *backgroundIcon;
+ /// \brief To lunch event only when the event loop is setup
+ QTimer lunchInitFunction;
+ /// \brief the help dialog
+ HelpDialog theHelp;
+ #ifndef ULTRACOPIER_VERSION_PORTABLE
+ /// \brief the session loader
+ SessionLoader *sessionloader;
+ #endif
+ bool stopIt;
+ CopyListener *copyServer;
+ Core *core;
+ OptionDialog optionDialog;
+ #ifdef ULTRACOPIER_INTERNET_SUPPORT
+ InternetUpdater internetUpdater;
+ #endif
+ CopyEngineManager *copyEngineList;
+ LocalListener localListener;
+ CliParser cliParser;
+ private slots:
+ /// \brief Called when event loop is setup
+ void initFunction();
+};
+
+#endif // EVENT_DISPATCHER_H
diff --git a/ExtraSocket.cpp b/ExtraSocket.cpp
new file mode 100644
index 0000000..ef196fa
--- /dev/null
+++ b/ExtraSocket.cpp
@@ -0,0 +1,60 @@
+/** \file ExtraSocket.h
+\brief Define the socket of ultracopier
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "ExtraSocket.h"
+#include <QByteArray>
+#include <stdio.h>
+
+std::string ExtraSocket::pathSocket(const std::string &name)
+{
+#ifdef Q_OS_UNIX
+ return name+"-"+std::to_string(getuid());
+#else
+ QString userName;
+
+ /* bad way for catchcopy compatibility
+ char uname[1024];
+ DWORD len=1023;
+ if(GetUserNameA(uname, &len)!=FALSE)
+ userName=toHex(uname);*/
+
+ QChar charTemp;
+ DWORD size=255;
+ WCHAR * userNameW=new WCHAR[size];
+ if(GetUserNameW(userNameW,&size))
+ {
+ QByteArray tempArray;
+ userName=QString::fromWCharArray(userNameW,size-1);
+ int index=0;
+ while(index<userName.size())
+ {
+ tempArray+=userName.at(index).cell();
+ tempArray+=userName.at(index).row();
+ index++;
+ }
+ userName=tempArray.toHex();
+ }
+ delete userNameW;
+ return name+"-"+userName.toStdString();
+#endif
+}
+
+// Dump UTF16 (little endian)
+char * ExtraSocket::toHex(const char *str)
+{
+ char *p, *sz;
+ size_t len;
+ if (str==NULL)
+ return NULL;
+ len= strlen(str);
+ p = sz = (char *) malloc((len+1)*4);
+ for (size_t i=0; i<len; i++)
+ {
+ sprintf(p, "%.2x00", str[i]);
+ p+=4;
+ }
+ *p=0;
+ return sz;
+}
diff --git a/ExtraSocket.h b/ExtraSocket.h
new file mode 100644
index 0000000..c8d44c5
--- /dev/null
+++ b/ExtraSocket.h
@@ -0,0 +1,30 @@
+/** \file ExtraSocket.h
+\brief Define the socket for ultracopier
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef EXTRASOCKET_H
+#define EXTRASOCKET_H
+
+#include <QString>
+
+#ifdef Q_OS_UNIX
+ #include <unistd.h>
+ #include <sys/types.h>
+#else
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#endif
+
+/** \brief class to have general socket options */
+class ExtraSocket
+{
+public:
+ /** \brief class to return always the same socket resolution */
+ static std::string pathSocket(const std::string &name);
+ static char * toHex(const char *str);
+};
+
+#endif // EXTRASOCKET_H
diff --git a/FacilityEngine.cpp b/FacilityEngine.cpp
new file mode 100644
index 0000000..8356f05
--- /dev/null
+++ b/FacilityEngine.cpp
@@ -0,0 +1,251 @@
+/** \file FacilityEngine.cpp
+\brief To implement the facility engine, the interface is defined into FacilityInterface()
+\see FacilityInterface()
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "FacilityEngine.h"
+
+#if defined (Q_OS_WIN32)
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#endif
+
+FacilityEngine FacilityEngine::facilityEngine;
+
+FacilityEngine::FacilityEngine()
+{
+ retranslate();
+}
+
+/// \brief separator native to the current OS
+std::string FacilityEngine::separator()
+{
+ #ifdef Q_OS_WIN32
+ return "\\";
+ #else
+ return "/";
+ #endif
+}
+
+/// \brief To force the text re-translation
+void FacilityEngine::retranslate()
+{
+ //undirect translated string
+ Translation_perSecond="/"+tr("s").toStdString();
+ Translation_tooBig=tr("Too big").toStdString();
+ Translation_B=tr("B").toStdString();
+ Translation_KB=tr("KB").toStdString();
+ Translation_MB=tr("MB").toStdString();
+ Translation_GB=tr("GB").toStdString();
+ Translation_TB=tr("TB").toStdString();
+ Translation_PB=tr("PB").toStdString();
+ Translation_EB=tr("EB").toStdString();
+ Translation_ZB=tr("ZB").toStdString();
+ Translation_YB=tr("YB").toStdString();
+ Translation_SimplifiedRemaningTime_LessThan10s=tr("Less than %10 seconds").toStdString();
+ Translation_SimplifiedRemaningTime_AboutSeconds=tr("About %10 seconds remaining").toStdString();
+ Translation_SimplifiedRemaningTime_AboutMinutes=tr("About %1 minutes remaining").toStdString();
+ Translation_SimplifiedRemaningTime_AboutHours=tr("About %1 hours remaining").toStdString();
+ //load the translations tab
+ translations["Copy engine"]=tr("Copy engine").toStdString();
+ //: a copy
+ translations["Copy"]=tr("Copy").toStdString();
+ //: a transfer
+ translations["Transfer"]=tr("Transfer").toStdString();
+ //: a move
+ translations["Move"]=tr("Move").toStdString();
+ translations["Start"]=tr("Start").toStdString();
+ translations["Pause"]=tr("Pause").toStdString();
+ translations["Resume"]=tr("Resume").toStdString();
+ translations["Skip"]=tr("Skip").toStdString();
+ translations["Unlimited"]=tr("Unlimited").toStdString();
+ translations["Source"]=tr("Source").toStdString();
+ translations["Size"]=tr("Size").toStdString();
+ translations["Destination"]=tr("Destination").toStdString();
+ translations["Quit"]=tr("Quit").toStdString();
+ translations["Target"]=tr("Target").toStdString();
+ translations["Time remaining:"]=tr("Time remaining:").toStdString();
+ translations["Listing"]=tr("Listing").toStdString();
+ translations["Copying"]=tr("Copying").toStdString();
+ translations["Listing and copying"]=tr("Listing and copying").toStdString();
+ translations["Time remaining:"]=tr("Time remaining:").toStdString();
+ //for copy engine
+ translations["Ask"]=tr("Ask").toStdString();
+ translations["Skip"]=tr("Skip").toStdString();
+ translations["Overwrite"]=tr("Overwrite").toStdString();
+ translations["Overwrite if newer"]=tr("Overwrite if newer").toStdString();
+ translations["Overwrite if the last modification dates are different"]=tr("Overwrite if the last modification dates are different").toStdString();
+ translations["Rename"]=tr("Rename").toStdString();
+ translations["Put to the end of the list"]=tr("Put to the end of the list").toStdString();
+ translations["Select source directory"]=tr("Select source directory").toStdString();
+ translations["Select destination directory"]=tr("Select destination directory").toStdString();
+ translations["Internal error"]=tr("Internal error").toStdString();
+ translations["Select one or more files to open"]=tr("Select one or more files to open").toStdString();
+ translations["All files"]=tr("All files").toStdString();
+ translations["Save transfer list"]=tr("Save transfer list").toStdString();
+ translations["Open transfer list"]=tr("Open transfer list").toStdString();
+ translations["Transfer list"]=tr("Transfer list").toStdString();
+ translations["Error"]=tr("Error").toStdString();
+ translations["Not supported on this platform"]=tr("Not supported on this platform").toStdString();
+ translations["Completed in %1"]=tr("Completed in %1").toStdString();
+}
+
+/// \brief convert size in Byte to String
+std::string FacilityEngine::sizeToString(const double &size) const
+{
+ double size_temp=size;
+ if(size_temp<1024)
+ return std::to_string((unsigned int)size_temp)+sizeUnitToString(Ultracopier::SizeUnit_byte);
+ if((size_temp=size_temp/1024)<1024)
+ return adaptString(static_cast<float>(size_temp))+sizeUnitToString(Ultracopier::SizeUnit_KiloByte);
+ if((size_temp=size_temp/1024)<1024)
+ return adaptString(static_cast<float>(size_temp))+sizeUnitToString(Ultracopier::SizeUnit_MegaByte);
+ if((size_temp=size_temp/1024)<1024)
+ return adaptString(static_cast<float>(size_temp))+sizeUnitToString(Ultracopier::SizeUnit_GigaByte);
+ if((size_temp=size_temp/1024)<1024)
+ return adaptString(static_cast<float>(size_temp))+sizeUnitToString(Ultracopier::SizeUnit_TeraByte);
+ if((size_temp=size_temp/1024)<1024)
+ return adaptString(static_cast<float>(size_temp))+sizeUnitToString(Ultracopier::SizeUnit_PetaByte);
+ if((size_temp=size_temp/1024)<1024)
+ return adaptString(static_cast<float>(size_temp))+sizeUnitToString(Ultracopier::SizeUnit_ExaByte);
+ if((size_temp=size_temp/1024)<1024)
+ return adaptString(static_cast<float>(size_temp))+sizeUnitToString(Ultracopier::SizeUnit_ZettaByte);
+ if((size_temp=size_temp/1024)<1024)
+ return adaptString(static_cast<float>(size_temp))+sizeUnitToString(Ultracopier::SizeUnit_YottaByte);
+ return Translation_tooBig;
+}
+
+std::string FacilityEngine::adaptString(const float &size) const
+{
+ if(size>=100)
+ return QString::number(static_cast<double>(size),'f',0).toStdString();
+ else
+ return QString::number(static_cast<double>(size),'g',3).toStdString();
+}
+
+
+/// \brief convert size unit to String
+std::string FacilityEngine::sizeUnitToString(const Ultracopier::SizeUnit &sizeUnit) const
+{
+ switch(sizeUnit)
+ {
+ case Ultracopier::SizeUnit_byte:
+ return Translation_B;
+ case Ultracopier::SizeUnit_KiloByte:
+ return Translation_KB;
+ case Ultracopier::SizeUnit_MegaByte:
+ return Translation_MB;
+ case Ultracopier::SizeUnit_GigaByte:
+ return Translation_GB;
+ case Ultracopier::SizeUnit_TeraByte:
+ return Translation_TB;
+ case Ultracopier::SizeUnit_PetaByte:
+ return Translation_PB;
+ case Ultracopier::SizeUnit_ExaByte:
+ return Translation_EB;
+ case Ultracopier::SizeUnit_ZettaByte:
+ return Translation_ZB;
+ case Ultracopier::SizeUnit_YottaByte:
+ return Translation_YB;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"sizeUnit: "+std::to_string(sizeUnit));
+ return "???";
+ }
+}
+
+/// \brief translate the text
+std::string FacilityEngine::translateText(const std::string &text) const
+{
+ if(translations.find(text)!=translations.cend())
+ return translations.at(text);
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"translation not found: "+text);
+ return text;
+ }
+}
+
+/// \brief speed to string in byte per seconds
+std::string FacilityEngine::speedToString(const double &speed) const
+{
+ return sizeToString(speed)+Translation_perSecond;
+}
+/// \brief Decompose the time in second
+Ultracopier::TimeDecomposition FacilityEngine::secondsToTimeDecomposition(const uint32_t &seconds) const
+{
+ quint32 seconds_temp=seconds;
+ Ultracopier::TimeDecomposition returnValue;
+ returnValue.second=static_cast<uint16_t>(seconds_temp%60);
+ seconds_temp-=returnValue.second;
+ seconds_temp/=60;
+ returnValue.minute=static_cast<uint16_t>(seconds_temp%60);
+ seconds_temp-=returnValue.minute;
+ seconds_temp/=60;
+ returnValue.hour=static_cast<uint16_t>(seconds_temp);
+ return returnValue;
+}
+
+/// \brief have the functionality
+bool FacilityEngine::haveFunctionality(const std::string &fonctionnality) const
+{
+ #if defined (Q_OS_WIN32)
+ if(fonctionnality=="shutdown")
+ return true;
+ #endif
+ Q_UNUSED(fonctionnality);
+ return false;
+}
+
+/// \brief call the fonctionnality
+std::string FacilityEngine::callFunctionality(const std::string &fonctionnality,const std::vector<std::string> &args)
+{
+ #if defined (Q_OS_WIN32)
+ ExitWindowsEx(EWX_POWEROFF | EWX_FORCE,0);
+ system("shutdown /s /f /t 0");
+ #endif
+ Q_UNUSED(fonctionnality);
+ Q_UNUSED(args);
+ return std::string();
+}
+
+/// \brief Do the simplified time
+std::string FacilityEngine::simplifiedRemainingTime(const uint32_t &seconds) const
+{
+ if(seconds<50)
+ {
+ if(seconds<10)
+ return QString::fromStdString(Translation_SimplifiedRemaningTime_LessThan10s).arg(seconds/10+1).toStdString();
+ else
+ return QString::fromStdString(Translation_SimplifiedRemaningTime_AboutSeconds).arg(seconds/10+1).toStdString();
+ }
+ if(seconds<3600)
+ return QString::fromStdString(Translation_SimplifiedRemaningTime_AboutMinutes).arg(seconds/60).toStdString();
+ return QString::fromStdString(Translation_SimplifiedRemaningTime_AboutHours).arg(seconds/3600).toStdString();
+}
+
+/// \brief Return ultimate url, empty is not found or already ultimate
+std::string FacilityEngine::ultimateUrl() const
+{
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ return std::string();
+ #else
+ #if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
+ return "http://ultracopier.first-world.info/shop.html";
+ #else
+ return std::string();
+ #endif
+ #endif
+}
+
+/// \brief Return the software name
+std::string FacilityEngine::softwareName() const
+{
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ return "Supercopier";
+ #else
+ return "Ultracopier";
+ #endif
+}
diff --git a/FacilityEngine.h b/FacilityEngine.h
new file mode 100644
index 0000000..5b6c6a9
--- /dev/null
+++ b/FacilityEngine.h
@@ -0,0 +1,76 @@
+/** \file FacilityEngine.h
+\brief To implement the facility engine, the interface is defined into FacilityInterface()
+\see FacilityInterface()
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef FACILITYENGINE_H
+#define FACILITYENGINE_H
+
+#include <string>
+#include <vector>
+#include <unordered_map>
+
+#include "interface/FacilityInterface.h"
+#include "Environment.h"
+
+/** \brief Class to group general function for the plugin
+
+This class is used into some plugin like copy engine plugin, to all into one place all common function, group the traduction, and all what it can grouped across all plugin into Ultracopier core application.
+*/
+class FacilityEngine : public FacilityInterface
+{
+ Q_OBJECT
+public:
+ explicit FacilityEngine();
+ /// \brief convert size in Byte to String
+ std::string sizeToString(const double &size) const;
+ /// \brief convert size unit to String
+ std::string sizeUnitToString(const Ultracopier::SizeUnit &sizeUnit) const;
+ /// \brief translate the text
+ std::string translateText(const std::string &text) const;
+ /// \brief speed to string in byte per seconds
+ std::string speedToString(const double &speed) const;
+ /// \brief Decompose the time in second
+ Ultracopier::TimeDecomposition secondsToTimeDecomposition(const uint32_t &seconds) const;
+ /// \brief have the fonctionnality
+ bool haveFunctionality(const std::string &fonctionnality) const;
+ /// \brief call the fonctionnality
+ std::string callFunctionality(const std::string &fonctionnality,const std::vector<std::string> &args=std::vector<std::string>());
+ /// \brief Do the simplified time
+ std::string simplifiedRemainingTime(const uint32_t &seconds) const;
+ /// \brief Return ultimate url, empty is not found or already ultimate
+ std::string ultimateUrl() const;
+ /// \brief Return the software name
+ std::string softwareName() const;
+ /// \brief separator native to the current OS
+ static std::string separator();
+
+ static FacilityEngine facilityEngine;
+private:
+ //undirect translated string
+ std::string Translation_perSecond;
+ std::string Translation_tooBig;
+ std::string Translation_B;
+ std::string Translation_KB;
+ std::string Translation_MB;
+ std::string Translation_GB;
+ std::string Translation_TB;
+ std::string Translation_PB;
+ std::string Translation_EB;
+ std::string Translation_ZB;
+ std::string Translation_YB;
+ //simplified remaining time
+ std::string Translation_SimplifiedRemaningTime_LessThan10s;
+ std::string Translation_SimplifiedRemaningTime_AboutSeconds;
+ std::string Translation_SimplifiedRemaningTime_AboutMinutes;
+ std::string Translation_SimplifiedRemaningTime_AboutHours;
+ //internal fonction
+ inline std::string adaptString(const float &nb) const;
+ std::unordered_map<std::string,std::string> translations;
+public slots:
+ /// \brief To force the text re-translation
+ void retranslate();
+};
+
+#endif // FACILITYENGINE_H
diff --git a/HelpDialog.cpp b/HelpDialog.cpp
new file mode 100644
index 0000000..0e266e4
--- /dev/null
+++ b/HelpDialog.cpp
@@ -0,0 +1,145 @@
+/** \file HelpDialog.cpp
+\brief Define the help dialog
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "HelpDialog.h"
+
+#include <QTreeWidgetItem>
+#include <QApplication>
+
+/// \brief Construct the object
+HelpDialog::HelpDialog() :
+ ui(new Ui::HelpDialog)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ ui->setupUi(this);
+ reloadTextValue();
+ #ifdef ULTRACOPIER_DEBUG
+ ui->debugView->setModel(DebugModel::debugModel);
+ connect(ui->pushButtonSaveBugReport,&QPushButton::clicked,DebugEngine::debugEngine,&DebugEngine::saveBugReport);
+ #else // ULTRACOPIER_DEBUG
+ ui->lineEditInsertDebug->hide();
+ ui->debugView->hide();
+ ui->pushButtonSaveBugReport->hide();
+ ui->pushButtonCrash->hide();
+ this->setMaximumSize(QSize(500,128));
+ /*timeToSetText.setInterval(250);
+ timeToSetText.setSingleShot(true);
+ connect(&timeToSetText,QTimer::timeout,this,&DebugEngine::showDebugText);*/
+ ui->pushButtonClose->hide();
+ #endif // ULTRACOPIER_DEBUG
+ //connect the about Qt
+ connect(ui->pushButtonAboutQt,&QPushButton::toggled,&QApplication::aboutQt);
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ setWindowTitle(tr("About Supercopier"));
+ #else
+ setWindowTitle(tr("About Ultracopier"));
+ #endif
+}
+
+/// \brief Destruct the object
+HelpDialog::~HelpDialog()
+{
+ delete ui;
+}
+
+/// \brief To re-translate the ui
+void HelpDialog::changeEvent(QEvent *e)
+{
+ QDialog::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ ui->retranslateUi(this);
+ reloadTextValue();
+ break;
+ default:
+ break;
+ }
+}
+
+/// \brief To reload the text value
+void HelpDialog::reloadTextValue()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QString text=ui->label_ultracopier->text();
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ text=text.replace(QStringLiteral("%1"),QStringLiteral("Ultimate %1").arg(ULTRACOPIER_VERSION));
+ #else
+ text=text.replace(QStringLiteral("%1"),ULTRACOPIER_VERSION);
+ #endif
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ text=text.replace(QStringLiteral("Ultracopier"),QStringLiteral("Supercopier"),Qt::CaseInsensitive);
+ #endif
+ ui->label_ultracopier->setText(text);
+
+ text=ui->label_description->text();
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ #ifdef ULTRACOPIER_VERSION_PORTABLEAPPS
+ text=text.replace(QStringLiteral("%1"),tr("For http://portableapps.com/"));
+ #else
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ text=text.replace(QStringLiteral("%1"),tr("Portable and all in one version"));
+ #else
+ text=text.replace(QStringLiteral("%1"),tr("Portable version"));
+ #endif
+ #endif
+ #else
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ text=text.replace(QStringLiteral("%1"),tr("All in one version"));
+ #else
+ text=text.replace(QStringLiteral("%1"),tr("Normal version"));
+ #endif
+ #endif
+ 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",QString::fromStdString(getWebSite()));
+ ui->label_site->setText(text);
+
+ text=ui->label_platform->text();
+ text=text.replace(QStringLiteral("%1"),ULTRACOPIER_PLATFORM_NAME);
+ ui->label_platform->setText(text);
+}
+
+std::string HelpDialog::getWebSite()
+{
+ return tr("http://ultracopier.first-world.info/").toStdString();
+}
+
+
+std::string HelpDialog::getUpdateUrl()
+{
+ #if defined(ULTRACOPIER_VERSION_ULTIMATE)
+ return tr("http://ultracopier.first-world.info/shop.html").toStdString();
+ #else
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ return tr("http://ultracopier.first-world.info/").toStdString()+"supercopier.html";
+ #else
+ return tr("http://ultracopier.first-world.info/download.html").toStdString();
+ #endif
+ #endif
+}
+
+#ifdef ULTRACOPIER_DEBUG
+void HelpDialog::on_lineEditInsertDebug_returnPressed()
+{
+ DebugEngine::addDebugNote(ui->lineEditInsertDebug->text().toStdString());
+ ui->lineEditInsertDebug->clear();
+ ui->debugView->scrollToBottom();
+}
+#endif // ULTRACOPIER_DEBUG
+
+void HelpDialog::on_pushButtonAboutQt_clicked()
+{
+ QApplication::aboutQt();
+}
+
+void HelpDialog::on_pushButtonCrash_clicked()
+{
+ int a=0;
+ int *b=NULL;
+ *b=3/a;
+}
diff --git a/HelpDialog.h b/HelpDialog.h
new file mode 100644
index 0000000..91e5dbc
--- /dev/null
+++ b/HelpDialog.h
@@ -0,0 +1,48 @@
+/** \file HelpDialog.h
+\brief Define the help dialog
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DIALOG_H
+#define DIALOG_H
+
+#include <QDialog>
+#include <QString>
+#include <QTimer>
+#include <QColor>
+#include <QBrush>
+
+#include "ui_HelpDialog.h"
+#include "Environment.h"
+
+namespace Ui {
+ class HelpDialog;
+}
+
+/** \brief Help dialog, and some user oriented repport/debug function */
+class HelpDialog : public QDialog {
+ Q_OBJECT
+ public:
+ /// \brief Construct the object
+ HelpDialog();
+ /// \brief Destruct the object
+ ~HelpDialog();
+ static std::string getWebSite();
+ static std::string getUpdateUrl();
+ protected:
+ /// \brief To re-translate the ui
+ void changeEvent(QEvent *e);
+ private:
+ Ui::HelpDialog *ui;
+ /// \brief To reload the text value
+ void reloadTextValue();
+ private slots:
+ #ifdef ULTRACOPIER_DEBUG
+ /// \brief Add debug text
+ void on_lineEditInsertDebug_returnPressed();
+ #endif // ULTRACOPIER_DEBUG
+ void on_pushButtonAboutQt_clicked();
+ void on_pushButtonCrash_clicked();
+};
+
+#endif // DIALOG_H
diff --git a/HelpDialog.ui b/HelpDialog.ui
new file mode 100644
index 0000000..5d42f18
--- /dev/null
+++ b/HelpDialog.ui
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>HelpDialog</class>
+ <widget class="QDialog" name="HelpDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>681</width>
+ <height>389</height>
+ </rect>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16777214</height>
+ </size>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="resources/ultracopier-resources.qrc">
+ <normaloff>:/ultracopier-16x16.png</normaloff>:/ultracopier-16x16.png</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="minimumSize">
+ <size>
+ <width>128</width>
+ <height>128</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>128</width>
+ <height>128</height>
+ </size>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="resources/ultracopier-resources.qrc">:/ultracopier-128x128.png</pixmap>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label_ultracopier">
+ <property name="font">
+ <font>
+ <pointsize>12</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string notr="true">Ultracopier %1</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_description">
+ <property name="text">
+ <string extracomment="%1 will be replaced by a variable content (normal, debug, ...)">Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_site">
+ <property name="text">
+ <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>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_platform">
+ <property name="text">
+ <string extracomment="%1 will be replaced by the platform (windows, mac, linux, ...)">Platform: %1</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEditInsertDebug">
+ <property name="toolTip">
+ <string notr="true">Insert debug note to annotate some special action at current time</string>
+ </property>
+ <property name="statusTip">
+ <string notr="true">Insert debug note to annotate some special action at current time</string>
+ </property>
+ <property name="placeholderText">
+ <string notr="true">Insert debug note to annotate some special action at current time</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTreeView" name="debugView">
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayoutButton">
+ <item>
+ <widget class="QPushButton" name="pushButtonAboutQt">
+ <property name="text">
+ <string>About Qt</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButtonCrash">
+ <property name="text">
+ <string>Do a crash</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButtonSaveBugReport">
+ <property name="text">
+ <string>Save bug report</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButtonClose">
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>debugView</tabstop>
+ <tabstop>lineEditInsertDebug</tabstop>
+ <tabstop>pushButtonAboutQt</tabstop>
+ <tabstop>pushButtonSaveBugReport</tabstop>
+ <tabstop>pushButtonClose</tabstop>
+ </tabstops>
+ <resources>
+ <include location="resources/ultracopier-resources.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>pushButtonClose</sender>
+ <signal>clicked()</signal>
+ <receiver>HelpDialog</receiver>
+ <slot>hide()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>387</x>
+ <y>216</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>329</x>
+ <y>212</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/InternetUpdater.cpp b/InternetUpdater.cpp
new file mode 100644
index 0000000..a3dbded
--- /dev/null
+++ b/InternetUpdater.cpp
@@ -0,0 +1,110 @@
+#include "InternetUpdater.h"
+#include "EventDispatcher.h"
+#include "OptionEngine.h"
+#include "cpp11addition.h"
+
+#ifdef ULTRACOPIER_INTERNET_SUPPORT
+
+#include <QNetworkRequest>
+#include <QUrl>
+
+#include "PluginsManager.h"
+
+InternetUpdater::InternetUpdater(QObject *parent) :
+ QObject(parent)
+{
+ connect(&newUpdateTimer,&QTimer::timeout,this,&InternetUpdater::downloadFile);
+ connect(&firstUpdateTimer,&QTimer::timeout,this,&InternetUpdater::downloadFile);
+ newUpdateTimer.start(1000*3600);
+ firstUpdateTimer.setSingleShot(true);
+ firstUpdateTimer.start(1000*60);
+}
+
+void InternetUpdater::downloadFile()
+{
+ if(!stringtobool(OptionEngine::optionEngine->getOptionValue("Ultracopier","checkTheUpdate")))
+ return;
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ std::string name="Supercopier";
+ #else
+ std::string name="Ultracopier";
+ #endif
+ std::string ultracopierVersion;
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ ultracopierVersion=name+" Ultimate/"+ULTRACOPIER_VERSION;
+ #else
+ ultracopierVersion=name+"/"+ULTRACOPIER_VERSION;
+ #endif
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ ultracopierVersion+=" portable/all-in-one";
+ #else
+ ultracopierVersion+=" portable";
+ #endif
+ #else
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ ultracopierVersion+=" all-in-one";
+ #endif
+ #endif
+ #if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
+ ultracopierVersion+=" (OS: "+EventDispatcher::GetOSDisplayString()+")";
+ #endif
+ ultracopierVersion+=" "+std::string(ULTRACOPIER_PLATFORM_CODE);
+ QNetworkRequest networkRequest(QStringLiteral(ULTRACOPIER_UPDATER_URL));
+ networkRequest.setHeader(QNetworkRequest::UserAgentHeader,QString::fromStdString(ultracopierVersion));
+ networkRequest.setRawHeader("Connection", "Close");
+ reply = qnam.get(networkRequest);
+ connect(reply, &QNetworkReply::finished, this, &InternetUpdater::httpFinished);
+}
+
+void InternetUpdater::httpFinished()
+{
+ QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+ if (!reply->isFinished())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"get the new update failed: not finished");
+ reply->deleteLater();
+ return;
+ }
+ else if (reply->error())
+ {
+ newUpdateTimer.stop();
+ newUpdateTimer.start(1000*3600*24);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"get the new update failed: "+reply->errorString().toStdString());
+ reply->deleteLater();
+ return;
+ } else if (!redirectionTarget.isNull()) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"redirection denied to: "+redirectionTarget.toUrl().toString().toStdString());
+ reply->deleteLater();
+ return;
+ }
+ QString newVersion=QString::fromUtf8(reply->readAll());
+ if(newVersion.isEmpty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"version string is empty");
+ reply->deleteLater();
+ return;
+ }
+ newVersion.remove("\n");
+ if(!newVersion.contains(QRegularExpression(QLatin1Literal("^[0-9]+(\\.[0-9]+)+$"))))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"version string don't match: "+newVersion.toStdString());
+ reply->deleteLater();
+ return;
+ }
+ if(newVersion==ULTRACOPIER_VERSION)
+ {
+ reply->deleteLater();
+ return;
+ }
+ if(PluginsManager::compareVersion(newVersion.toStdString(),"<=",ULTRACOPIER_VERSION))
+ {
+ reply->deleteLater();
+ return;
+ }
+ newUpdateTimer.stop();
+ emit newUpdate(newVersion.toStdString());
+ reply->deleteLater();
+}
+
+#endif
diff --git a/InternetUpdater.h b/InternetUpdater.h
new file mode 100644
index 0000000..25b13f4
--- /dev/null
+++ b/InternetUpdater.h
@@ -0,0 +1,33 @@
+#ifndef INTERNETUPDATER_H
+#define INTERNETUPDATER_H
+
+#include "Environment.h"
+
+#include <QObject>
+#include <QString>
+#include <QTimer>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+
+#ifdef ULTRACOPIER_INTERNET_SUPPORT
+
+class InternetUpdater : public QObject
+{
+ Q_OBJECT
+public:
+ explicit InternetUpdater(QObject *parent = 0);
+signals:
+ void newUpdate(const std::string &version) const;
+private:
+ QTimer newUpdateTimer;
+ QTimer firstUpdateTimer;
+ QNetworkAccessManager qnam;
+ QNetworkReply *reply;
+private slots:
+ void downloadFile();
+ void httpFinished();
+};
+
+#endif
+
+#endif // INTERNETUPDATER_H
diff --git a/LanguagesManager.cpp b/LanguagesManager.cpp
new file mode 100644
index 0000000..a8849c4
--- /dev/null
+++ b/LanguagesManager.cpp
@@ -0,0 +1,287 @@
+/** \file LanguagesManager.cpp
+\brief Define the class to manage and load the languages
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QDir>
+#include <QLibraryInfo>
+
+#include "LanguagesManager.h"
+#include "FacilityEngine.h"
+#include "cpp11addition.h"
+
+/// \brief Create the manager and load the defaults variables
+LanguagesManager::LanguagesManager()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //load the rest
+ std::vector<std::string> resourcesPaths=ResourcesManager::resourcesManager->getReadPath();
+ unsigned int index=0;
+ while(index<resourcesPaths.size())
+ {
+ std::string composedTempPath=resourcesPaths.at(index)+"Languages"+FacilityEngine::separator();
+ QDir LanguagesConfiguration(QString::fromStdString(composedTempPath));
+ if(LanguagesConfiguration.exists())
+ languagePath.push_back(composedTempPath);
+ index++;
+ }
+ //load the plugins
+ PluginsManager::pluginsManager->lockPluginListEdition();
+ connect(this,&LanguagesManager::previouslyPluginAdded, this, &LanguagesManager::onePluginAdded,Qt::QueuedConnection);
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginAdded,this, &LanguagesManager::onePluginAdded,Qt::QueuedConnection);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginWillBeRemoved, this, &LanguagesManager::onePluginWillBeRemoved,Qt::DirectConnection);
+ #endif
+ connect(PluginsManager::pluginsManager,&PluginsManager::pluginListingIsfinish, this, &LanguagesManager::allPluginIsLoaded,Qt::QueuedConnection);
+ std::vector<PluginsAvailable> list=PluginsManager::pluginsManager->getPluginsByCategory(PluginType_Languages);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
+ PluginsManager::pluginsManager->unlockPluginListEdition();
+ //load the GUI option
+ std::vector<std::pair<std::string, std::string> > KeysList;
+ KeysList.push_back(std::pair<std::string, std::string>("Language","en"));
+ KeysList.push_back(std::pair<std::string, std::string>("Language_force","false"));
+ OptionEngine::optionEngine->addOptionGroup("Language",KeysList);
+// connect(this, &LanguagesManager::newLanguageLoaded, plugins,&PluginsManager::refreshPluginList);
+// connect(this, &LanguagesManager::newLanguageLoaded, this,&LanguagesManager::retranslateTheUI);
+ connect(OptionEngine::optionEngine,&OptionEngine::newOptionValue, this, &LanguagesManager::newOptionValue,Qt::QueuedConnection);
+ connect(this, &LanguagesManager::newLanguageLoaded, PluginsManager::pluginsManager,&PluginsManager::newLanguageLoaded,Qt::QueuedConnection);
+}
+
+/// \brief Destroy the language manager
+LanguagesManager::~LanguagesManager()
+{
+}
+
+/// \brief load the language selected, return the main short code like en, fr, ..
+std::string LanguagesManager::getTheRightLanguage() const
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(LanguagesAvailableList.size()==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"empty combobox list, failing back to english");
+ return "en";
+ }
+ else
+ {
+ if(!stringtobool(OptionEngine::optionEngine->getOptionValue("Language","Language_force")))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"language auto-detection, QLocale::system().name(): "+QLocale::system().name().toStdString()+", QLocale::languageToString(QLocale::system().language()): "+QLocale::languageToString(QLocale::system().language()).toStdString());
+ std::string tempLanguage=getMainShortName(QLocale::languageToString(QLocale::system().language()).toStdString());
+ if(!tempLanguage.empty())
+ return tempLanguage;
+ else
+ {
+ tempLanguage=getMainShortName(QLocale::system().name().toStdString());
+ if(!tempLanguage.empty())
+ return tempLanguage;
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Autodetection of the language failed, QLocale::languageToString(QLocale::system().language()): "+QLocale::languageToString(QLocale::system().language()).toStdString()+", QLocale::system().name(): "+QLocale::system().name().toStdString()+", failing back to english");
+ return OptionEngine::optionEngine->getOptionValue("Language","Language");
+ }
+ }
+ }
+ else
+ return OptionEngine::optionEngine->getOptionValue("Language","Language");
+ }
+}
+
+/* \brief To set the current language
+\param newLanguage Should be short name code found into informations.xml of language file */
+void LanguagesManager::setCurrentLanguage(const std::string &newLanguage)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+newLanguage);
+ //protection for re-set the same language
+ if(currentLanguage==newLanguage)
+ return;
+ //store the language
+ PluginsManager::pluginsManager->setLanguage(newLanguage);
+ //unload the old language
+ if(currentLanguage!="en")
+ {
+ unsigned int indexTranslator=0;
+ while(indexTranslator<installedTranslator.size())
+ {
+ QCoreApplication::removeTranslator(installedTranslator.at(indexTranslator));
+ delete installedTranslator.at(indexTranslator);
+ indexTranslator++;
+ }
+ installedTranslator.clear();
+ }
+ unsigned int index=0;
+ while(index<LanguagesAvailableList.size())
+ {
+ if(LanguagesAvailableList.at(index).mainShortName==newLanguage)
+ {
+ //load the new language
+ if(newLanguage!="en")
+ {
+ QTranslator *temp;
+ std::vector<std::string> fileToLoad;
+ //load the language main
+ if(newLanguage=="en")
+ fileToLoad.push_back(":/Languages/en/translation.qm");
+ else
+ fileToLoad.push_back(LanguagesAvailableList.at(index).path+"translation.qm");
+ //load the language plugin
+ std::vector<PluginsAvailable> listLoadedPlugins=PluginsManager::pluginsManager->getPlugins();
+ unsigned int indexPluginIndex=0;
+ while(indexPluginIndex<listLoadedPlugins.size())
+ {
+ if(listLoadedPlugins.at(indexPluginIndex).category!=PluginType_Languages)
+ {
+ std::string tempPath=listLoadedPlugins.at(indexPluginIndex).path+"Languages"+FacilityEngine::separator()+LanguagesAvailableList.at(index).mainShortName+FacilityEngine::separator()+"translation.qm";
+ if(QFile::exists(QString::fromStdString(tempPath)))
+ fileToLoad.push_back(tempPath);
+ }
+ indexPluginIndex++;
+ }
+ unsigned int indexTranslationFile=0;
+ while(indexTranslationFile<fileToLoad.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Translation to load: "+fileToLoad.at(indexTranslationFile));
+ temp=new QTranslator();
+ if(!temp->load(QString::fromStdString(fileToLoad.at(indexTranslationFile))) || temp->isEmpty())
+ {
+ delete temp;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to load the translation file: "+fileToLoad.at(indexTranslationFile));
+ }
+ else
+ {
+ QCoreApplication::installTranslator(temp);
+ installedTranslator.push_back(temp);
+ }
+ indexTranslationFile++;
+ }
+ temp=new QTranslator();
+ if(temp->load(QString("qt_")+QString::fromStdString(newLanguage), QLibraryInfo::location(QLibraryInfo::TranslationsPath)) && !temp->isEmpty())
+ {
+ QCoreApplication::installTranslator(temp);
+ installedTranslator.push_back(temp);
+ }
+ else
+ {
+ if(!temp->load(QString::fromStdString(LanguagesAvailableList.at(index).path)+"qt.qm") || temp->isEmpty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to load the translation file: qt.qm, into: "+LanguagesAvailableList.at(index).path);
+ delete temp;
+ }
+ else
+ {
+ QCoreApplication::installTranslator(temp);
+ installedTranslator.push_back(temp);
+ }
+ }
+ }
+ currentLanguage=newLanguage;
+ FacilityEngine::facilityEngine.retranslate();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit newLanguageLoaded()");
+ emit newLanguageLoaded(currentLanguage);
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to found language: "+newLanguage+", LanguagesAvailableList.size(): "+std::to_string(LanguagesAvailableList.size()));
+}
+
+/// \brief check if short name is found into language
+std::string LanguagesManager::getMainShortName(const std::string &shortName) const
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<LanguagesAvailableList.size())
+ {
+ const LanguagesAvailable &languagesAvailable=LanguagesAvailableList.at(index);
+ if(languagesAvailable.shortName.find(shortName)!=languagesAvailable.shortName.cend() || languagesAvailable.fullName==shortName)
+ return languagesAvailable.mainShortName;
+ index++;
+ }
+ return "";
+}
+
+/// \brief load the language in languagePath
+void LanguagesManager::allPluginIsLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ setCurrentLanguage(getTheRightLanguage());
+}
+
+const std::string LanguagesManager::autodetectedLanguage() const
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"language auto-detection, QLocale::system().name(): "+QLocale::system().name().toStdString()+", QLocale::languageToString(QLocale::system().language()): "+QLocale::languageToString(QLocale::system().language()).toStdString());
+ std::string tempLanguage=getMainShortName(QLocale::languageToString(QLocale::system().language()).toStdString());
+ if(!tempLanguage.empty())
+ return tempLanguage;
+ else
+ {
+ tempLanguage=getMainShortName(QLocale::system().name().toStdString());
+ if(!tempLanguage.empty())
+ return tempLanguage;
+ }
+ return std::string();
+}
+
+void LanguagesManager::onePluginAdded(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_Languages)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QDomElement child = plugin.categorySpecific.firstChildElement(QStringLiteral("fullName"));
+ LanguagesAvailable temp;
+ if(!child.isNull() && child.isElement())
+ temp.fullName=child.text().toStdString();
+ child = plugin.categorySpecific.firstChildElement(QStringLiteral("shortName"));
+ while(!child.isNull())
+ {
+ if(child.isElement())
+ {
+ if(child.hasAttribute("mainCode") && child.attribute(QStringLiteral("mainCode"))==QStringLiteral("true"))
+ temp.mainShortName=child.text().toStdString();
+ temp.shortName.insert(child.text().toStdString());
+ }
+ child = child.nextSiblingElement(QStringLiteral("shortName"));
+ }
+ temp.path=plugin.path;
+ if(temp.fullName.empty())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"fullName empty for: "+plugin.path);
+ else if(temp.path.empty())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"path empty for: "+plugin.path);
+ else if(temp.mainShortName.empty())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"mainShortName empty for: "+plugin.path);
+ else if(temp.shortName.size()<=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"temp.shortName.size()<=0 for: "+plugin.path);
+ else if(!QFile::exists(QString::fromStdString(temp.path)+QStringLiteral("flag.png")))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"flag file not found for: "+plugin.path);
+ else if(!QFile::exists(QString::fromStdString(temp.path)+QStringLiteral("translation.qm")) && temp.mainShortName!="en")
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"translation not found for: "+plugin.path);
+ else
+ LanguagesAvailableList.push_back(temp);
+ if(PluginsManager::pluginsManager->allPluginHaveBeenLoaded())
+ setCurrentLanguage(getTheRightLanguage());
+}
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+void LanguagesManager::onePluginWillBeRemoved(const PluginsAvailable &plugin)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<LanguagesAvailableList.size())
+ {
+ if(plugin.path==LanguagesAvailableList.at(index).path)
+ {
+ return;
+ }
+ index++;
+ }
+}
+#endif
+
+void LanguagesManager::newOptionValue(const std::string &group)
+{
+ if(group=="Language")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"group: "+group);
+ setCurrentLanguage(getTheRightLanguage());
+ }
+}
diff --git a/LanguagesManager.h b/LanguagesManager.h
new file mode 100644
index 0000000..e7c715e
--- /dev/null
+++ b/LanguagesManager.h
@@ -0,0 +1,78 @@
+/** \file LanguagesManager.h
+\brief Define the class to manage and load the languages
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef LANGUAGES_MANAGER_H
+#define LANGUAGES_MANAGER_H
+
+#include <QObject>
+#include <QString>
+#include <QStringList>
+#include <QList>
+#include <QLocale>
+#include <QTranslator>
+#include <QByteArray>
+#include <QCoreApplication>
+#include <QDir>
+#include <unordered_set>
+
+#include "Environment.h"
+#include "OptionEngine.h"
+#include "ResourcesManager.h"
+#include "PluginsManager.h"
+
+/** \brief Define the class to manage and load the resources linked with the themes
+
+This class provide a core load and manage the resources */
+class LanguagesManager : public QObject
+{
+ Q_OBJECT
+ //public:
+ // QString getMainShortName();
+ public:
+ const std::string autodetectedLanguage() const;
+ static LanguagesManager *languagesManager;
+ /// \brief Create the manager and load the defaults variables
+ LanguagesManager();
+ /// \brief Destroy the language manager
+ ~LanguagesManager();
+ private:
+ /** \brief To set the current language
+ \param newLanguage Should be short name code found into informations.xml of language file */
+ void setCurrentLanguage(const std::string &newLanguage);
+ /// \brief Structure of language
+ struct LanguagesAvailable
+ {
+ std::string path;
+ std::string fullName;
+ std::string mainShortName;
+ std::unordered_set<std::string> shortName;
+ };
+ /// \brief To store the language path
+ std::vector<std::string> languagePath;
+ /// \brief To store the language detected
+ std::vector<LanguagesAvailable> LanguagesAvailableList;
+ /// \brief check if short name is found into language
+ std::string getMainShortName(const std::string &shortName) const;
+ /// \brief list of installed translator
+ std::vector<QTranslator *> installedTranslator;
+ std::string currentLanguage;
+ /// \brief load the language selected
+ std::string getTheRightLanguage() const;
+ private slots:
+ /// \brief load the language in languagePath
+ void allPluginIsLoaded();
+ //plugin management
+ void onePluginAdded(const PluginsAvailable &plugin);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void onePluginWillBeRemoved(const PluginsAvailable &plugin);
+ #endif
+ void newOptionValue(const std::string &group);
+ signals:
+ //send the language is loaded or the new language is loaded
+ void newLanguageLoaded(const std::string &mainShortName) const;
+ void previouslyPluginAdded(PluginsAvailable) const;
+};
+
+#endif // LANGUAGES_MANAGER_H
diff --git a/LocalListener.cpp b/LocalListener.cpp
new file mode 100644
index 0000000..4a418aa
--- /dev/null
+++ b/LocalListener.cpp
@@ -0,0 +1,348 @@
+/** \file LocalListener.cpp
+\brief The have local server, to have unique instance, and send arguments to the current running instance
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "LocalListener.h"
+#include "PluginsManager.h"
+
+#include <QLocalSocket>
+#include <QDir>
+
+LocalListener::LocalListener(QObject *parent) :
+ QObject(parent)
+{
+ //for detect the timeout on QLocalSocket
+ TimeOutQLocalSocket.setInterval(500);
+ TimeOutQLocalSocket.setSingleShot(true);
+ connect(&TimeOutQLocalSocket, &QTimer::timeout, this, &LocalListener::timeoutDectected);
+ connect(PluginsManager::pluginsManager,&PluginsManager::pluginListingIsfinish,this, &LocalListener::allPluginIsloaded,Qt::QueuedConnection);
+}
+
+LocalListener::~LocalListener()
+{
+ if(localServer.isListening())
+ {
+ localServer.close();
+ if(!QLocalServer::removeServer(QString::fromStdString(ExtraSocket::pathSocket(ULTRACOPIER_SOCKETNAME))))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the listening server");
+ }
+}
+
+bool LocalListener::tryConnect()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::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,QDir::currentPath());
+
+ std::vector<std::string> ultracopierArgumentsStd;
+ {
+ int index=0;
+ while(index<ultracopierArguments.size())
+ {
+ ultracopierArgumentsStd.push_back(ultracopierArguments.at(index).toStdString());
+ index++;
+ }
+ }
+
+ QLocalSocket localSocket;
+ localSocket.connectToServer(QString::fromStdString(ExtraSocket::pathSocket(ULTRACOPIER_SOCKETNAME)),QIODevice::WriteOnly);
+ if(localSocket.waitForConnected(1000))
+ {
+ if(!localSocket.isValid())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"localSocket is not valid!");
+ return false;
+ }
+ emit cli(ultracopierArgumentsStd,false,true);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"connection succes, number arguments given: "+std::to_string(ultracopierArgumentsStd.size()));
+ #ifdef ULTRACOPIER_DEBUG
+ for (int i = 0; i < ultracopierArguments.size(); ++i) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"argument["+std::to_string(i)+"]: "+ultracopierArgumentsStd.at(i));
+ }
+ #endif // ULTRACOPIER_DEBUG
+ //cut string list and send it as block of 32KB
+ QByteArray block;
+ QDataStream out(&block, QIODevice::WriteOnly);
+ //for total size
+ out << int(0);
+ //send the arguments
+ out << ultracopierArguments;
+ //write the size content
+ out.device()->seek(0);
+ out << block.size();
+ do
+ {
+ QByteArray blockToSend;
+ blockToSend=block.left(32*1024);//32KB
+ block.remove(0,blockToSend.size());
+ #ifdef ULTRACOPIER_DEBUG
+ int byteWriten =
+ #endif
+ localSocket.write(blockToSend);
+ #ifdef ULTRACOPIER_DEBUG
+ if(!localSocket.isValid())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"localSocket is not valid!");
+ if(localSocket.errorString()!="Unknown error" && localSocket.errorString()!="")
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"localSocket->errorString(): "+localSocket.errorString().toStdString());
+ if(blockToSend.size()!=byteWriten)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"blockToSend("+std::to_string(blockToSend.size())+
+ ")!=byteWriten("+std::to_string(byteWriten)+")");
+ #endif // ULTRACOPIER_DEBUG
+ if(localSocket.waitForBytesWritten(200))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Block send correctly");
+ }
+ else
+ {
+ QMessageBox::critical(NULL,"Alert","No arguments send because timeout detected!");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Block not send correctly");
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"blockToSend: "+blockToSend.toHex().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"byteWriten: "+std::to_string(byteWriten)+
+ ", size sending: "+std::to_string(blockToSend.size()));
+ }
+ while(block.size());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"disconnect the socket");
+ localSocket.disconnectFromServer();
+ return true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"connection failed, continue...");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"ultracopierArguments: "+ultracopierArguments.join(";").toStdString());
+ return false;
+ }
+}
+
+/// the listen server
+void LocalListener::listenServer()
+{
+ if(!QLocalServer::removeServer(QString::fromStdString(ExtraSocket::pathSocket(ULTRACOPIER_SOCKETNAME))))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the listening server");
+ #ifndef Q_OS_MAC
+ localServer.setSocketOptions(QLocalServer::UserAccessOption);
+ #endif
+ if(!localServer.listen(QString::fromStdString(ExtraSocket::pathSocket(ULTRACOPIER_SOCKETNAME))))
+ {
+ #ifndef Q_OS_MAC
+ //QMessageBox::critical(NULL,"Alert",QStringLiteral("Ultracopier have not able to lock unique instance: %1").arg(localServer.errorString()));
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Ultracopier have not able to lock unique instance: "+localServer.errorString().toStdString()+
+ ", error code: "+std::to_string((int32_t)localServer.serverError()));
+ }
+ else
+ connect(&localServer, &QLocalServer::newConnection, this, &LocalListener::newConnexion);
+}
+
+//the time is done
+void LocalListener::timeoutDectected()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"start");
+ if(clientList.size()>0)
+ {
+ unsigned int index=0;
+ bool haveData=false;
+ while(index<clientList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"clientList.first().size: "+std::to_string(clientList.front().size));
+ if(!clientList.at(index).data.isEmpty() || clientList.at(index).haveData)
+ {
+ haveData=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Timeout while recomposing data from connected clients: "+clientList.at(index).data.toHex().toStdString());
+ clientList.erase(clientList.cbegin());
+ }
+ else
+ index++;
+ }
+ if(haveData)
+ QMessageBox::warning(NULL,tr("Warning"),tr("Timeout while recomposing data from connected clients"));
+ }
+}
+
+/// \brief Data is incomming
+void LocalListener::dataIncomming()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"start");
+ // 1 : we get packets from client
+
+ //Which client send the message (Search of the QLocalSocket of client)
+ QLocalSocket *socket = qobject_cast<QLocalSocket *>(sender());
+ if (socket == 0) // If not found
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"bad socket");
+ return;
+ }
+
+ int index=-1;
+ for (unsigned int i=0;i<clientList.size(); ++i) {
+ if(clientList.at(i).socket==socket)
+ index=i;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"socket->bytesAvailable() "+std::to_string(socket->bytesAvailable()));
+ if(index!=-1)
+ {
+ if(!clientList.at(index).haveData)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempComposed index found, but no have data, create new entry");
+ // If all is ok we get the message
+ QDataStream in(socket);
+ in.setVersion(QDataStream::Qt_4_4);
+
+ if (socket->bytesAvailable() < (int)sizeof(quint32)*2) // We have not receveive all the message, ignore because first int is cuted!
+ {
+ /*socket->readAll();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"wrong size for set the message size");*/
+ return;
+ }
+ in >> clientList[index].size; // Store the size of the message
+ clientList[index].size-=sizeof(int);
+
+ // Check if all the message size is the same as the size given
+ if(socket->bytesAvailable() < clientList.at(index).size) // If not all get then stop it
+ {
+ clientList[index].haveData=true;
+ clientList[index].data.append(socket->readAll());
+ TimeOutQLocalSocket.start();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Need wait to recomposite: "+std::to_string(clientList.at(index).data.size())+
+ ", targeted: "+std::to_string(clientList.at(index).size));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempComposed.data: "+clientList.at(index).data.toHex().toStdString());
+ }
+ else if(socket->bytesAvailable() == clientList.at(index).size) //if the size match
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"socket->bytesAvailable(): "+std::to_string(socket->bytesAvailable())+
+ ", for total of: "+std::to_string(socket->bytesAvailable()+sizeof(uint32_t)));
+ QStringList ultracopierArguments;
+ in >> ultracopierArguments;
+ std::vector<std::string> ultracopierArgumentsStd;
+ {
+ int index=0;
+ while(index<ultracopierArguments.size())
+ {
+ ultracopierArgumentsStd.push_back(ultracopierArguments.at(index).toStdString());
+ index++;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"ultracopierArguments: "+ultracopierArguments.join(";").toStdString());
+ emit cli(ultracopierArgumentsStd,true,false);
+ clientList[index].data.clear();
+ clientList[index].haveData=false;
+ TimeOutQLocalSocket.stop();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"socket->bytesAvailable(): "+std::to_string(socket->bytesAvailable())+" > clientList.at(index).size!: "+std::to_string(clientList.at(index).size));
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Query recomposed with this size: "+std::to_string(clientList.at(index).data.size()));
+ clientList[index].data.append(socket->readAll());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Query recomposed with this size: "+std::to_string(clientList.at(index).data.size()));
+ if(clientList.at(index).data.size()==clientList.at(index).size)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"QByteArray reconstruction finished");
+ QDataStream in(clientList.at(index).data);
+ QStringList ultracopierArguments;
+ in >> ultracopierArguments;
+ std::vector<std::string> ultracopierArgumentsStd;
+ {
+ int index=0;
+ while(index<ultracopierArguments.size())
+ {
+ ultracopierArgumentsStd.push_back(ultracopierArguments.at(index).toStdString());
+ index++;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"ultracopierArguments: "+ultracopierArguments.join(";").toStdString());
+ emit cli(ultracopierArgumentsStd,true,false);
+ clientList[index].data.clear();
+ clientList[index].haveData=false;
+ TimeOutQLocalSocket.stop();
+ }
+ else
+ {
+ TimeOutQLocalSocket.start();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Need wait to recomposite: "+std::to_string(clientList.at(index).data.size())+", targeted: "+std::to_string(clientList.at(index).size));
+ return;
+ }
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Socket not found???");
+}
+
+/// \brief Deconnexion client
+/// \todo Remove the data in wait linker with this socket
+void LocalListener::deconnectClient()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+
+ // Wich client leave
+ QLocalSocket *socket = qobject_cast<QLocalSocket *>(sender());
+ if (socket == 0) // If not found
+ return;
+ for (unsigned int i = 0; i < clientList.size(); ++i) {
+ if(clientList.at(i).socket==socket)
+ clientList.erase(clientList.cbegin()+i);
+ }
+ socket->deleteLater();
+}
+
+/// LocalListener New connexion
+void LocalListener::newConnexion()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"start");
+ ComposedData newClient;
+ newClient.socket = localServer.nextPendingConnection();
+ #ifdef ULTRACOPIER_DEBUG
+ connect(newClient.socket, static_cast<void(QLocalSocket::*)(QLocalSocket::LocalSocketError)>(&QLocalSocket::error), this, &LocalListener::error);
+ //connect(newClient.socket, &QLocalSocket::error, this, &LocalListener::error);
+ //connect(newClient.socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(error(QLocalSocket::LocalSocketError)));
+ #endif
+ connect(newClient.socket, &QLocalSocket::readyRead, this, &LocalListener::dataIncomming);
+ connect(newClient.socket, &QLocalSocket::disconnected, this, &LocalListener::deconnectClient);
+ newClient.size=-1;
+ newClient.haveData=false;
+ clientList.push_back(newClient);
+}
+
+#ifdef ULTRACOPIER_DEBUG
+/** \brief If error occured at socket
+\param theErrorDefine The error define */
+void LocalListener::error(const QLocalSocket::LocalSocketError &theErrorDefine)
+{
+ if(theErrorDefine!=QLocalSocket::PeerClosedError)
+ {
+ QLocalSocket *client=qobject_cast<QLocalSocket *>(QObject::sender());
+ if(client!=NULL)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Value:"+std::to_string(theErrorDefine)+", Error message: "+client->errorString().toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Value:"+std::to_string(theErrorDefine));
+ }
+}
+#endif
+
+/// \can now parse the cli
+void LocalListener::allPluginIsloaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::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,QDir::currentPath());
+
+ std::vector<std::string> ultracopierArgumentsStd;
+ {
+ int index=0;
+ while(index<ultracopierArguments.size())
+ {
+ ultracopierArgumentsStd.push_back(ultracopierArguments.at(index).toStdString());
+ index++;
+ }
+ }
+
+ emit cli(ultracopierArgumentsStd,false,false);
+}
diff --git a/LocalListener.h b/LocalListener.h
new file mode 100644
index 0000000..9f91a95
--- /dev/null
+++ b/LocalListener.h
@@ -0,0 +1,65 @@
+/** \file LocalListener.h
+\brief The have local server, to have unique instance, and send arguments to the current running instance
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef LOCALLISTENER_H
+#define LOCALLISTENER_H
+
+#include <QObject>
+#include <QLocalServer>
+#include <QLocalSocket>
+#include <QStringList>
+#include <QString>
+#include <QCoreApplication>
+#include <QMessageBox>
+#include <QTimer>
+#include <QList>
+#include <QByteArray>
+
+#include "Environment.h"
+#include "ExtraSocket.h"
+
+/** \brief To have unique instance, and pass arguments to the existing instance if needed */
+class LocalListener : public QObject
+{
+ Q_OBJECT
+public:
+ explicit LocalListener(QObject *parent = 0);
+ ~LocalListener();
+public slots:
+ /// try connect to existing server
+ bool tryConnect();
+ /// the listen server
+ void listenServer();
+private:
+ QLocalServer localServer;
+ QTimer TimeOutQLocalSocket;/// \todo by client
+ typedef struct {
+ QLocalSocket * socket;
+ QByteArray data;
+ int size;
+ bool haveData;
+ } ComposedData;
+ std::vector<ComposedData> clientList;
+private slots:
+ //the time is done
+ void timeoutDectected();
+ /// \brief Data is incomming
+ void dataIncomming();
+ /// \brief Deconnexion client
+ void deconnectClient();
+ /// LocalListener New connexion
+ void newConnexion();
+ #ifdef ULTRACOPIER_DEBUG
+ /** \brief If error occured at socket
+ \param theErrorDefine The error define */
+ void error(const QLocalSocket::LocalSocketError &theErrorDefine);
+ #endif
+ /// can now parse the cli
+ void allPluginIsloaded();
+signals:
+ void cli(const std::vector<std::string> &ultracopierArguments,const bool &external,const bool &onlyCheck) const;
+};
+
+#endif // LOCALLISTENER_H
diff --git a/LocalPluginOptions.cpp b/LocalPluginOptions.cpp
new file mode 100644
index 0000000..f981e0b
--- /dev/null
+++ b/LocalPluginOptions.cpp
@@ -0,0 +1,59 @@
+/** \file LocalPluginOptions.cpp
+\brief To bind the options of the plugin, into unique group options
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "LocalPluginOptions.h"
+
+LocalPluginOptions::LocalPluginOptions(const std::string &group)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start(\""+group+"\",[...])");
+ groupOptionAdded=false;
+ this->group=group;
+ connect(OptionEngine::optionEngine,&OptionEngine::resetOptions,this,&OptionInterface::resetOptions);
+}
+
+LocalPluginOptions::~LocalPluginOptions()
+{
+ if(groupOptionAdded)
+ {
+ if(OptionEngine::optionEngine!=NULL)
+ OptionEngine::optionEngine->removeOptionGroup(group);
+ }
+}
+
+/// \brief To add option group to options
+bool LocalPluginOptions::addOptionGroup(const std::vector<std::pair<std::string, std::string> > &KeysList)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start(\""+group+"\",[...])");
+ if(groupOptionAdded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Group already added!");
+ return false;
+ }
+ else
+ {
+ groupOptionAdded=true;
+ return OptionEngine::optionEngine->addOptionGroup(group,KeysList);
+ }
+}
+
+/// \brief To get option value
+std::string LocalPluginOptions::getOptionValue(const std::string &variableName) const
+{
+ return OptionEngine::optionEngine->getOptionValue(group,variableName);
+}
+
+/// \brief To set option value
+void LocalPluginOptions::setOptionValue(const std::string &variableName,const std::string &value)
+{
+ OptionEngine::optionEngine->setOptionValue(group,variableName,value);
+}
+
+/*-> disabled because the value will not externaly changed, then useless notification
+void LocalPluginOptions::newOptionValue(QString group,QString variable,QVariant value)
+{
+ if(group==this->group)
+ emit newOptionValue(variable,value);
+}*/
+
diff --git a/LocalPluginOptions.h b/LocalPluginOptions.h
new file mode 100644
index 0000000..9f30f2f
--- /dev/null
+++ b/LocalPluginOptions.h
@@ -0,0 +1,42 @@
+/** \file LocalPluginOptions.h
+\brief To bind the options of the plugin, into unique group options
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef LOCALPLUGINOPTIONS_H
+#define LOCALPLUGINOPTIONS_H
+
+#include <QObject>
+
+#include "interface/OptionInterface.h"
+#include "OptionEngine.h"
+
+/** \brief To store the options
+
+ That's allow to have mutualised way to store the options. Then the plugins just keep Ultracopier manage it, the portable version will store on the disk near the application, and the normal version will keep at the normal location.
+
+ \see OptionEngine::OptionEngine()
+*/
+class LocalPluginOptions : public OptionInterface
+{
+ Q_OBJECT
+public:
+ explicit LocalPluginOptions(const std::string &group);
+ ~LocalPluginOptions();
+ /// \brief To add option group to options
+ bool addOptionGroup(const std::vector<std::pair<std::string, std::string> > &KeysList);
+ /*/// \brief To remove option group to options, removed to the load plugin
+ bool removeOptionGroup();*/
+ /// \brief To get option value
+ std::string getOptionValue(const std::string &variableName) const;
+ /// \brief To set option value
+ void setOptionValue(const std::string &variableName,const std::string &value);
+protected:
+ //for the options
+ std::string group;
+ bool groupOptionAdded;
+/*public slots:-> disabled because the value will not externaly changed, then useless notification
+ void newOptionValue(QString group,QString variable,QVariant value);*/
+};
+
+#endif // LOCALPLUGINOPTIONS_H
diff --git a/LogThread.cpp b/LogThread.cpp
new file mode 100644
index 0000000..234ccbf
--- /dev/null
+++ b/LogThread.cpp
@@ -0,0 +1,296 @@
+/** \file LogThread.cpp
+\brief The thread to do the log but not block the main thread
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "LogThread.h"
+#include "ResourcesManager.h"
+#include "OptionEngine.h"
+#include "cpp11addition.h"
+
+#ifdef Q_OS_WIN32
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#endif
+#include <QMessageBox>
+
+std::string LogThread::text_header_copy="[Copy] ";
+std::string LogThread::text_header_move="[Move] ";
+std::string LogThread::text_header_skip="[Skip] ";
+std::string LogThread::text_header_stop="[Stop] ";
+std::string LogThread::text_header_error="[Error] ";
+std::string LogThread::text_header_MkPath="[MkPath] ";
+std::string LogThread::text_header_RmPath="[RmPath] ";
+
+std::string LogThread::text_var_source="%source%";
+std::string LogThread::text_var_size="%size%";
+std::string LogThread::text_var_destination="%destination%";
+std::string LogThread::text_var_path="%path%";
+std::string LogThread::text_var_error="%error%";
+std::string LogThread::text_var_mtime="%mtime%";
+std::string LogThread::text_var_time="%time%";
+std::string LogThread::text_var_timestring="%dd.MM.yyyy h:m:s%";
+#ifdef Q_OS_WIN32
+std::string LogThread::text_var_computer="%computer%";
+std::string LogThread::text_var_user="%user%";
+#endif
+std::string LogThread::text_var_operation="%operation%";
+std::string LogThread::text_var_rmPath="%rmPath%";
+std::string LogThread::text_var_mkPath="%mkPath%";
+
+LogThread::LogThread()
+{
+ sync=false;
+
+ connect(OptionEngine::optionEngine,&OptionEngine::newOptionValue, this, &LogThread::newOptionValue);
+
+ enabled=false;
+
+ moveToThread(this);
+ start(QThread::IdlePriority);
+
+ connect(this, &LogThread::newData, this,&LogThread::realDataWrite,Qt::QueuedConnection);
+
+ newOptionValue("Write_log", "transfer", OptionEngine::optionEngine->getOptionValue("Write_log","transfer"));
+ newOptionValue("Write_log", "error", OptionEngine::optionEngine->getOptionValue("Write_log","error"));
+ newOptionValue("Write_log", "folder", OptionEngine::optionEngine->getOptionValue("Write_log","folder"));
+ newOptionValue("Write_log", "sync", OptionEngine::optionEngine->getOptionValue("Write_log","sync"));
+ newOptionValue("Write_log", "transfer_format", OptionEngine::optionEngine->getOptionValue("Write_log","transfer_format"));
+ newOptionValue("Write_log", "error_format", OptionEngine::optionEngine->getOptionValue("Write_log","error_format"));
+ newOptionValue("Write_log", "folder_format", OptionEngine::optionEngine->getOptionValue("Write_log","folder_format"));
+ newOptionValue("Write_log", "sync", OptionEngine::optionEngine->getOptionValue("Write_log","sync"));
+ newOptionValue("Write_log", "enabled", OptionEngine::optionEngine->getOptionValue("Write_log","enabled"));
+ #ifdef Q_OS_WIN32
+ DWORD size=0;
+ WCHAR * computerNameW=new WCHAR[size];
+ if(GetComputerNameW(computerNameW,&size))
+ computer=QString::fromWCharArray(computerNameW,size-1).toStdString();
+ else
+ computer="Unknown computer";
+ delete computerNameW;
+
+ WCHAR * userNameW=new WCHAR[size];
+ if(GetUserNameW(userNameW,&size))
+ user=QString::fromWCharArray(userNameW,size-1).toStdString();
+ else
+ user="Unknown user";
+ delete userNameW;
+ #endif
+
+ #ifdef Q_OS_WIN32
+ lineReturn="\r\n";
+ #else
+ lineReturn="\n";
+ #endif
+}
+
+LogThread::~LogThread()
+{
+ closeLogs();
+ quit();
+ wait();
+}
+
+bool LogThread::logTransfer() const
+{
+ return enabled && log_enable_transfer;
+}
+
+void LogThread::openLogs()
+{
+ if(stringtobool(OptionEngine::optionEngine->getOptionValue("Write_log","enabled"))==false)
+ return;
+ if(log.isOpen())
+ {
+ QMessageBox::critical(NULL,tr("Error"),tr("Log file already open, error: %1").arg(log.errorString()));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"log file already open, error: "+log.errorString().toStdString());
+ return;
+ }
+ log.setFileName(QString::fromStdString(OptionEngine::optionEngine->getOptionValue("Write_log","file")));
+ if(sync)
+ {
+ if(!log.open(QIODevice::WriteOnly|QIODevice::Unbuffered))
+ {
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to open the log file, error: %1").arg(log.errorString()));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to open the log file, error: "+log.errorString().toStdString());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"opened log: "+OptionEngine::optionEngine->getOptionValue("Write_log","file"));
+ }
+ else
+ {
+ if(!log.open(QIODevice::WriteOnly))
+ {
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to open the log file, error: %1").arg(log.errorString()));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to open the log file, error: "+log.errorString().toStdString());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"opened log: "+OptionEngine::optionEngine->getOptionValue("Write_log","file"));
+ }
+}
+
+void LogThread::closeLogs()
+{
+ if(log.isOpen() && data.size()>0)
+ log.write(data.data(),data.size());
+ log.close();
+}
+
+void LogThread::newTransferStart(const Ultracopier::ItemOfCopyList &item)
+{
+ if(!logTransfer())
+ return;
+ std::string text;
+ if(item.mode==Ultracopier::Copy)
+ text=LogThread::text_header_copy+transfer_format+lineReturn;
+ else
+ text=LogThread::text_header_move+transfer_format+lineReturn;
+ text=replaceBaseVar(text);
+ //Variable is %source%, %size%, %destination%
+ stringreplaceAll(text,LogThread::text_var_source,item.sourceFullPath);
+ stringreplaceAll(text,LogThread::text_var_size,std::to_string(item.size));
+ stringreplaceAll(text,LogThread::text_var_destination,item.destinationFullPath);
+ stringreplaceAll(text,LogThread::text_var_time,QDateTime::currentDateTime().toString(QString::fromStdString(LogThread::text_var_timestring)).toStdString());
+ emit newData(text);
+}
+
+/** method called when new transfer is started */
+void LogThread::transferSkip(const Ultracopier::ItemOfCopyList &item)
+{
+ if(!logTransfer())
+ return;
+ std::string text=LogThread::text_header_skip+transfer_format+lineReturn;
+ text=replaceBaseVar(text);
+ //Variable is %source%, %size%, %destination%
+ stringreplaceAll(text,LogThread::text_var_source,item.sourceFullPath);
+ stringreplaceAll(text,LogThread::text_var_size,std::to_string(item.size));
+ stringreplaceAll(text,LogThread::text_var_destination,item.destinationFullPath);
+ stringreplaceAll(text,LogThread::text_var_time,QDateTime::currentDateTime().toString(QString::fromStdString(LogThread::text_var_timestring)).toStdString());
+ emit newData(text);
+}
+
+void LogThread::newTransferStop(const Ultracopier::ItemOfCopyList &item)
+{
+ if(!logTransfer())
+ return;
+ std::string text=LogThread::text_header_stop+transfer_format+lineReturn;
+ text=replaceBaseVar(text);
+ //Variable is %source%, %size%, %destination%
+ stringreplaceAll(text,LogThread::text_var_source,item.sourceFullPath);
+ stringreplaceAll(text,LogThread::text_var_size,std::to_string(item.size));
+ stringreplaceAll(text,LogThread::text_var_destination,item.destinationFullPath);
+ stringreplaceAll(text,LogThread::text_var_time,QDateTime::currentDateTime().toString(QString::fromStdString(LogThread::text_var_timestring)).toStdString());
+ emit newData(text);
+}
+
+void LogThread::error(const std::string &path,const uint64_t &size,const uint64_t &mtime,const std::string &error)
+{
+ if(!log_enable_error)
+ return;
+ std::string text=LogThread::text_header_error+error_format+lineReturn;
+ text=replaceBaseVar(text);
+ //Variable is %path%, %size%, %mtime%, %error%
+ stringreplaceAll(text,LogThread::text_var_path,path);
+ stringreplaceAll(text,LogThread::text_var_size,std::to_string(size));
+ stringreplaceAll(text,LogThread::text_var_mtime,QDateTime::fromTime_t(static_cast<unsigned int>(mtime)).toString(Qt::ISODate).toStdString());
+ stringreplaceAll(text,LogThread::text_var_error,error);
+ stringreplaceAll(text,LogThread::text_var_time,QDateTime::fromTime_t(static_cast<unsigned int>(mtime)).toString(QString::fromStdString(LogThread::text_var_timestring)).toStdString());
+ emit newData(text);
+}
+
+void LogThread::run()
+{
+ exec();
+}
+
+void LogThread::realDataWrite(const std::string &text)
+{
+ #ifdef ULTRACOPIER_DEBUG
+ if(!log.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer log not open");
+ return;
+ }
+ #endif // ULTRACOPIER_DEBUG
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(log.write(text.data(),text.size())==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to write into transfer log: "+log.errorString().toStdString());
+ return;
+ }
+ if(sync)
+ log.flush();
+}
+
+void LogThread::newOptionValue(const std::string &group,const std::string &name,const std::string &value)
+{
+ if(group!="Write_log")
+ return;
+
+ if(name=="transfer_format")
+ transfer_format=value;
+ else if(name=="error_format")
+ error_format=value;
+ else if(name=="folder_format")
+ folder_format=value;
+ else if(name=="sync")
+ {
+ sync=stringtobool(value);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sync flag is set on: "+value);
+ if(sync)
+ {
+ if(log.isOpen())
+ log.flush();
+ }
+ }
+ else if(name=="transfer")
+ log_enable_transfer=stringtobool(OptionEngine::optionEngine->getOptionValue("Write_log","enabled")) && stringtobool(value);
+ else if(name=="error")
+ log_enable_error=stringtobool(OptionEngine::optionEngine->getOptionValue("Write_log","enabled")) && stringtobool(value);
+ else if(name=="folder")
+ log_enable_folder=stringtobool(OptionEngine::optionEngine->getOptionValue("Write_log","enabled")) && stringtobool(value);
+ if(name=="enabled")
+ {
+ enabled=stringtobool(value);
+ if(enabled)
+ openLogs();
+ else
+ closeLogs();
+ }
+}
+
+std::string LogThread::replaceBaseVar(std::string text)
+{
+ stringreplaceAll(text,LogThread::text_var_time,QDateTime::currentDateTime().toString(QString::fromStdString(LogThread::text_var_timestring)).toStdString());
+ #ifdef Q_OS_WIN32
+ stringreplaceAll(text,LogThread::text_var_computer,computer);
+ stringreplaceAll(text,LogThread::text_var_user,user);
+ #endif
+ return text;
+}
+
+void LogThread::rmPath(const std::string &path)
+{
+ if(!logTransfer())
+ return;
+ std::string text=LogThread::text_header_RmPath+folder_format+lineReturn;
+ text=replaceBaseVar(text);
+ //Variable is %operation% %path%
+ stringreplaceAll(text,LogThread::text_var_path,path);
+ stringreplaceAll(text,LogThread::text_var_operation,LogThread::text_var_rmPath);
+ emit newData(text);
+}
+
+void LogThread::mkPath(const std::string &path)
+{
+ if(!logTransfer())
+ return;
+ std::string text=LogThread::text_header_MkPath+folder_format+lineReturn;
+ text=replaceBaseVar(text);
+ //Variable is %operation% %path%
+ stringreplaceAll(text,LogThread::text_var_path,path);
+ stringreplaceAll(text,LogThread::text_var_operation,LogThread::text_var_mkPath);
+ emit newData(text);
+}
diff --git a/LogThread.h b/LogThread.h
new file mode 100644
index 0000000..40f9154
--- /dev/null
+++ b/LogThread.h
@@ -0,0 +1,98 @@
+/** \file LogThread.h
+\brief The thread to do the log but not block the main thread
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef LOGTHREAD_H
+#define LOGTHREAD_H
+
+#include <QThread>
+#include <QString>
+#include <QDateTime>
+#include <QVariant>
+#include <QFile>
+
+#include "Environment.h"
+#include "StructEnumDefinition.h"
+
+/** \brief Log all the user oriented activity
+
+It use thread based storage to prevent gui thread freeze on log file writing when is out of the disk buffer. That's allow to async the event.
+*/
+class LogThread : public QThread
+{
+ Q_OBJECT
+public:
+ explicit LogThread();
+ ~LogThread();
+ bool logTransfer() const;
+public slots:
+ /** method called when new transfer is started */
+ void newTransferStart(const Ultracopier::ItemOfCopyList &item);
+ /** method called when transfer is stopped */
+ void newTransferStop(const Ultracopier::ItemOfCopyList &item);
+ /** method called when new transfer is started */
+ void transferSkip(const Ultracopier::ItemOfCopyList &item);
+ /** method called when new error is occurred */
+ void error(const std::string &path,const uint64_t &size,const uint64_t &mtime,const std::string &error);
+ /** method called when the log file need be created */
+ void openLogs();
+ /** method called when the log file need be closed */
+ void closeLogs();
+ /** method called when one folder is removed */
+ void rmPath(const std::string &path);
+ /** method called when one folder is created */
+ void mkPath(const std::string &path);
+private slots:
+ /** write the data into the file */
+ void realDataWrite(const std::string &text);
+ /** update the options value */
+ void newOptionValue(const std::string &group,const std::string &name,const std::string &value);
+signals:
+ void newData(const std::string &text) const;
+private:
+ std::string data;
+ std::string transfer_format;
+ std::string error_format;
+ std::string folder_format;
+ QFile log;
+ std::string lineReturn;
+ std::string replaceBaseVar(std::string text);
+ #ifdef Q_OS_WIN32
+ std::string computer;
+ std::string user;
+ #endif
+ bool sync;
+ bool enabled;
+ bool log_enable_transfer;
+ bool log_enable_error;
+ bool log_enable_folder;
+
+ static std::string text_header_copy;
+ static std::string text_header_move;
+ static std::string text_header_skip;
+ static std::string text_header_stop;
+ static std::string text_header_error;
+ static std::string text_header_MkPath;
+ static std::string text_header_RmPath;
+
+ static std::string text_var_source;
+ static std::string text_var_size;
+ static std::string text_var_destination;
+ static std::string text_var_path;
+ static std::string text_var_error;
+ static std::string text_var_mtime;
+ static std::string text_var_time;
+ static std::string text_var_timestring;
+ #ifdef Q_OS_WIN32
+ static std::string text_var_computer;
+ static std::string text_var_user;
+ #endif
+ static std::string text_var_operation;
+ static std::string text_var_rmPath;
+ static std::string text_var_mkPath;
+protected:
+ void run();
+};
+
+#endif // LOGTHREAD_H
diff --git a/OSSpecific.cpp b/OSSpecific.cpp
new file mode 100644
index 0000000..ada8d68
--- /dev/null
+++ b/OSSpecific.cpp
@@ -0,0 +1,58 @@
+#include "OSSpecific.h"
+#include "ui_OSSpecific.h"
+
+OSSpecific::OSSpecific(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::OSSpecific)
+{
+ ui->setupUi(this);
+ if(!QIcon::fromTheme(QStringLiteral("dialog-warning")).isNull())
+ setWindowIcon(QIcon::fromTheme(QStringLiteral("dialog-warning")));
+ updateText();
+}
+
+OSSpecific::~OSSpecific()
+{
+ delete ui;
+}
+
+void OSSpecific::updateText()
+{
+ QString text;
+ #if defined(Q_OS_LINUX)
+ text=tr("The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).<br />Ask the developer to support it.<br />You need do the copy/move manually.");
+ #elif defined(Q_OS_WIN32)
+ text=tr("Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).");
+ #elif defined(Q_OS_MAC)
+ text=tr("The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.<br />You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).");
+ #else
+ text=tr("The replacement of default copy/move system should be not supported by the file manager.<br />Ask to the developer to support it.<br />You need do the copy/move manually.");
+ #endif
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ text+=QStringLiteral("<br />")+tr("Consider Supercopier as deprecated, prefer Ultracopier");
+ #endif
+ ui->label->setText(text);
+}
+
+void OSSpecific::changeEvent(QEvent *e)
+{
+ QDialog::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ updateText();
+ break;
+ default:
+ break;
+ }
+}
+
+bool OSSpecific::dontShowAgain()
+{
+ return ui->dontShowAgain->isChecked();
+}
+
+void OSSpecific::on_pushButton_clicked()
+{
+ close();
+}
diff --git a/OSSpecific.h b/OSSpecific.h
new file mode 100644
index 0000000..0b6ffcb
--- /dev/null
+++ b/OSSpecific.h
@@ -0,0 +1,29 @@
+#ifndef OSSPECIFIC_H
+#define OSSPECIFIC_H
+
+#include "Environment.h"
+
+#include <QDialog>
+
+namespace Ui {
+class OSSpecific;
+}
+
+class OSSpecific : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit OSSpecific(QWidget *parent = 0);
+ ~OSSpecific();
+ bool dontShowAgain();
+private slots:
+ void on_pushButton_clicked();
+ void updateText();
+protected slots:
+ void changeEvent(QEvent *e);
+private:
+ Ui::OSSpecific *ui;
+};
+
+#endif // OSSPECIFIC_H
diff --git a/OSSpecific.ui b/OSSpecific.ui
new file mode 100644
index 0000000..3d0d89e
--- /dev/null
+++ b/OSSpecific.ui
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OSSpecific</class>
+ <widget class="QDialog" name="OSSpecific">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>88</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>500</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Warning</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="resources/ultracopier-resources.qrc">
+ <normaloff>:/warning.png</normaloff>:/warning.png</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="dontShowAgain">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Don't show again</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton">
+ <property name="text">
+ <string>Ok</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="resources/ultracopier-resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/OptionDialog.cpp b/OptionDialog.cpp
new file mode 100644
index 0000000..4c64875
--- /dev/null
+++ b/OptionDialog.cpp
@@ -0,0 +1,1015 @@
+/** \file OptionDialog.cpp
+\brief To have an interface to control the options
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "OptionDialog.h"
+#include "ui_OptionDialog.h"
+#include "OSSpecific.h"
+#include "LanguagesManager.h"
+#include "cpp11addition.h"
+
+#include <QDomElement>
+#include <QFileDialog>
+#include <QMessageBox>
+
+OptionDialog::OptionDialog() :
+ ui(new Ui::OptionDialog)
+{
+ quit=false;
+ QStringList ultracopierArguments=QCoreApplication::arguments();
+ if(ultracopierArguments.size()==2)
+ if(ultracopierArguments.last()==QStringLiteral("quit"))
+ quit=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ ignoreCopyEngineListEdition=false;
+ allPluginsIsLoaded=false;
+ oSSpecific=NULL;
+ ui->setupUi(this);
+ ui->treeWidget->topLevelItem(0)->setSelected(true);
+ 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();
+ number_of_listener=0;
+ ui->labelCatchCopyDefault->setEnabled(number_of_listener>0);
+ ui->CatchCopyAsDefault->setEnabled(number_of_listener>0);
+ ui->Language->setEnabled(false);
+ on_treeWidget_itemSelectionChanged();
+
+ //load the plugins
+ PluginsManager::pluginsManager->lockPluginListEdition();
+ connect(this, &OptionDialog::previouslyPluginAdded, this, &OptionDialog::onePluginAdded,Qt::QueuedConnection);
+ connect(PluginsManager::pluginsManager, &PluginsManager::onePluginAdded, this, &OptionDialog::onePluginAdded);
+ connect(PluginsManager::pluginsManager, &PluginsManager::onePluginInErrorAdded, this, &OptionDialog::onePluginAdded);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ connect(PluginsManager::pluginsManager, &PluginsManager::onePluginWillBeRemoved, this, &OptionDialog::onePluginWillBeRemoved,Qt::DirectConnection);
+ #endif
+ connect(PluginsManager::pluginsManager, &PluginsManager::pluginListingIsfinish, this, &OptionDialog::loadOption,Qt::QueuedConnection);
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ connect(PluginsManager::pluginsManager, &PluginsManager::manuallyAdded, this, &OptionDialog::manuallyAdded,Qt::QueuedConnection);
+ #endif
+ connect(OptionEngine::optionEngine, &OptionEngine::newOptionValue, this, &OptionDialog::newOptionValue);
+ std::vector<PluginsAvailable> list=PluginsManager::pluginsManager->getPlugins(true);
+ foreach(PluginsAvailable currentPlugin,list)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+currentPlugin.name+" ("+std::to_string(currentPlugin.category)+")");
+ emit previouslyPluginAdded(currentPlugin);
+ }
+ PluginsManager::pluginsManager->unlockPluginListEdition();
+ defaultImportBackend=PluginsManager::ImportBackend_File;
+ #ifndef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ ui->pluginAdd->hide();
+ ui->pluginRemove->hide();
+ #endif
+ loadLogVariableLabel();
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ ui->labelLoadAtSession->hide();
+ ui->LoadAtSessionStarting->hide();
+ #endif
+ #ifndef ULTRACOPIER_INTERNET_SUPPORT
+ ui->label_checkTheUpdate->hide();
+ ui->checkTheUpdate->hide();
+ #endif
+}
+
+OptionDialog::~OptionDialog()
+{
+ if(oSSpecific!=NULL)
+ delete oSSpecific;
+ delete ui;
+}
+
+//plugin management
+void OptionDialog::onePluginAdded(const PluginsAvailable &plugin)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+plugin.name+" ("+std::to_string(plugin.category)+")");
+ pluginStore newItem;
+ newItem.path=plugin.path;
+ newItem.item=new QTreeWidgetItem(QStringList() << QString::fromStdString(plugin.name) << QString::fromStdString(plugin.version));
+ newItem.isWritable=plugin.isWritable;
+ pluginLink.push_back(newItem);
+ switch(plugin.category)
+ {
+ case PluginType_CopyEngine:
+ ui->pluginList->topLevelItem(0)->addChild(newItem.item);
+ break;
+ case PluginType_Languages:
+ ui->pluginList->topLevelItem(1)->addChild(newItem.item);
+ addLanguage(plugin);
+ break;
+ case PluginType_Listener:
+ ui->pluginList->topLevelItem(2)->addChild(newItem.item);
+ number_of_listener++;
+ ui->labelCatchCopyDefault->setEnabled(number_of_listener>0);
+ ui->CatchCopyAsDefault->setEnabled(number_of_listener>0);
+ break;
+ case PluginType_PluginLoader:
+ ui->pluginList->topLevelItem(3)->addChild(newItem.item);
+ break;
+ case PluginType_SessionLoader:
+ ui->pluginList->topLevelItem(4)->addChild(newItem.item);
+ break;
+ case PluginType_Themes:
+ ui->pluginList->topLevelItem(5)->addChild(newItem.item);
+ addTheme(plugin);
+ break;
+ default:
+ case PluginType_Unknow:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"category not found for: "+plugin.path);
+ }
+}
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+void OptionDialog::onePluginWillBeRemoved(const PluginsAvailable &plugin)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ switch(plugin.category)
+ {
+ case PluginType_CopyEngine:
+ break;
+ case PluginType_Languages:
+ removeLanguage(plugin);
+ break;
+ case PluginType_Listener:
+ number_of_listener--;
+ ui->labelCatchCopyDefault->setEnabled(number_of_listener>0);
+ ui->CatchCopyAsDefault->setEnabled(number_of_listener>0);
+ break;
+ case PluginType_PluginLoader:
+ break;
+ case PluginType_SessionLoader:
+ break;
+ case PluginType_Themes:
+ removeTheme(plugin);
+ break;
+ default:
+ case PluginType_Unknow:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"category not found for: "+plugin.path);
+ }
+ //remove if have options
+ unsigned int index=0;
+ if(plugin.category==PluginType_CopyEngine || plugin.category==PluginType_Listener || plugin.category==PluginType_PluginLoader || plugin.category==PluginType_SessionLoader)
+ {
+ while(index<pluginOptionsWidgetList.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;
+ while(index<pluginLink.size())
+ {
+ if(pluginLink.at(index).path==plugin.path)
+ {
+ delete pluginLink.at(index).item;
+ pluginLink.erase(pluginLink.cbegin()+index);
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"not found!");
+}
+#endif
+
+#ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+void OptionDialog::manuallyAdded(const PluginsAvailable &plugin)
+{
+ if(plugin.category==PluginType_Themes)
+ {
+ if(QMessageBox::question(this,tr("Load"),tr("Load the theme?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes)==QMessageBox::Yes)
+ {
+ int index=ui->Ultracopier_current_theme->findData(QString::fromStdString(plugin.name));
+ if(index!=-1)
+ {
+ ui->Ultracopier_current_theme->setCurrentIndex(index);
+ on_Ultracopier_current_theme_currentIndexChanged(ui->Ultracopier_current_theme->currentIndex());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"theme plugin not found!");
+ }
+ }
+ else if(plugin.category==PluginType_Languages)
+ {
+ if(QMessageBox::question(this,tr("Load"),tr("Load the language?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes)==QMessageBox::Yes)
+ {
+ std::vector<std::pair<std::string,std::string>> listChildAttribute;
+ listChildAttribute.push_back(std::make_pair("mainCode", "true"));
+ int index=ui->Language->findData(QString::fromStdString(PluginsManager::pluginsManager->getDomSpecific(plugin.categorySpecific,"shortName",listChildAttribute)));
+ if(index!=-1)
+ {
+ ui->Language->setCurrentIndex(index);
+ ui->Language_force->setChecked(true);
+ on_Language_currentIndexChanged(index);
+ on_Language_force_toggled(true);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"language plugin not found!");
+ }
+ }
+}
+#endif
+
+void OptionDialog::addLanguage(const PluginsAvailable &plugin)
+{
+ std::vector<std::pair<std::string,std::string> > listChildAttribute;
+ std::pair<std::string,std::string> temp;
+ temp.first = "mainCode";
+ temp.second = "true";
+ listChildAttribute.push_back(temp);
+ ui->Language->addItem(QIcon(QString::fromStdString(plugin.path)+"flag.png"),
+ QString::fromStdString(PluginsManager::pluginsManager->getDomSpecific(plugin.categorySpecific,"fullName")),
+ QString::fromStdString(PluginsManager::pluginsManager->getDomSpecific(plugin.categorySpecific,"shortName",listChildAttribute)));
+ ui->Language->setEnabled(ui->Language_force->isChecked() && ui->Language->count());
+ ui->Language_force->setEnabled(ui->Language->count());
+}
+
+void OptionDialog::removeLanguage(const PluginsAvailable &plugin)
+{
+ std::vector<std::pair<std::string,std::string> > listChildAttribute;
+ std::pair<std::string,std::string> temp;
+ temp.first = "mainCode";
+ temp.second = "true";
+ listChildAttribute.push_back(temp);
+ int index=ui->Language->findData(QString::fromStdString(PluginsManager::pluginsManager->getDomSpecific(plugin.categorySpecific,"shortName",listChildAttribute)));
+ if(index!=-1)
+ ui->Language->removeItem(index);
+ ui->Language->setEnabled(ui->Language_force->isChecked() && ui->Language->count());
+ ui->Language_force->setEnabled(ui->Language->count());
+}
+
+void OptionDialog::addTheme(const PluginsAvailable &plugin)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"plugin.name: "+plugin.name);
+ ui->Ultracopier_current_theme->addItem(QString::fromStdString(plugin.name),QString::fromStdString(plugin.name));
+}
+
+void OptionDialog::removeTheme(const PluginsAvailable &plugin)
+{
+ int index=ui->Ultracopier_current_theme->findData(QString::fromStdString(plugin.name));
+ if(index!=-1)
+ ui->Ultracopier_current_theme->removeItem(index);
+}
+
+void OptionDialog::changeEvent(QEvent *e)
+{
+ QDialog::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"retranslate the ui");
+ ui->retranslateUi(this);
+ //old code to reload the widget because it dropped by the translation
+ /*
+ index=0;
+ loop_size=pluginOptionsWidgetList.size();
+ while(index<loop_size)
+ {
+ if(pluginOptionsWidgetList.at(index).options!=NULL)
+ ui->treeWidget->topLevelItem(2)->addChild(pluginOptionsWidgetList.at(index).item);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the copy engine "+std::to_string(index)+" have not the options");
+ 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 do not have any SessionLoader plugin"));
+ /*#if !defined(ULTRACOPIER_PLUGIN_ALL_IN_ONE) || !defined(ULTRACOPIER_VERSION_PORTABLE)
+ ui->LoadAtSessionStarting->setToolTip(tr("Disabled because you do not have any SessionLoader plugin"));
+ #endif*/
+ ui->ActionOnManualOpen->setItemText(0,tr("Do nothing"));
+ ui->ActionOnManualOpen->setItemText(1,tr("Ask source as folder"));
+ ui->ActionOnManualOpen->setItemText(2,tr("Ask sources as files"));
+ ui->GroupWindowWhen->setItemText(0,tr("Never"));
+ ui->GroupWindowWhen->setItemText(1,tr("When source is same"));
+ ui->GroupWindowWhen->setItemText(2,tr("When destination is same"));
+ ui->GroupWindowWhen->setItemText(3,tr("When source and destination are same"));
+ ui->GroupWindowWhen->setItemText(4,tr("When source or destination are same"));
+ ui->GroupWindowWhen->setItemText(5,tr("Always"));
+ loadLogVariableLabel();
+ break;
+ default:
+ break;
+ }
+}
+
+void OptionDialog::loadLogVariableLabel()
+{
+ QString append=QStringLiteral(" %time%");
+ #ifdef Q_OS_WIN32
+ append+=QStringLiteral(", %computer%, %user%");
+ #endif
+ ui->labelLogTransfer->setText(tr("The variables are %1").arg("%source%, %size%, %destination%"+append));
+ ui->labelLogError->setText(tr("The variables are %1").arg("%path%, %size%, %mtime%, %error%"+append));
+ ui->labelLogFolder->setText(tr("The variables are %1").arg("%path%, %operation%"+append));
+}
+
+void OptionDialog::on_treeWidget_itemSelectionChanged()
+{
+ QList<QTreeWidgetItem *> listSelectedItem=ui->treeWidget->selectedItems();
+ if(listSelectedItem.size()!=1)
+ return;
+ QTreeWidgetItem * selectedItem=listSelectedItem.first();
+ //general
+ if(selectedItem==ui->treeWidget->topLevelItem(0))
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetGeneral);
+ //plugins
+ else if(selectedItem==ui->treeWidget->topLevelItem(1))
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetPlugins);
+ //Copy engine
+ else if(selectedItem==ui->treeWidget->topLevelItem(2))
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetCopyEngine);
+ //Listener
+ else if(selectedItem==ui->treeWidget->topLevelItem(3))
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetListener);
+ //PluginLoader
+ //do nothing
+ //SessionLoader
+ //do nothing
+ //Themes
+ else if(selectedItem==ui->treeWidget->topLevelItem(6))
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetThemes);
+ //log
+ else if(selectedItem==ui->treeWidget->topLevelItem(7))
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetLog);
+ else
+ {
+ int index;
+ if(selectedItem->parent()==ui->treeWidget->topLevelItem(2))
+ {
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetCopyEngineOptions);
+ index=selectedItem->parent()->indexOfChild(selectedItem);
+ if(index!=-1)
+ ui->stackedOptionsCopyEngine->setCurrentIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"selection into of sub item wrong???");
+ }
+ else if(selectedItem->parent()==ui->treeWidget->topLevelItem(3))
+ {
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetListenerOptions);
+ index=selectedItem->parent()->indexOfChild(selectedItem);
+ if(index!=-1)
+ ui->stackedOptionsListener->setCurrentIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"selection into of sub item wrong???");
+ }
+ else if(selectedItem->parent()==ui->treeWidget->topLevelItem(4))
+ {
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetPluginLoaderOptions);
+ index=selectedItem->parent()->indexOfChild(selectedItem);
+ if(index!=-1)
+ ui->stackedOptionsPluginLoader->setCurrentIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"selection into of sub item wrong???");
+ }
+ else if(selectedItem->parent()==ui->treeWidget->topLevelItem(5))
+ {
+ ui->stackedWidget->setCurrentWidget(ui->stackedWidgetSessionLoaderOptions);
+ index=selectedItem->parent()->indexOfChild(selectedItem);
+ if(index!=-1)
+ ui->stackedOptionsSessionLoader->setCurrentIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"selection into of sub item wrong???");
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"selection into option list cat not found");
+ }
+}
+
+void OptionDialog::on_buttonBox_clicked(QAbstractButton *button)
+{
+ if(ui->buttonBox->buttonRole(button)==QDialogButtonBox::ResetRole)
+ OptionEngine::optionEngine->queryResetOptions();
+ else
+ this->close();
+}
+
+void OptionDialog::loadOption()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ newOptionValue("Themes", "Ultracopier_current_theme", OptionEngine::optionEngine->getOptionValue("Themes","Ultracopier_current_theme"));
+ newOptionValue("Ultracopier", "ActionOnManualOpen", OptionEngine::optionEngine->getOptionValue("Ultracopier","ActionOnManualOpen"));
+ newOptionValue("Ultracopier", "GroupWindowWhen", OptionEngine::optionEngine->getOptionValue("Ultracopier","GroupWindowWhen"));
+ newOptionValue("Ultracopier", "confirmToGroupWindows", OptionEngine::optionEngine->getOptionValue("Ultracopier","confirmToGroupWindows"));
+ newOptionValue("Ultracopier", "displayOSSpecific", OptionEngine::optionEngine->getOptionValue("Ultracopier","displayOSSpecific"));
+ newOptionValue("Ultracopier", "checkTheUpdate", OptionEngine::optionEngine->getOptionValue("Ultracopier","checkTheUpdate"));
+ newOptionValue("Ultracopier", "remainingTimeAlgorithm", OptionEngine::optionEngine->getOptionValue("Ultracopier","remainingTimeAlgorithm"));
+ newOptionValue("Language", "Language", OptionEngine::optionEngine->getOptionValue("Language","Language"));
+ newOptionValue("Language", "Language_force", OptionEngine::optionEngine->getOptionValue("Language","Language_force"));
+ #ifndef ULTRACOPIER_VERSION_PORTABLE
+ newOptionValue("SessionLoader", "LoadAtSessionStarting", OptionEngine::optionEngine->getOptionValue("SessionLoader","LoadAtSessionStarting"));
+ #endif
+ newOptionValue("CopyListener", "CatchCopyAsDefault", OptionEngine::optionEngine->getOptionValue("CopyListener","CatchCopyAsDefault"));
+ newOptionValue("CopyEngine", "List", OptionEngine::optionEngine->getOptionValue("CopyEngine","List"));
+ if(ResourcesManager::resourcesManager->getWritablePath().empty())
+ ui->checkBox_Log->setEnabled(false);
+ else
+ {
+ newOptionValue("Write_log", "enabled", OptionEngine::optionEngine->getOptionValue("Write_log","enabled"));
+ newOptionValue("Write_log", "file", OptionEngine::optionEngine->getOptionValue("Write_log","file"));
+ newOptionValue("Write_log", "transfer", OptionEngine::optionEngine->getOptionValue("Write_log","transfer"));
+ newOptionValue("Write_log", "error", OptionEngine::optionEngine->getOptionValue("Write_log","error"));
+ newOptionValue("Write_log", "folder", OptionEngine::optionEngine->getOptionValue("Write_log","folder"));
+ newOptionValue("Write_log", "transfer_format", OptionEngine::optionEngine->getOptionValue("Write_log","transfer_format"));
+ newOptionValue("Write_log", "error_format", OptionEngine::optionEngine->getOptionValue("Write_log","error_format"));
+ newOptionValue("Write_log", "folder_format", OptionEngine::optionEngine->getOptionValue("Write_log","folder_format"));
+ newOptionValue("Write_log", "sync", OptionEngine::optionEngine->getOptionValue("Write_log","sync"));
+ }
+ on_checkBox_Log_clicked();
+ #ifndef ULTRACOPIER_VERSION_PORTABLE
+ if(PluginsManager::pluginsManager->getPluginsByCategory(PluginType_SessionLoader).size()>0)
+ {
+ ui->labelLoadAtSession->setToolTip(QStringLiteral(""));
+ ui->LoadAtSessionStarting->setToolTip(QStringLiteral(""));
+ ui->labelLoadAtSession->setEnabled(true);
+ ui->LoadAtSessionStarting->setEnabled(true);
+ }
+ else
+ {
+ //ui->labelLoadAtSession->setToolTip(tr("Disabled because you do not have any SessionLoader plugin"));
+ //ui->LoadAtSessionStarting->setToolTip(tr("Disabled because you do not have any SessionLoader plugin"));
+ ui->labelLoadAtSession->setEnabled(false);
+ ui->LoadAtSessionStarting->setEnabled(false);
+ }
+ #endif
+ allPluginsIsLoaded=true;
+ on_Ultracopier_current_theme_currentIndexChanged(ui->Ultracopier_current_theme->currentIndex());
+
+ if(stringtobool(OptionEngine::optionEngine->getOptionValue("Ultracopier","displayOSSpecific")))
+ {
+ if(!quit)
+ {
+ oSSpecific=new OSSpecific();
+ oSSpecific->show();
+ connect(oSSpecific,&OSSpecific::finished,this,&OptionDialog::oSSpecificClosed,Qt::QueuedConnection);
+ }
+ }
+}
+
+void OptionDialog::oSSpecificClosed()
+{
+ if(oSSpecific==NULL)
+ return;
+ if(oSSpecific->dontShowAgain())
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","displayOSSpecific","false");
+ delete oSSpecific;
+ oSSpecific=NULL;
+}
+
+void OptionDialog::newOptionValue(const std::string &group,const std::string &name,const std::string &value)
+{
+ if(group=="Themes")
+ {
+ if(name=="Ultracopier_current_theme")
+ {
+ int index=ui->Ultracopier_current_theme->findData(QString::fromStdString(value));
+ if(index!=-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Themes located: "+value);
+ ui->Ultracopier_current_theme->setCurrentIndex(index);
+ }
+ else
+ {
+ if(ui->Ultracopier_current_theme->count()>0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Default to the current value: "+ui->Ultracopier_current_theme->itemData(ui->Ultracopier_current_theme->currentIndex()).toString().toStdString());
+ OptionEngine::optionEngine->setOptionValue("Themes","Ultracopier_current_theme",ui->Ultracopier_current_theme->itemData(ui->Ultracopier_current_theme->currentIndex()).toString().toStdString());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"No themes: "+value);
+ }
+ }
+ }
+ else if(group=="Language")
+ {
+ if(name=="Language")
+ {
+ int index=ui->Language->findData(QString::fromStdString(value));
+ if(index!=-1)
+ ui->Language->setCurrentIndex(index);
+ else if(ui->Language->count()>0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Language in settings: "+value);
+ OptionEngine::optionEngine->setOptionValue("Language","Language",ui->Language->itemData(ui->Language->currentIndex()).toString().toStdString());
+ }
+ }
+ else if(name=="Language_force")
+ {
+ ui->Language_force->setChecked(stringtobool(value));
+ ui->Language->setEnabled(ui->Language_force->isChecked() && ui->Language->count());
+ if(!ui->Language_force->isChecked())
+ {
+ const std::string &lang=LanguagesManager::languagesManager->autodetectedLanguage();
+ if(!lang.empty())
+ {
+ int index=ui->Language->findData(QString::fromStdString(lang));
+ if(index!=-1)
+ ui->Language->setCurrentIndex(index);
+ }
+ }
+ }
+ }
+ #ifndef ULTRACOPIER_VERSION_PORTABLE
+ else if(group=="SessionLoader")
+ {
+ if(name=="LoadAtSessionStarting")
+ {
+ ui->LoadAtSessionStarting->setChecked(stringtobool(value));
+ }
+ }
+ #endif
+ else if(group=="CopyListener")
+ {
+ if(name=="CatchCopyAsDefault")
+ {
+ ui->CatchCopyAsDefault->setChecked(stringtobool(value));
+ }
+ }
+ else if(group=="CopyEngine")
+ {
+ if(name=="List")
+ {
+ if(!ignoreCopyEngineListEdition)
+ {
+ QStringList copyEngine=QString::fromStdString(value).split(';');
+ copyEngine.removeDuplicates();
+ int index=0;
+ const 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")
+ {
+ if(name=="enabled")
+ ui->checkBox_Log->setChecked(stringtobool(value));
+ else if(name=="file")
+ ui->lineEditLog_File->setText(QString::fromStdString(value));
+ else if(name=="transfer")
+ ui->checkBoxLog_transfer->setChecked(stringtobool(value));
+ else if(name=="sync")
+ ui->checkBoxLog_sync->setChecked(stringtobool(value));
+ else if(name=="error")
+ ui->checkBoxLog_error->setChecked(stringtobool(value));
+ else if(name=="folder")
+ ui->checkBoxLog_folder->setChecked(stringtobool(value));
+ else if(name=="transfer_format")
+ ui->lineEditLog_transfer_format->setText(QString::fromStdString(value));
+ else if(name=="error_format")
+ ui->lineEditLog_error_format->setText(QString::fromStdString(value));
+ else if(name=="folder_format")
+ ui->lineEditLog_folder_format->setText(QString::fromStdString(value));
+ }
+ else if(group=="Ultracopier")
+ {
+ if(name=="ActionOnManualOpen")
+ ui->ActionOnManualOpen->setCurrentIndex(stringtoint32(value));
+ else if(name=="GroupWindowWhen")
+ ui->GroupWindowWhen->setCurrentIndex(stringtoint32(value));
+ else if(name=="confirmToGroupWindows")
+ ui->confirmToGroupWindows->setChecked(stringtobool(value));
+ else if(name=="displayOSSpecific")
+ ui->DisplayOSWarning->setChecked(stringtobool(value));
+ else if(name=="checkTheUpdate")
+ ui->checkTheUpdate->setChecked(stringtobool(value));
+ else if(name=="remainingTimeAlgorithm")
+ {
+ bool ok;
+ const uint32_t &valueInt=stringtouint32(value,&ok);
+ if(ok)
+ ui->remainingTimeAlgorithm->setCurrentIndex(static_cast<int>(valueInt));
+ }
+ }
+}
+
+void OptionDialog::on_Ultracopier_current_theme_currentIndexChanged(const int &index)
+{
+ if(index!=-1 && allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"data value: "+ui->Ultracopier_current_theme->itemData(index).toString().toStdString()+
+ ", string value: "+ui->Ultracopier_current_theme->itemText(index).toStdString()+
+ ", index: "+std::to_string(index));
+ OptionEngine::optionEngine->setOptionValue("Themes","Ultracopier_current_theme",ui->Ultracopier_current_theme->itemData(index).toString().toStdString());
+ unsigned int index_loop=0;
+ while(index_loop<pluginOptionsWidgetList.size())
+ {
+ if(pluginOptionsWidgetList.at(index_loop).name==ui->Ultracopier_current_theme->itemData(index).toString().toStdString())
+ {
+ if(pluginOptionsWidgetList.at(index_loop).options==NULL)
+ ui->stackedWidgetThemesOptions->setCurrentWidget(ui->pageThemeNoOptions);
+ else
+ ui->stackedWidgetThemesOptions->setCurrentWidget(pluginOptionsWidgetList.at(index_loop).options);
+ return;
+ }
+ index_loop++;
+ }
+ ui->stackedWidgetThemesOptions->setCurrentWidget(ui->pageUnableToLoadThemePlugin);
+ }
+}
+
+void OptionDialog::on_Language_currentIndexChanged(const int &index)
+{
+ if(index!=-1 && allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"data value: "+ui->Language->itemData(index).toString().toStdString()+
+ ", string value: "+ui->Language->itemText(index).toStdString()+", index: "+std::to_string(index));
+ OptionEngine::optionEngine->setOptionValue("Language","Language",ui->Language->itemData(index).toString().toStdString());
+ }
+}
+
+void OptionDialog::on_Language_force_toggled(const bool &checked)
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Language","Language_force",booltostring(checked));
+ ui->Language->setEnabled(ui->Language_force->isChecked() && ui->Language->count());
+ }
+}
+
+void OptionDialog::on_CatchCopyAsDefault_toggled(const bool &checked)
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("CopyListener","CatchCopyAsDefault",booltostring(checked));
+ }
+}
+
+#ifndef ULTRACOPIER_VERSION_PORTABLE
+void OptionDialog::on_LoadAtSessionStarting_toggled(const bool &checked)
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("SessionLoader","LoadAtSessionStarting",booltostring(checked));
+ }
+}
+#endif
+
+void OptionDialog::on_CopyEngineList_itemSelectionChanged()
+{
+ if(ui->CopyEngineList->selectedItems().size()!=0 && ui->CopyEngineList->count()>1)
+ {
+ ui->toolButtonUp->setEnabled(true);
+ ui->toolButtonDown->setEnabled(true);
+ }
+ else
+ {
+ ui->toolButtonUp->setEnabled(false);
+ ui->toolButtonDown->setEnabled(false);
+ }
+}
+
+void OptionDialog::on_toolButtonDown_clicked()
+{
+ QListWidgetItem *item=ui->CopyEngineList->selectedItems().first();
+ int position=ui->CopyEngineList->row(item);
+ if((position+1)<ui->CopyEngineList->count())
+ {
+ QString text=item->text();
+ item->setSelected(false);
+ delete item;
+ ui->CopyEngineList->insertItem(position+1,text);
+ ui->CopyEngineList->item(position+1)->setSelected(true);
+ ignoreCopyEngineListEdition=true;
+ OptionEngine::optionEngine->setOptionValue("CopyEngine","List",stringimplode(copyEngineStringList(),";"));
+ ignoreCopyEngineListEdition=false;
+ }
+}
+
+void OptionDialog::on_toolButtonUp_clicked()
+{
+ QListWidgetItem *item=ui->CopyEngineList->selectedItems().first();
+ int position=ui->CopyEngineList->row(item);
+ if(position>0)
+ {
+ QString text=item->text();
+ item->setSelected(false);
+ delete item;
+ ui->CopyEngineList->insertItem(position-1,text);
+ ui->CopyEngineList->item(position-1)->setSelected(true);
+ ignoreCopyEngineListEdition=true;
+ OptionEngine::optionEngine->setOptionValue("CopyEngine","List",stringimplode(copyEngineStringList(),";"));
+ ignoreCopyEngineListEdition=false;
+ }
+}
+
+std::vector<std::string> OptionDialog::copyEngineStringList() const
+{
+ std::vector<std::string> newList;
+ int index=0;
+ while(index<ui->CopyEngineList->count())
+ {
+ newList.push_back(ui->CopyEngineList->item(index)->text().toStdString());
+ index++;
+ }
+ return newList;
+}
+
+void OptionDialog::newThemeOptions(const std::string &name,QWidget* theNewOptionsWidget,bool isLoaded,bool havePlugin)
+{
+ Q_UNUSED(isLoaded);
+ Q_UNUSED(havePlugin);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: isLoaded: "+booltostring(isLoaded)+", havePlugin: "+
+ booltostring(havePlugin)+", name: "+name);
+ pluginOptionsWidget tempItem;
+ tempItem.name=name;
+ tempItem.item=NULL;
+ tempItem.options=theNewOptionsWidget;
+ tempItem.category=PluginType_Themes;
+ pluginOptionsWidgetList.push_back(tempItem);
+ if(theNewOptionsWidget!=NULL)
+ {
+ ui->stackedWidgetThemesOptions->addWidget(theNewOptionsWidget);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set the last page");
+ }
+ on_Ultracopier_current_theme_currentIndexChanged(ui->Ultracopier_current_theme->currentIndex());
+}
+
+void OptionDialog::addPluginOptionWidget(const PluginType &category,const std::string &name,QWidget * options)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+name+", category: "+std::to_string(category));
+ //prevent send the empty options
+ if(options!=NULL)
+ {
+ unsigned int index=0;
+ while(index<pluginOptionsWidgetList.size())
+ {
+ if(pluginOptionsWidgetList.at(index).name==name)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"already found: "+name);
+ return;
+ }
+ index++;
+ }
+ //add to real list
+ pluginOptionsWidget temp;
+ temp.name=name;
+ temp.options=options;
+ temp.item=new QTreeWidgetItem(QStringList() << QString::fromStdString(name));
+ temp.category=category;
+ pluginOptionsWidgetList.push_back(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(Ultracopier::DebugLevel_Critical,"Unable to parse this unknow type of plugin: "+name);
+ return;
+ }
+ }
+ //only for copy engine
+ if(category==PluginType_CopyEngine)
+ {
+ //but can loaded by the previous options
+ unsigned int index=0;
+ const unsigned int loop_size=static_cast<unsigned int>(ui->CopyEngineList->count());
+ while(index<loop_size)
+ {
+ if(ui->CopyEngineList->item(static_cast<int>(index))->text().toStdString()==name)
+ break;
+ index++;
+ }
+ if(index==loop_size)
+ ui->CopyEngineList->addItems(QStringList() << QString::fromStdString(name));
+ }
+}
+
+void OptionDialog::on_pluginList_itemSelectionChanged()
+{
+ if(ui->pluginList->selectedItems().size()==0)
+ {
+ ui->pluginRemove->setEnabled(false);
+ ui->pluginInformation->setEnabled(false);
+ }
+ else
+ {
+ treeWidgetItem=ui->pluginList->selectedItems().first();
+ unsigned int index=0;
+ while(index<pluginLink.size())
+ {
+ if(pluginLink.at(index).item==treeWidgetItem)
+ {
+ ui->pluginRemove->setEnabled(pluginLink.at(index).isWritable);
+ ui->pluginInformation->setEnabled(true);
+ return;
+ }
+ index++;
+ }
+ }
+}
+
+void OptionDialog::on_pluginInformation_clicked()
+{
+ treeWidgetItem=ui->pluginList->selectedItems().first();
+ unsigned int index=0;
+ while(index<pluginLink.size())
+ {
+ if(pluginLink.at(index).item==treeWidgetItem)
+ {
+ PluginsManager::pluginsManager->showInformation(pluginLink.at(index).path);
+ return;
+ }
+ index++;
+ }
+}
+
+#ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+void OptionDialog::on_pluginRemove_clicked()
+{
+ treeWidgetItem=ui->pluginList->selectedItems().first();
+ unsigned int index=0;
+ while(index<pluginLink.size())
+ {
+ if(pluginLink.at(index).item==treeWidgetItem)
+ {
+ PluginsManager::pluginsManager->removeThePluginSelected(pluginLink.at(index).path);
+ return;
+ }
+ index++;
+ }
+}
+
+void OptionDialog::on_pluginAdd_clicked()
+{
+ PluginsManager::pluginsManager->addPlugin(defaultImportBackend);
+}
+#endif
+
+void OptionDialog::on_checkBox_Log_clicked()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Write_log","enabled",booltostring(ui->checkBox_Log->isChecked()));
+ }
+ ui->lineEditLog_transfer_format->setEnabled(ui->checkBoxLog_transfer->isChecked() && ui->checkBox_Log->isChecked());
+ ui->lineEditLog_error_format->setEnabled(ui->checkBoxLog_error->isChecked() && ui->checkBox_Log->isChecked());
+ ui->lineEditLog_folder_format->setEnabled(ui->checkBoxLog_folder->isChecked() && ui->checkBox_Log->isChecked());
+}
+
+void OptionDialog::on_lineEditLog_File_editingFinished()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Write_log","file",ui->lineEditLog_File->text().toStdString());
+ }
+}
+
+void OptionDialog::on_lineEditLog_transfer_format_editingFinished()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Write_log","transfer_format",ui->lineEditLog_transfer_format->text().toStdString());
+ }
+}
+
+void OptionDialog::on_lineEditLog_error_format_editingFinished()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Write_log","error_format",ui->lineEditLog_error_format->text().toStdString());
+ }
+}
+
+void OptionDialog::on_checkBoxLog_transfer_clicked()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Write_log","transfer",booltostring(ui->checkBoxLog_transfer->isChecked()));
+ }
+}
+
+void OptionDialog::on_checkBoxLog_error_clicked()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Write_log","error",booltostring(ui->checkBoxLog_error->isChecked()));
+ }
+}
+
+void OptionDialog::on_checkBoxLog_folder_clicked()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Write_log","folder",booltostring(ui->checkBoxLog_folder->isChecked()));
+ }
+}
+
+void OptionDialog::on_logBrowse_clicked()
+{
+ QString file=QFileDialog::getSaveFileName(this,tr("Save logs as: "),QString::fromStdString(ResourcesManager::resourcesManager->getWritablePath()));
+ if(file!="")
+ {
+ ui->lineEditLog_File->setText(file);
+ on_lineEditLog_File_editingFinished();
+ }
+}
+
+void OptionDialog::on_checkBoxLog_sync_clicked()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Write_log","sync",booltostring(ui->checkBoxLog_sync->isChecked()));
+ }
+}
+
+void OptionDialog::on_ActionOnManualOpen_currentIndexChanged(const int &index)
+{
+ if(index!=-1 && allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"data value: "+ui->ActionOnManualOpen->itemData(index).toString().toStdString()+
+ ", string value: "+ui->ActionOnManualOpen->itemText(index).toStdString()+", index: "+std::to_string(index));
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","ActionOnManualOpen",std::to_string(index));
+ }
+}
+
+void OptionDialog::on_GroupWindowWhen_currentIndexChanged(const int &index)
+{
+ if(index!=-1 && allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"data value: "+ui->GroupWindowWhen->itemData(index).toString().toStdString()+
+ ", string value: "+ui->GroupWindowWhen->itemText(index).toStdString()+", index: "+std::to_string(index));
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","GroupWindowWhen",std::to_string(index));
+ }
+}
+
+void OptionDialog::on_DisplayOSWarning_clicked()
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","displayOSSpecific",booltostring(ui->DisplayOSWarning->isChecked()));
+ }
+}
+
+void OptionDialog::newClientList(const std::vector<std::string> &clientsList)
+{
+ ui->clientConnected->clear();
+ unsigned int index=0;
+ while(index<clientsList.size())
+ {
+ ui->clientConnected->addItem(QString::fromStdString(clientsList.at(index)));
+ index++;
+ }
+}
+
+void OptionDialog::on_checkTheUpdate_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","checkTheUpdate",booltostring(ui->checkTheUpdate->isChecked()));
+}
+
+void OptionDialog::on_confirmToGroupWindows_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","confirmToGroupWindows",booltostring(ui->confirmToGroupWindows->isChecked()));
+}
+
+void OptionDialog::on_remainingTimeAlgorithm_currentIndexChanged(int index)
+{
+ if(allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ OptionEngine::optionEngine->setOptionValue("Ultracopier","remainingTimeAlgorithm",std::to_string(index));
+ }
+}
diff --git a/OptionDialog.h b/OptionDialog.h
new file mode 100644
index 0000000..c8e9db3
--- /dev/null
+++ b/OptionDialog.h
@@ -0,0 +1,122 @@
+/** \file OptionDialog.h
+\brief To have an interface to control the options
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Environment.h"
+
+#ifndef OPTIONDIALOG_H
+#define OPTIONDIALOG_H
+
+#include <QDialog>
+#include <QAbstractButton>
+#include <QTreeWidgetItem>
+
+#include "Environment.h"
+#include "OSSpecific.h"
+#include "PluginsManager.h"
+
+namespace Ui {
+ class OptionDialog;
+}
+
+/** \brief Dialog for the options
+
+ It's need manage the ultracopier options, plugins selection, plugin prority.
+ It's need manage too the plugin options and plugins informations.
+ */
+class OptionDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ explicit OptionDialog();
+ ~OptionDialog();
+ /** \brief add the option widget from copy engine */
+ void addPluginOptionWidget(const PluginType &category,const std::string &name,QWidget * options);
+protected:
+ void changeEvent(QEvent *e);
+ void loadLogVariableLabel();
+private slots:
+ void on_treeWidget_itemSelectionChanged();
+ void on_buttonBox_clicked(QAbstractButton *button);
+ //plugin management
+ void onePluginAdded(const PluginsAvailable &plugin);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void onePluginWillBeRemoved(const PluginsAvailable &plugin);
+ #endif
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ void manuallyAdded(const PluginsAvailable &plugin);
+ #endif
+ void loadOption();
+ void newOptionValue(const std::string &group,const std::string &name,const std::string &value);
+ void on_Ultracopier_current_theme_currentIndexChanged(const int &index);
+ void on_Language_currentIndexChanged(const int &index);
+ void on_Language_force_toggled(const bool &checked);
+ void on_CatchCopyAsDefault_toggled(const bool &checked);
+ #ifndef ULTRACOPIER_VERSION_PORTABLE
+ void on_LoadAtSessionStarting_toggled(const bool &checked);
+ #endif
+ void on_CopyEngineList_itemSelectionChanged();
+ void on_toolButtonDown_clicked();
+ void on_toolButtonUp_clicked();
+ void on_pluginList_itemSelectionChanged();
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ void on_pluginRemove_clicked();
+ void on_pluginAdd_clicked();
+ #endif
+ void on_pluginInformation_clicked();
+ void on_checkBox_Log_clicked();
+ void on_lineEditLog_File_editingFinished();
+ void on_lineEditLog_transfer_format_editingFinished();
+ void on_lineEditLog_error_format_editingFinished();
+ void on_checkBoxLog_transfer_clicked();
+ void on_checkBoxLog_error_clicked();
+ void on_logBrowse_clicked();
+ void on_checkBoxLog_folder_clicked();
+ void on_checkBoxLog_sync_clicked();
+ void on_ActionOnManualOpen_currentIndexChanged(const int &index);
+ void on_GroupWindowWhen_currentIndexChanged(const int &index);
+ void on_DisplayOSWarning_clicked();
+ void on_checkTheUpdate_clicked();
+ void on_confirmToGroupWindows_clicked();
+ void oSSpecificClosed();
+ void on_remainingTimeAlgorithm_currentIndexChanged(int index);
+
+private:
+ bool quit;
+ Ui::OptionDialog *ui;
+ struct pluginStore
+ {
+ QTreeWidgetItem * item;
+ std::string path;
+ bool isWritable;
+ };
+ std::vector<pluginStore> pluginLink;
+ struct pluginOptionsWidget
+ {
+ std::string name;
+ QTreeWidgetItem * item;
+ QWidget *options;
+ PluginType category;
+ };
+ std::vector<pluginOptionsWidget> pluginOptionsWidgetList;
+ int number_of_listener;
+ void addLanguage(const PluginsAvailable &plugin);
+ void removeLanguage(const PluginsAvailable &plugin);
+ void addTheme(const PluginsAvailable &plugin);
+ void removeTheme(const PluginsAvailable &plugin);
+ std::vector<std::string> copyEngineStringList() const;
+ bool ignoreCopyEngineListEdition;
+ PluginsManager::ImportBackend defaultImportBackend;
+ int loadedCopyEnginePlugin;
+ QTreeWidgetItem * treeWidgetItem;
+ OSSpecific *oSSpecific;
+ bool allPluginsIsLoaded;
+public slots:
+ void newThemeOptions(const std::string &name,QWidget* theNewOptionsWidget,bool isLoaded,bool havePlugin);
+ void newClientList(const std::vector<std::string> &clientsList);
+signals:
+ void previouslyPluginAdded(const PluginsAvailable &plugin) const;
+};
+
+#endif // OPTIONDIALOG_H
diff --git a/OptionDialog.ui b/OptionDialog.ui
new file mode 100644
index 0000000..54d9591
--- /dev/null
+++ b/OptionDialog.ui
@@ -0,0 +1,988 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OptionDialog</class>
+ <widget class="QDialog" name="OptionDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>779</width>
+ <height>455</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Options</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="resources/ultracopier-resources.qrc">
+ <normaloff>:/options.png</normaloff>:/options.png</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <property name="leftMargin">
+ <number>1</number>
+ </property>
+ <property name="topMargin">
+ <number>1</number>
+ </property>
+ <property name="rightMargin">
+ <number>1</number>
+ </property>
+ <property name="bottomMargin">
+ <number>1</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QTreeWidget" name="treeWidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text">
+ <string>Options</string>
+ </property>
+ </column>
+ <item>
+ <property name="text">
+ <string>General</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Plugins</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Copy engine</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Listener</string>
+ </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>
+ <item>
+ <property name="text">
+ <string>Log</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QStackedWidget" name="stackedWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="stackedWidgetGeneral">
+ <layout class="QVBoxLayout" name="verticalLayout_9">
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::ExpandingFieldsGrow</enum>
+ </property>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="Language_force">
+ <property name="text">
+ <string>Force the language</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="Language"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelCatchCopyDefault">
+ <property name="text">
+ <string>Replace the default copy and move system</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="CatchCopyAsDefault">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="labelLoadAtSession">
+ <property name="text">
+ <string>Load at the session loading</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="LoadAtSessionStarting">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>When manual open</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QComboBox" name="ActionOnManualOpen">
+ <item>
+ <property name="text">
+ <string notr="true">Do nothing</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Ask source as folder</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Ask sources as files</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Group the windows when</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QComboBox" name="GroupWindowWhen">
+ <item>
+ <property name="text">
+ <string notr="true">Never</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">When source is same</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">When destination is same</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">When source and destination are same</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">When source or destination are same</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Always</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>Confirm to group the windows</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QCheckBox" name="confirmToGroupWindows"/>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>Display the OS warning</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QCheckBox" name="DisplayOSWarning"/>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="label_checkTheUpdate">
+ <property name="text">
+ <string>Check for updates</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="QCheckBox" name="checkTheUpdate"/>
+ </item>
+ <item row="8" column="0">
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>Remaining time algorithm</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="QComboBox" name="remainingTimeAlgorithm">
+ <item>
+ <property name="text">
+ <string>Traditional</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Logarithmic</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>309</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetPlugins">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QTreeWidget" name="pluginList">
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Version</string>
+ </property>
+ </column>
+ <item>
+ <property name="text">
+ <string>Copy engine</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Language</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Listener</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Plugin loader</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Session loader</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Themes</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Plugin</string>
+ </property>
+ <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="QToolButton" name="pluginAdd">
+ <property name="text">
+ <string>Add</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::MenuButtonPopup</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pluginRemove">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pluginInformation">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Information</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetCopyEngine">
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Copy engine by order of preference:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="formLayout">
+ <item>
+ <widget class="QListWidget" name="CopyEngineList">
+ <property name="uniformItemSizes">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="toolButtonUp">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="resources/ultracopier-resources.qrc">
+ <normaloff>:/moveUp.png</normaloff>:/moveUp.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolButtonDown">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="resources/ultracopier-resources.qrc">
+ <normaloff>:/moveDown.png</normaloff>:/moveDown.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>
+ <widget class="QWidget" name="stackedWidgetCopyEngineOptions">
+ <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_10">
+ <item>
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Client connected</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="clientConnected"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetListenerOptions">
+ <layout class="QVBoxLayout" name="verticalLayout_11">
+ <item>
+ <widget class="QStackedWidget" name="stackedOptionsListener"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetPluginLoaderOptions">
+ <layout class="QVBoxLayout" name="verticalLayout_12">
+ <item>
+ <widget class="QStackedWidget" name="stackedOptionsPluginLoader"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetSessionLoaderOptions">
+ <layout class="QVBoxLayout" name="verticalLayout_13">
+ <item>
+ <widget class="QStackedWidget" name="stackedOptionsSessionLoader"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetThemes">
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelThemes">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Themes:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="Ultracopier_current_theme"/>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QStackedWidget" name="stackedWidgetThemesOptions">
+ <property name="currentIndex">
+ <number>1</number>
+ </property>
+ <widget class="QWidget" name="pageUnableToLoadThemePlugin">
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>105</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="pixmap">
+ <pixmap resource="resources/ultracopier-resources.qrc">:/bug-128x128.png</pixmap>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="font">
+ <font>
+ <pointsize>15</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Unable to load the themes plugin</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>104</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="pageThemeNoOptions">
+ <layout class="QVBoxLayout" name="verticalLayout_8">
+ <item>
+ <spacer name="verticalSpacer_4">
+ <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_4">
+ <property name="pixmap">
+ <pixmap resource="resources/ultracopier-resources.qrc">:/none-128x128.png</pixmap>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>No option for this plugin</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_5">
+ <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="stackedWidgetLog">
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <widget class="QCheckBox" name="checkBox_Log">
+ <property name="text">
+ <string>Write the log file into:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QLineEdit" name="lineEditLog_File">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="logBrowse">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxLog_sync">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip">
+ <string>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</string>
+ </property>
+ <property name="text">
+ <string>Synchronized log</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxLog_transfer">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Write the transfers</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEditLog_transfer_format">
+ <property name="toolTip">
+ <string extracomment="%time%, %source%, %size%, %destination% should not be translated">The variables are %time%, %source%, %size%, %destination%</string>
+ </property>
+ <property name="placeholderText">
+ <string notr="true">[%time%] %source% (%size%) %destination%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelLogTransfer">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string notr="true" extracomment="%time%, %source%, %size%, %destination% should not be translated">The variables are %time%, %source%, %size%, %destination%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxLog_error">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Write the errors</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEditLog_error_format">
+ <property name="toolTip">
+ <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 notr="true">[%time%] %path%, %error%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelLogError">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string notr="true" extracomment="%time%, %path%, %size%, %mtime%, %error% should not be translated">The variables are %time%, %path%, %size%, %mtime%, %error%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxLog_folder">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Write the folder operations</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEditLog_folder_format">
+ <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 notr="true">[%time%] %operation% %path%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelLogFolder">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string notr="true" extracomment="%path%, %operation% should not be translated">The variables are %path%, %operation%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_9">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>255</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close|QDialogButtonBox::RestoreDefaults</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="resources/ultracopier-resources.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>checkBox_Log</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lineEditLog_File</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>313</x>
+ <y>13</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>533</x>
+ <y>44</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBox_Log</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>logBrowse</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>583</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>584</x>
+ <y>40</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBox_Log</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>checkBoxLog_transfer</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>345</x>
+ <y>21</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>582</x>
+ <y>105</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBox_Log</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>checkBoxLog_error</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>348</x>
+ <y>25</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>557</x>
+ <y>156</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxLog_transfer</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lineEditLog_transfer_format</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>537</x>
+ <y>105</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>533</x>
+ <y>131</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxLog_error</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lineEditLog_error_format</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>501</x>
+ <y>156</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>501</x>
+ <y>182</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBox_Log</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>checkBoxLog_folder</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>269</x>
+ <y>15</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>456</x>
+ <y>207</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBox_Log</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>checkBoxLog_sync</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>334</x>
+ <y>12</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>304</x>
+ <y>69</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/OptionEngine.cpp b/OptionEngine.cpp
new file mode 100644
index 0000000..ad2cf7c
--- /dev/null
+++ b/OptionEngine.cpp
@@ -0,0 +1,242 @@
+/** \file OptionEngine.cpp
+\brief Define the class of the event dispatcher
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QFileInfo>
+#include <QDir>
+#include <QLabel>
+#include <QComboBox>
+#include <QDialogButtonBox>
+#include <QMessageBox>
+
+#include "OptionEngine.h"
+
+/// \todo async the options write
+
+/// \brief Initiate the option, load from backend
+OptionEngine::OptionEngine()
+{
+ //locate the settings
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ QString settingsFilePath=QString::fromStdString(ResourcesManager::resourcesManager->getWritablePath());
+ if(settingsFilePath!="")
+ settings = new QSettings(settingsFilePath+QStringLiteral("Ultracopier.conf"),QSettings::IniFormat);
+ else
+ settings = NULL;
+ #else // ULTRACOPIER_VERSION_PORTABLE
+ settings = new QSettings(QStringLiteral("Ultracopier"),QStringLiteral("Ultracopier"));
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ if(settings!=NULL)
+ {
+ //do some write test
+ if(settings->status()!=QSettings::NoError)
+ {
+ delete settings;
+ settings=NULL;
+ }
+ else if(!settings->isWritable())
+ {
+ delete settings;
+ settings=NULL;
+ }
+ else
+ {
+ settings->setValue(QStringLiteral("test"),QStringLiteral("test"));
+ if(settings->status()!=QSettings::NoError)
+ {
+ delete settings;
+ settings=NULL;
+ }
+ else
+ {
+ settings->remove(QStringLiteral("test"));
+ if(settings->status()!=QSettings::NoError)
+ {
+ delete settings;
+ settings=NULL;
+ }
+ }
+ }
+ }
+ //set the backend
+ if(settings==NULL)
+ {
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ ResourcesManager::resourcesManager->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ else
+ currentBackend=File;
+}
+
+/// \brief Destroy the option
+OptionEngine::~OptionEngine()
+{
+}
+
+/// \brief To add option group to options
+bool OptionEngine::addOptionGroup(const std::string &groupName,const std::vector<std::pair<std::string, std::string> > &KeysList)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start(\""+groupName+"\",[...])");
+ //search if previous with the same name exists
+ if(GroupKeysList.find(groupName)!=GroupKeysList.cend())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"group already used previously");
+ return false;
+ }
+ //if the backend is file, enter into the group
+ if(currentBackend==File)
+ settings->beginGroup(QString::fromStdString(groupName));
+ //browse all key, and append it to the key
+ unsigned int index=0;
+ //QList<OptionEngineGroupKey> KeyListTemp;
+ while(index<KeysList.size())
+ {
+ OptionEngineGroupKey theCurrentKey;
+ theCurrentKey.defaultValue=KeysList.at(index).second;
+ //if memory backend, load the default value into the current value
+ if(currentBackend==Memory)
+ theCurrentKey.currentValue=theCurrentKey.defaultValue;
+ else
+ {
+ if(settings->contains(QString::fromStdString(KeysList.at(index).first)))//if file backend, load the default value from the file
+ {
+ theCurrentKey.currentValue=settings->value(QString::fromStdString(KeysList.at(index).first)).toString().toStdString();
+ #ifdef ULTRACOPIER_DEBUG
+ if(theCurrentKey.currentValue!=theCurrentKey.defaultValue)
+ {
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ if(groupName=="Ultracopier" && KeysList.at(index).first=="key")
+ {
+ }
+ else
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"The current key: "+groupName+", group: "+KeysList.at(index).first+", have value: "+theCurrentKey.currentValue);
+ }
+ #endif
+ }
+ 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(Ultracopier::DebugLevel_Warning,"Have writing error, switch to memory only options");
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ ResourcesManager::resourcesManager->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ }
+ GroupKeysList[groupName][KeysList.at(index).first]=theCurrentKey;
+ index++;
+ }
+ //if the backend is file, leave into the group
+ if(currentBackend==File)
+ settings->endGroup();
+ return true;
+}
+
+/// \brief To remove option group to options, remove the widget need be do into the calling object
+bool OptionEngine::removeOptionGroup(const std::string &groupName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, groupName: "+groupName);
+ if(GroupKeysList.erase(groupName)!=1)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName);
+ return false;
+}
+
+/// \brief To get option value
+std::string OptionEngine::getOptionValue(const std::string &groupName,const std::string &variableName) const
+{
+ if(GroupKeysList.find(groupName)!=GroupKeysList.cend())
+ {
+ const std::unordered_map<std::string,OptionEngineGroupKey> &optionEngineGroupKey=GroupKeysList.at(groupName);
+ if(optionEngineGroupKey.find(variableName)!=optionEngineGroupKey.cend())
+ return optionEngineGroupKey.at(variableName).currentValue;
+ QMessageBox::critical(NULL,"Internal error",tr("The variable was not found: %1 %2")
+ .arg(QString::fromStdString(groupName))
+ .arg(QString::fromStdString(variableName))
+ );
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName+", variableName: "+variableName);
+ return std::string();
+ }
+ QMessageBox::critical(NULL,"Internal error",tr("The variable was not found: %1 %2").arg(QString::fromStdString(groupName)).arg(QString::fromStdString(variableName)));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QString("The variable was not found: %1 %2")
+ .arg(QString::fromStdString(groupName))
+ .arg(QString::fromStdString(variableName))
+ .toStdString()
+ );
+ //return default value
+ return std::string();
+}
+
+/// \brief To set option value
+void OptionEngine::setOptionValue(const std::string &groupName,const std::string &variableName,const std::string &value)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"groupName: \""+groupName+"\", variableName: \""+variableName+"\", value: \""+value+"\"");
+
+ if(GroupKeysList.find(groupName)!=GroupKeysList.cend())
+ {
+ const std::unordered_map<std::string,OptionEngineGroupKey> &group=GroupKeysList.at(groupName);
+ if(group.find(variableName)!=group.cend())
+ {
+ //prevent re-write the same value into the variable
+ if(group.at(variableName).currentValue==value)
+ return;
+ //write ONLY the new value
+ GroupKeysList[groupName][variableName].currentValue=value;
+ if(currentBackend==File)
+ {
+ settings->beginGroup(QString::fromStdString(groupName));
+ settings->setValue(QString::fromStdString(variableName),QString::fromStdString(value));
+ settings->endGroup();
+ if(settings->status()!=QSettings::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Have writing error, switch to memory only options");
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ ResourcesManager::resourcesManager->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ }
+ emit newOptionValue(groupName,variableName,value);
+ return;
+ }
+ QMessageBox::critical(NULL,"Internal error",tr("The variable was not found: %1 %2").arg(QString::fromStdString(groupName)).arg(QString::fromStdString(variableName)));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName+", variableName: "+variableName);
+ return;
+ }
+ QMessageBox::critical(NULL,"Internal error",tr("The variable was not found: %1 %2").arg(QString::fromStdString(groupName)).arg(QString::fromStdString(variableName)));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"The variable was not found: "+groupName+" "+variableName);
+}
+
+//the reset of right value of widget need be do into the calling object
+void OptionEngine::internal_resetToDefaultValue()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+
+ for(auto& n:GroupKeysList)
+ {
+ const std::string &firstKey=n.first;
+ for(auto& m:n.second)
+ {
+ const std::string &secondKey=m.first;
+ OptionEngineGroupKey &o=m.second;
+ if(o.currentValue!=o.defaultValue)
+ {
+ o.currentValue=o.defaultValue;
+ emit newOptionValue(firstKey,secondKey,o.currentValue);
+ }
+ }
+ }
+}
+
+void OptionEngine::queryResetOptions()
+{
+ emit resetOptions();
+}
diff --git a/OptionEngine.h b/OptionEngine.h
new file mode 100644
index 0000000..027861f
--- /dev/null
+++ b/OptionEngine.h
@@ -0,0 +1,87 @@
+/** \file OptionEngine.h
+\brief Define the class of the option engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef OPTION_ENGINE_H
+#define OPTION_ENGINE_H
+
+#include <QDialog>
+#include <QList>
+#include <QSettings>
+#include <QFormLayout>
+#include <QLayout>
+#include <QStringList>
+#include <QFormLayout>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QSpinBox>
+#include <QAbstractButton>
+#include <QTimer>
+#include <QWidget>
+#include <QHash>
+#include <unordered_map>
+
+#include "interface/OptionInterface.h"
+
+#include "Environment.h"
+#include "ResourcesManager.h"
+
+/** \brief To store the options
+
+ That's allow to have mutualised way to store the options. Then the plugins just keep Ultracopier manage it, the portable version will store on the disk near the application, and the normal version will keep at the normal location.
+ That's allow to have cache and buffer to not slow down Ultracopier when it's doing heavy copy/move.
+*/
+class OptionEngine : public QObject
+{
+ Q_OBJECT
+ //class OptionEngine : public OptionInterface, public QDialog, public Singleton<OptionEngine>
+ public:
+ /// \brief Initiate the option, load from backend
+ OptionEngine();
+ /// \brief Destroy the option
+ ~OptionEngine();
+ /// \brief To add option group to options
+ bool addOptionGroup(const std::string &groupName,const std::vector<std::pair<std::string, std::string> > &KeysList);
+ /// \brief To remove option group to options, remove the widget need be do into the calling object
+ bool removeOptionGroup(const std::string &groupName);
+ /// \brief To get option value
+ std::string getOptionValue(const std::string &groupName,const std::string &variableName) const;
+ /// \brief To set option value
+ void setOptionValue(const std::string &groupName,const std::string &variableName,const std::string &value);
+ /// \brief To invalid option value
+ //void setInvalidOptionValue(const QString &groupName,const QString &variableName);
+ /// \brief get query reset options
+ void queryResetOptions();
+ private:
+ /// \brief OptionEngineGroupKey then: Group -> Key
+ struct OptionEngineGroupKey
+ {
+ std::string defaultValue;
+ std::string currentValue;
+ bool emptyList;
+ };
+
+ /// \brief store the option group list
+ std::unordered_map<std::string,std::unordered_map<std::string,OptionEngineGroupKey> > GroupKeysList;
+ std::vector<std::string> unmanagedTabName;
+ /// \brief Enumeration of backend
+ enum Backend
+ {
+ Memory, //Do intensive usage of memory, used only if the file backend is not available
+ File //Store all directly into file
+ };
+ /// \brief The current backend
+ Backend currentBackend;
+ /// \brief To store QSettings for the backend
+ QSettings *settings;
+ //the reset of right value of widget need be do into the calling object
+ void internal_resetToDefaultValue();
+ signals:
+ void newOptionValue(const std::string&,const std::string&,const std::string&) const;
+ void resetOptions() const;
+ public:
+ static OptionEngine *optionEngine;
+};
+
+#endif // OPTION_ENGINE_H
diff --git a/PlatformMacro.h b/PlatformMacro.h
new file mode 100644
index 0000000..d15329d
--- /dev/null
+++ b/PlatformMacro.h
@@ -0,0 +1,59 @@
+/** \file PlatformMacro.h
+\brief Define the macro for the platform
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QObject>
+
+#ifndef PLATFORM_MACRO_H
+#define PLATFORM_MACRO_H
+
+//windows
+#if defined(Q_OS_WIN32)
+ #if defined(_M_X64) //_WIN64
+ //windows 64Bits
+ #define ULTRACOPIER_PLATFORM_NAME tr("Windows 64Bits")
+ #define ULTRACOPIER_PLATFORM_CODE "windows-x86_64"
+ #else
+ //windows 32Bits
+ #define ULTRACOPIER_PLATFORM_NAME tr("Windows 32Bits")
+ #define ULTRACOPIER_PLATFORM_CODE "windows-x86"
+ #endif
+#elif defined(Q_OS_MAC)
+ //Mac OS X
+ #define ULTRACOPIER_PLATFORM_NAME tr("Mac OS X")
+ #define ULTRACOPIER_PLATFORM_CODE "mac-os-x"
+#elif defined(Q_OS_LINUX)
+ #if defined(__i386__)
+ //linux pc i386
+ #define ULTRACOPIER_PLATFORM_NAME tr("Linux pc i386")
+ #define ULTRACOPIER_PLATFORM_CODE "linux-i386-pc"
+ #elif defined(__i486__)
+ //linux pc i486
+ #define ULTRACOPIER_PLATFORM_NAME tr("Linux pc i486")
+ #define ULTRACOPIER_PLATFORM_CODE "linux-i486-pc"
+ #elif defined(__i586__)
+ //linux pc i586
+ #define ULTRACOPIER_PLATFORM_NAME tr("Linux pc i586")
+ #define ULTRACOPIER_PLATFORM_CODE "linux-i586-pc"
+ #elif defined(__i686__)
+ //linux pc i686
+ #define ULTRACOPIER_PLATFORM_NAME tr("Linux pc i686")
+ #define ULTRACOPIER_PLATFORM_CODE "linux-i686-pc"
+ #elif defined(__x86_64__)
+ //linux pc 64Bits
+ #define ULTRACOPIER_PLATFORM_NAME tr("Linux pc 64Bits")
+ #define ULTRACOPIER_PLATFORM_CODE "linux-x86_64-pc"
+ #else
+ //linux unknow
+ #define ULTRACOPIER_PLATFORM_NAME tr("Linux unknow platform")
+ #define ULTRACOPIER_PLATFORM_CODE "linux-unknow-pc"
+ #endif
+#else
+ //unknow
+ #define ULTRACOPIER_PLATFORM_NAME tr("Unknow platform")
+ #define ULTRACOPIER_PLATFORM_CODE "unknow"
+#endif
+
+#endif // PLATFORM_MACRO_H
+
diff --git a/PluginInformation.cpp b/PluginInformation.cpp
new file mode 100644
index 0000000..8c1551c
--- /dev/null
+++ b/PluginInformation.cpp
@@ -0,0 +1,120 @@
+/** \file PluginInformation.cpp
+\brief Define the plugin information
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "PluginInformation.h"
+#include "ui_PluginInformation.h"
+#include "cpp11addition.h"
+
+PluginInformation::PluginInformation() :
+ ui(new Ui::PluginInformation)
+{
+ ui->setupUi(this);
+ pluginIsLoaded=false;
+}
+
+PluginInformation::~PluginInformation()
+{
+ delete ui;
+}
+
+void PluginInformation::setPlugin(const PluginsAvailable &plugin)
+{
+ this->plugin=plugin;
+ pluginIsLoaded=true;
+ retranslateInformation();
+}
+
+void PluginInformation::setLanguage(const std::string &language)
+{
+ this->language=language;
+}
+
+std::string PluginInformation::categoryToTranslation(const PluginType &category) const
+{
+ switch(category)
+ {
+ case PluginType_CopyEngine:
+ return tr("Copy engine").toStdString();
+ case PluginType_Languages:
+ return tr("Languages").toStdString();
+ case PluginType_Listener:
+ return tr("Listener").toStdString();
+ case PluginType_PluginLoader:
+ return tr("Plugin loader").toStdString();
+ case PluginType_SessionLoader:
+ return tr("Session loader").toStdString();
+ case PluginType_Themes:
+ return tr("Themes").toStdString();
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"cat translation not found");
+ return tr("Unknown").toStdString();
+ }
+}
+
+void PluginInformation::retranslateInformation()
+{
+ if(!pluginIsLoaded)
+ return;
+ ui->retranslateUi(this);
+ this->setWindowTitle(tr("Information about %1").arg(QString::fromStdString(plugin.name)));
+ ui->name->setText(QString::fromStdString(plugin.name));
+ ui->title->setText(QString::fromStdString(getTranslatedText(plugin,"title",language)));
+ ui->category->setText(QString::fromStdString(categoryToTranslation(plugin.category)));
+ ui->author->setText(QString::fromStdString(getInformationText(plugin,"author")));
+ QString website=QString::fromStdString(getTranslatedText(plugin,"website",language));
+ ui->website->setText(QStringLiteral("<a href=\"")+website+QStringLiteral("\" title=\"")+website+QStringLiteral("\">")+website+QStringLiteral("</a>"));
+ bool ok;
+ int timeStamps=stringtoint32(getInformationText(plugin,"pubDate"),&ok);
+ QDateTime date;
+ date.setTime_t(timeStamps);
+ ui->date->setDateTime(date);
+ if(!ok || timeStamps<=0)
+ ui->date->setEnabled(false);
+ ui->description->setPlainText(QString::fromStdString(getTranslatedText(plugin,"description",language)));
+ ui->version->setText(QString::fromStdString(getInformationText(plugin,"version")));
+}
+
+/// \brief get informations text
+std::string PluginInformation::getInformationText(const PluginsAvailable &plugin,const std::string &informationName)
+{
+ unsigned int index=0;
+ while(index<plugin.informations.size())
+ {
+ const std::vector<std::string> &information=plugin.informations.at(index);
+ if(information.size()==2 && information.front()==informationName)
+ return information.back();
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"information not found: "+informationName+", for: "+plugin.name+", cat: "+categoryToTranslation(plugin.category));
+ return std::string();
+}
+
+/// \brief get translated text
+std::string PluginInformation::getTranslatedText(const PluginsAvailable &plugin,const std::string &informationName,const std::string &mainShortName)
+{
+ unsigned int index=0;
+ std::string TextFound;
+ while(index<plugin.informations.size())
+ {
+ const std::vector<std::string> &information=plugin.informations.at(index);
+ if(information.size()==3)
+ {
+ if(information.front()==informationName)
+ {
+ if(information.at(1)==mainShortName)
+ return information.back();
+ else if(information.at(1)=="en")
+ TextFound=information.back();
+
+ }
+ }
+ index++;
+ }
+ #ifdef ULTRACOPIER_DEBUG
+ if(TextFound.empty() || TextFound.empty())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"text is not found or empty for: "+informationName+", with the language: "+mainShortName+", for the plugin: "+plugin.path);
+ #endif // ULTRACOPIER_DEBUG
+ return TextFound;
+}
diff --git a/PluginInformation.h b/PluginInformation.h
new file mode 100644
index 0000000..d3c1d5a
--- /dev/null
+++ b/PluginInformation.h
@@ -0,0 +1,42 @@
+/** \file PluginInformation.h
+\brief Define the plugin information
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGININFORMATION_H
+#define PLUGININFORMATION_H
+
+#include <QDialog>
+#include <QDateTime>
+
+#include "Environment.h"
+
+namespace Ui {
+ class PluginInformation;
+}
+
+/** \brief to show the plugin information */
+class PluginInformation : public QDialog
+{
+ Q_OBJECT
+ public:
+ explicit PluginInformation();
+ ~PluginInformation();
+ /** \brief get translated categorie */
+ std::string categoryToTranslation(const PluginType &category) const;
+ /** \brief to get the new plugin informations */
+ void setPlugin(const PluginsAvailable &plugin);
+ /** \brief to set the language */
+ void setLanguage(const std::string &language);
+ public slots:
+ void retranslateInformation();
+ private:
+ bool pluginIsLoaded;
+ PluginsAvailable plugin;
+ Ui::PluginInformation *ui;
+ std::string language;
+ std::string getInformationText(const PluginsAvailable &plugin,const std::string &informationName);
+ std::string getTranslatedText(const PluginsAvailable &plugin,const std::string &informationName,const std::string &mainShortName);
+};
+
+#endif // PLUGININFORMATION_H
diff --git a/PluginInformation.ui b/PluginInformation.ui
new file mode 100644
index 0000000..64a0bd1
--- /dev/null
+++ b/PluginInformation.ui
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PluginInformation</class>
+ <widget class="QDialog" name="PluginInformation">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>About this plugin</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout_2">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::ExpandingFieldsGrow</enum>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="name">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Category:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="category">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Author:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLineEdit" name="author">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Website:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="website">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Date:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QDateTimeEdit" name="date">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Description:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QTextEdit" name="description">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>Version:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="QLineEdit" name="version">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Title:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="title">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/PluginLoader.cpp b/PluginLoader.cpp
new file mode 100644
index 0000000..36101a4
--- /dev/null
+++ b/PluginLoader.cpp
@@ -0,0 +1,339 @@
+/** \file PluginLoader.h
+\brief Define the plugin loader
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "PluginLoader.h"
+#include "LanguagesManager.h"
+
+#ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+#ifdef Q_OS_WIN32
+#include "plugins/PluginLoader/catchcopy-v0002/pluginLoader.h"
+#endif
+#endif
+
+PluginLoader::PluginLoader(OptionDialog *optionDialog)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->optionDialog=optionDialog;
+ //load the overall instance
+ //load the plugin
+ PluginsManager::pluginsManager->lockPluginListEdition();
+ connect(this,&PluginLoader::previouslyPluginAdded, this,&PluginLoader::onePluginAdded,Qt::QueuedConnection);
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginAdded, this,&PluginLoader::onePluginAdded,Qt::QueuedConnection);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginWillBeRemoved,this,&PluginLoader::onePluginWillBeRemoved,Qt::DirectConnection);
+ #endif
+ connect(PluginsManager::pluginsManager,&PluginsManager::pluginListingIsfinish, this,&PluginLoader::allPluginIsloaded,Qt::QueuedConnection);
+ std::vector<PluginsAvailable> list=PluginsManager::pluginsManager->getPluginsByCategory(PluginType_PluginLoader);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
+ PluginsManager::pluginsManager->unlockPluginListEdition();
+ needEnable=false;
+ last_state=Ultracopier::Uncaught;
+ last_have_plugin=false;
+ last_inWaitOfReply=false;
+ stopIt=false;
+}
+
+PluginLoader::~PluginLoader()
+{
+ stopIt=true;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ {
+ /* why it crash here? Only under Window with PluginLoader/catchcopy-v0002
+ int index=0;
+ while(index<pluginList.size())
+ {
+ pluginList.at(index).pluginLoaderInterface->setEnabled(false);
+ if(pluginList.at(index).pluginLoader!=NULL)
+ {
+ if(!pluginList.at(index).pluginLoader->isLoaded() || pluginList.at(index).pluginLoader->unload())
+ {
+ delete pluginList.at(index).options;
+ pluginList.removeAt(index);
+ }
+ else
+ index++;
+ }
+ else
+ index++;
+ }//*/
+ }
+ #endif
+}
+
+void PluginLoader::resendState()
+{
+ if(stopIt)
+ return;
+ sendState(true);
+}
+
+void PluginLoader::onePluginAdded(const PluginsAvailable &plugin)
+{
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ #ifdef Q_OS_WIN32
+ PluginInterface_PluginLoader *factory;
+ #endif
+ #endif
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ if(stopIt)
+ return;
+ if(plugin.category!=PluginType_PluginLoader)
+ return;
+ LocalPlugin newEntry;
+ std::string pluginPath=plugin.path+PluginsManager::getResolvedPluginName("pluginLoader");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"try load: "+pluginPath);
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ PluginInterface_PluginLoader *pluginLoaderInstance;
+ QObjectList objectList=QPluginLoader::staticInstances();
+ int index=0;
+ QObject *pluginObject;
+ while(index<objectList.size())
+ {
+ pluginObject=objectList.at(index);
+ pluginLoaderInstance = qobject_cast<PluginInterface_PluginLoader *>(pluginObject);
+ if(pluginLoaderInstance!=NULL)
+ break;
+ index++;
+ }
+ if(index==objectList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"static listener not found");
+ return;
+ }
+ newEntry.pluginLoader=NULL;
+ #else
+ QPluginLoader *pluginLoader= new QPluginLoader(QString::fromStdString(pluginPath));
+ QObject *pluginInstance = pluginLoader->instance();
+ if(!pluginInstance)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to load the plugin: "+pluginLoader->errorString().toStdString());
+ return;
+ }
+ PluginInterface_PluginLoader *pluginLoaderInstance = qobject_cast<PluginInterface_PluginLoader *>(pluginInstance);
+ if(!pluginLoaderInstance)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to cast the plugin: "+pluginLoader->errorString().toStdString());
+ return;
+ }
+ newEntry.pluginLoader = pluginLoader;
+ //check if found
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).pluginLoaderInterface==pluginLoaderInstance)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Plugin already found");
+ pluginLoader->unload();
+ return;
+ }
+ index++;
+ }
+ #endif
+ #ifdef ULTRACOPIER_DEBUG
+ connect(pluginLoaderInstance,&PluginInterface_PluginLoader::debugInformation,this,&PluginLoader::debugInformation,Qt::DirectConnection);
+ #endif // ULTRACOPIER_DEBUG
+
+ newEntry.options=new LocalPluginOptions("PluginLoader-"+plugin.name);
+ newEntry.pluginLoaderInterface = pluginLoaderInstance;
+ newEntry.path = plugin.path;
+ newEntry.state = Ultracopier::Uncaught;
+ newEntry.inWaitOfReply = false;
+ pluginList.push_back(newEntry);
+ pluginLoaderInstance->setResources(newEntry.options,plugin.writablePath,plugin.path,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ optionDialog->addPluginOptionWidget(PluginType_PluginLoader,plugin.name,newEntry.pluginLoaderInterface->options());
+ connect(pluginList.back().pluginLoaderInterface,&PluginInterface_PluginLoader::newState,this,&PluginLoader::newState,Qt::DirectConnection);
+ connect(LanguagesManager::languagesManager,&LanguagesManager::newLanguageLoaded,newEntry.pluginLoaderInterface,&PluginInterface_PluginLoader::newLanguageLoaded,Qt::DirectConnection);
+ if(needEnable)
+ {
+ pluginList.back().inWaitOfReply=true;
+ newEntry.pluginLoaderInterface->setEnabled(needEnable);
+ }
+ #else
+ #ifdef Q_OS_WIN32
+ factory=new WindowsExplorerLoader();
+ LocalPlugin newEntry;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ newEntry.pluginLoader=NULL;
+ #endif
+
+ newEntry.options=new LocalPluginOptions("PluginLoader-"+plugin.name);
+ newEntry.pluginLoaderInterface = new WindowsExplorerLoader();
+ newEntry.path = plugin.path;
+ newEntry.state = Ultracopier::Uncaught;
+ newEntry.inWaitOfReply = false;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ #ifdef ULTRACOPIER_DEBUG
+ connect(newEntry.pluginLoaderInterface,&PluginInterface_PluginLoader::debugInformation,this,&PluginLoader::debugInformation,Qt::DirectConnection);
+ #endif // ULTRACOPIER_DEBUG
+ #endif
+ pluginList.push_back(newEntry);
+ newEntry.pluginLoaderInterface->setResources(newEntry.options,plugin.writablePath,plugin.path,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ optionDialog->addPluginOptionWidget(PluginType_PluginLoader,plugin.name,newEntry.pluginLoaderInterface->options());
+ connect(pluginList.back().pluginLoaderInterface,&PluginInterface_PluginLoader::newState,this,&PluginLoader::newState,Qt::DirectConnection);
+ connect(LanguagesManager::languagesManager,&LanguagesManager::newLanguageLoaded,newEntry.pluginLoaderInterface,&PluginInterface_PluginLoader::newLanguageLoaded,Qt::DirectConnection);
+ if(needEnable)
+ {
+ pluginList.back().inWaitOfReply=true;
+ newEntry.pluginLoaderInterface->setEnabled(needEnable);
+ }
+ #endif
+ Q_UNUSED(plugin);
+ #endif
+}
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+void PluginLoader::onePluginWillBeRemoved(const PluginsAvailable &plugin)
+{
+ if(stopIt)
+ return;
+ if(plugin.category!=PluginType_PluginLoader)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(plugin.path==pluginList.at(index).path)
+ {
+ pluginList.at(index).pluginLoaderInterface->setEnabled(false);
+ if(pluginList.at(index).pluginLoader!=NULL)
+ {
+ if(!pluginList.at(index).pluginLoader->isLoaded() || pluginList.at(index).pluginLoader->unload())
+ {
+ delete pluginList.at(index).options;
+ pluginList.erase(pluginList.cbegin()+index);
+ }
+ }
+ sendState();
+ return;
+ }
+ index++;
+ }
+}
+#endif
+
+void PluginLoader::load()
+{
+ if(stopIt)
+ return;
+ needEnable=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ pluginList[index].inWaitOfReply=true;
+ pluginList.at(index).pluginLoaderInterface->setEnabled(true);
+ index++;
+ }
+ sendState(true);
+}
+
+void PluginLoader::unload()
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ needEnable=false;
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ pluginList[index].inWaitOfReply=true;
+ pluginList.at(index).pluginLoaderInterface->setEnabled(false);
+ index++;
+ }
+ sendState(true);
+}
+
+#ifdef ULTRACOPIER_DEBUG
+void PluginLoader::debugInformation(const Ultracopier::DebugLevel &level,const std::string& fonction,const std::string& text,const std::string& file,const unsigned int& ligne)
+{
+ DebugEngine::addDebugInformationStatic(level,fonction,text,file,ligne,"Plugin loader plugin");
+}
+#endif // ULTRACOPIER_DEBUG
+
+void PluginLoader::allPluginIsloaded()
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"with value: "+std::to_string(pluginList.size()>0));
+ sendState(true);
+}
+
+void PluginLoader::sendState(bool force)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, pluginList.size(): "+std::to_string(pluginList.size())+", force: "+std::to_string(force));
+ Ultracopier::CatchState current_state=Ultracopier::Uncaught;
+ bool found_not_listen=false,found_listen=false,found_inWaitOfReply=false;
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(current_state==Ultracopier::Uncaught)
+ {
+ if(pluginList.at(index).state==Ultracopier::Semiuncaught)
+ current_state=Ultracopier::Semiuncaught;
+ else if(pluginList.at(index).state==Ultracopier::Uncaught)
+ found_not_listen=true;
+ else if(pluginList.at(index).state==Ultracopier::Caught)
+ found_listen=true;
+ }
+ if(pluginList.at(index).inWaitOfReply)
+ found_inWaitOfReply=true;
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"current_state: "+std::to_string(current_state));
+ if(current_state==Ultracopier::Uncaught)
+ {
+ if(!found_not_listen && !found_listen)
+ {
+ if(needEnable)
+ current_state=Ultracopier::Caught;
+ }
+ else if(found_not_listen && !found_listen)
+ current_state=Ultracopier::Uncaught;
+ else if(!found_not_listen && found_listen)
+ current_state=Ultracopier::Caught;
+ else
+ current_state=Ultracopier::Semiuncaught;
+ }
+ bool have_plugin=pluginList.size()>0;
+ if(force || current_state!=last_state || have_plugin!=last_have_plugin || found_inWaitOfReply!=last_inWaitOfReply)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"send pluginLoaderReady("+std::to_string(current_state)+","+std::to_string(have_plugin)+","+std::to_string(found_inWaitOfReply)+")");
+ emit pluginLoaderReady(current_state,have_plugin,found_inWaitOfReply);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Skip the signal sending");
+ last_state=current_state;
+ last_have_plugin=have_plugin;
+ last_inWaitOfReply=found_inWaitOfReply;
+}
+
+void PluginLoader::newState(const Ultracopier::CatchState &state)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, state: "+std::to_string(state));
+ PluginInterface_PluginLoader *temp=qobject_cast<PluginInterface_PluginLoader *>(QObject::sender());
+ if(temp==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"listener not located!");
+ return;
+ }
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(temp==pluginList.at(index).pluginLoaderInterface)
+ {
+ pluginList[index].state=state;
+ pluginList[index].inWaitOfReply=false;
+ sendState(true);
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"listener not found!");
+}
diff --git a/PluginLoader.h b/PluginLoader.h
new file mode 100644
index 0000000..83dcc11
--- /dev/null
+++ b/PluginLoader.h
@@ -0,0 +1,82 @@
+/** \file PluginLoader.h
+\brief Define the class to load the plugin and lunch it
+\author alpha_one_x86
+\licence GPL3, see the file COPYING
+
+This class load ALL plugin compatible to listen and catch the copy/move
+*/
+
+#ifndef PluginLoader_H
+#define PluginLoader_H
+
+#include <QObject>
+#include <QList>
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#include <QPluginLoader>
+#endif
+#include <QString>
+#include <QStringList>
+
+#include "interface/PluginInterface_PluginLoader.h"
+#include "PluginsManager.h"
+#include "OptionDialog.h"
+#include "LocalPluginOptions.h"
+
+namespace Ui {
+ class PluginLoaderOptions;
+}
+
+/** \brief Load the plugin
+
+ It use ResourcesManager(), but it provide more higher abstraction. It parse the plugins information, check it, check the dependancies.
+
+ \see ResourcesManager::ResourcesManager()
+ */
+class PluginLoader : public QObject
+{
+ Q_OBJECT
+public:
+ explicit PluginLoader(OptionDialog *optionDialog);
+ ~PluginLoader();
+ /** \brief to rended the state */
+ void resendState();
+ /** \brief should load plugin into file manager if needed */
+ void load();
+ /** \brief should unload plugin into file manager */
+ void unload();
+private slots:
+ void onePluginAdded(const PluginsAvailable &plugin);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void onePluginWillBeRemoved(const PluginsAvailable &plugin);
+ #endif
+ #ifdef ULTRACOPIER_DEBUG
+ void debugInformation(const Ultracopier::DebugLevel &level, const std::string& fonction, const std::string& text, const std::string& file, const unsigned int &ligne);
+ #endif // ULTRACOPIER_DEBUG
+ void allPluginIsloaded();
+ void newState(const Ultracopier::CatchState &state);
+private:
+ //variable
+ struct LocalPlugin
+ {
+ PluginInterface_PluginLoader * pluginLoaderInterface;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ QPluginLoader * pluginLoader;
+ #endif
+ Ultracopier::CatchState state;
+ std::string path;
+ bool inWaitOfReply;
+ LocalPluginOptions *options;
+ };
+ std::vector<LocalPlugin> pluginList;
+ bool needEnable;
+ Ultracopier::CatchState last_state;
+ bool last_have_plugin,last_inWaitOfReply;
+ void sendState(bool force=false);
+ OptionDialog *optionDialog;
+ bool stopIt;
+signals:
+ void pluginLoaderReady(const Ultracopier::CatchState &state,bool havePlugin,bool someAreInWaitOfReply) const;
+ void previouslyPluginAdded(const PluginsAvailable &plugin) const;
+};
+
+#endif // PluginLoader_H
diff --git a/PluginsManager.cpp b/PluginsManager.cpp
new file mode 100644
index 0000000..269e837
--- /dev/null
+++ b/PluginsManager.cpp
@@ -0,0 +1,932 @@
+/** \file PluginsManager.cpp
+\brief Define the class to manage and load the plugins
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QDir>
+#include <QMessageBox>
+#include <QFileDialog>
+#include <QFile>
+#include <QFileInfo>
+
+#include <iterator>
+
+#include "PluginsManager.h"
+#include "cpp11addition.h"
+#include "FacilityEngine.h"
+
+/// \brief Create the manager and load the defaults variables
+PluginsManager::PluginsManager()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //load the overall instance
+ pluginLoaded = false;
+ language = "en";
+ stopIt = false;
+ pluginInformation = NULL;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ importingPlugin = false;
+ #endif
+ editionSemList.release();
+ englishPluginType.push_back("CopyEngine");englishPluginType.push_back("Languages");englishPluginType.push_back("Listener");englishPluginType.push_back("PluginLoader");englishPluginType.push_back("SessionLoader");englishPluginType.push_back("Themes");
+ //catPlugin << tr("CopyEngine") << tr("Languages") << tr("Listener") << tr("PluginLoader") << tr("SessionLoader") << tr("Themes");
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ connect(&decodeThread, &QXzDecodeThread::decodedIsFinish, this, &PluginsManager::decodingFinished,Qt::QueuedConnection);
+ #endif
+ connect(this, &PluginsManager::finished, this, &PluginsManager::post_operation,Qt::QueuedConnection);
+// connect(this, &PluginsManager::pluginListingIsfinish, options,&OptionEngine::setInterfaceValue);
+ //load the plugins list
+
+ /// \bug bug when I put here: moveToThread(this);, due to the direction connection to remove the plugin
+ start();
+}
+
+/// \brief Destroy the manager
+PluginsManager::~PluginsManager()
+{
+ stopIt=true;
+ if(pluginInformation!=NULL)
+ delete pluginInformation;
+ if(this->isRunning())
+ this->wait(0);
+}
+
+/// \brief set current language
+void PluginsManager::setLanguage(const std::string &language)
+{
+ this->language=language;
+}
+
+void PluginsManager::post_operation()
+{
+ pluginLoaded=true;
+ emit pluginListingIsfinish();
+}
+
+bool PluginsManager::allPluginHaveBeenLoaded() const
+{
+ return pluginLoaded;
+}
+
+void PluginsManager::lockPluginListEdition()
+{
+ editionSemList.acquire();
+}
+
+void PluginsManager::unlockPluginListEdition()
+{
+ editionSemList.release();
+}
+
+void PluginsManager::run()
+{
+ regexp_to_clean_1=std::regex("[\n\r]+");
+ regexp_to_clean_2=std::regex("[ \t]+");
+ regexp_to_clean_3=std::regex("(&&)+");
+ regexp_to_clean_4=std::regex("^&&");
+ regexp_to_clean_5=std::regex("&&$");
+ regexp_to_dep_1=std::regex("(&&|\\|\\||\\(|\\))");
+ regexp_to_dep_2=std::regex("^(<=|<|=|>|>=)[a-zA-Z0-9\\-]+-([0-9]+\\.)*[0-9]+$");
+ regexp_to_dep_3=std::regex("(<=|<|=|>|>=)");
+ regexp_to_dep_4=std::regex("-([0-9]+\\.)*[0-9]+");
+ regexp_to_dep_5=std::regex("[a-zA-Z0-9\\-]+-");
+ regexp_to_dep_6=std::regex("[a-zA-Z0-9\\-]+-([0-9]+\\.)*[0-9]+");
+
+ //load the path and plugins into the path
+ const std::string &separator=FacilityEngine::separator();
+ std::vector<std::string> readPath;
+ readPath=ResourcesManager::resourcesManager->getReadPath();
+ pluginsList.clear();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"pluginsList.size(): "+std::to_string(pluginsList.size()));
+ foreach(std::string basePath,readPath)
+ {
+ foreach(std::string dirSub,englishPluginType)
+ {
+ std::string pluginComposed=basePath+dirSub+separator;
+ QDir dir(QString::fromStdString(pluginComposed));
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"search plugin into: "+pluginComposed);
+ if(dir.exists())
+ {
+ foreach(QString dirName, dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
+ {
+ if(stopIt)
+ return;
+ loadPluginInformation(pluginComposed+dirName.toStdString()+separator);
+ }
+ }
+ }
+ }
+ #ifdef ULTRACOPIER_DEBUG
+ unsigned int index_debug=0;
+ while(index_debug<pluginsList.size())
+ {
+ std::string category=categoryToString(pluginsList.at(index_debug).category);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Plugin "+std::to_string(index_debug)+" loaded ("+category+"): "+pluginsList.at(index_debug).path);
+ index_debug++;
+ }
+ #endif
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ while(checkDependencies()!=0){};
+ #endif
+ //QList<PluginsAvailable> list;
+ unsigned int index=0;
+ while(index<pluginsList.size())
+ {
+ if(pluginsList.at(index).errorString.empty())
+ emit onePluginAdded(pluginsList.at(index));
+ index++;
+ }
+}
+
+std::string PluginsManager::categoryToString(const PluginType &category) const
+{
+ switch(category)
+ {
+ case PluginType_CopyEngine:
+ return "CopyEngine";
+ break;
+ case PluginType_Languages:
+ return "Languages";
+ break;
+ case PluginType_Listener:
+ return "Listener";
+ break;
+ case PluginType_PluginLoader:
+ return "PluginLoader";
+ break;
+ case PluginType_SessionLoader:
+ return "SessionLoader";
+ break;
+ case PluginType_Themes:
+ return "Themes";
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"cat text not found: "+std::to_string(category));
+ return "Unknown";
+ break;
+ }
+}
+
+std::string PluginsManager::categoryToTranslation(const PluginType &category)
+{
+ if(pluginInformation==NULL)
+ {
+ pluginInformation=new PluginInformation();
+ connect(this, &PluginsManager::newLanguageLoaded, pluginInformation, &PluginInformation::retranslateInformation,Qt::QueuedConnection);
+ }
+ return pluginInformation->categoryToTranslation(category);
+}
+
+bool PluginsManager::isSamePlugin(const PluginsAvailable &pluginA,const PluginsAvailable &pluginB)
+{
+ /*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)
+ return false;
+ if(pluginA.writablePath!=pluginB.writablePath)
+ return false;
+ if(pluginA.categorySpecific!=pluginB.categorySpecific)
+ return false;
+ if(pluginA.version!=pluginB.version)
+ return false;
+ if(pluginA.informations!=pluginB.informations)
+ return false;*/
+ return true;
+}
+
+bool PluginsManager::loadPluginInformation(const std::string &path)
+{
+ PluginsAvailable tempPlugin;
+ tempPlugin.isAuth = false;
+ tempPlugin.path = path;
+ tempPlugin.category = PluginType_Unknow;
+ QDir pluginPath(QString::fromStdString(path));
+ if(pluginPath.cdUp() && pluginPath.cdUp() &&
+ !ResourcesManager::resourcesManager->getWritablePath().empty() &&
+ pluginPath==QDir(QString::fromStdString(ResourcesManager::resourcesManager->getWritablePath())))
+ tempPlugin.isWritable=true;
+ else
+ tempPlugin.isWritable=false;
+ QFile xmlMetaData(QString::fromStdString(path)+"informations.xml");
+ if(xmlMetaData.exists())
+ {
+ if(xmlMetaData.open(QIODevice::ReadOnly))
+ {
+ loadPluginXml(&tempPlugin,xmlMetaData.readAll());
+ xmlMetaData.close();
+ }
+ else
+ {
+ tempPlugin.errorString=tr("informations.xml is not accessible").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"informations.xml is not accessible into the plugin: "+path);
+ }
+ }
+ else
+ {
+ tempPlugin.errorString=tr("informations.xml not found for the plugin").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"informations.xml not found for the plugin: "+path);
+ }
+ editionSemList.acquire();
+ pluginsList.push_back(tempPlugin);
+ if(tempPlugin.errorString.empty())
+ pluginsListIndexed[tempPlugin.category].push_back(tempPlugin);
+ editionSemList.release();
+ if(tempPlugin.errorString.empty())
+ return true;
+ else
+ {
+ emit onePluginInErrorAdded(tempPlugin);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error detected, the not loaded: "+tempPlugin.errorString+", for path: "+tempPlugin.path);
+ return false;
+ }
+}
+
+void PluginsManager::loadPluginXml(PluginsAvailable * thePlugin,const QByteArray &xml)
+{
+ QString errorStr;
+ int errorLine;
+ int errorColumn;
+ QDomDocument domDocument;
+ if (!domDocument.setContent(xml, false, &errorStr,&errorLine,&errorColumn))
+ {
+ thePlugin->errorString=tr("%1, parse error at line %2, column %3: %4").arg("informations.xml").arg(errorLine).arg(errorColumn).arg(errorStr).toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"informations.xml, Parse error at line "+std::to_string(errorLine)+", column "+std::to_string(errorColumn)+": "+errorStr.toStdString());
+ }
+ else
+ {
+ QDomElement root = domDocument.documentElement();
+ if (root.tagName() != QStringLiteral("package"))
+ {
+ thePlugin->errorString=tr("\"package\" root tag not found for the xml file").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"\"package\" root balise not found for the xml file");
+ }
+ //load the variable
+ if(thePlugin->errorString.empty())
+ loadBalise(root,"title",&(thePlugin->informations),&(thePlugin->errorString),true,true,true);
+ if(thePlugin->errorString.empty())
+ loadBalise(root,"website",&(thePlugin->informations),&(thePlugin->errorString),false,true);
+ if(thePlugin->errorString.empty())
+ loadBalise(root,"description",&(thePlugin->informations),&(thePlugin->errorString),true,true,true);
+ if(thePlugin->errorString.empty())
+ loadBalise(root,"author",&(thePlugin->informations),&(thePlugin->errorString),true,false);
+ if(thePlugin->errorString.empty())
+ loadBalise(root,"pubDate",&(thePlugin->informations),&(thePlugin->errorString),true,false);
+ if(thePlugin->errorString.empty())
+ {
+ loadBalise(root,"version",&(thePlugin->informations),&(thePlugin->errorString),true,false);
+ if(thePlugin->errorString.empty())
+ thePlugin->version=thePlugin->informations.back().back();
+ }
+ if(thePlugin->errorString.empty())
+ {
+ loadBalise(root,"category",&(thePlugin->informations),&(thePlugin->errorString),true,false);
+ if(thePlugin->errorString.empty())
+ {
+ std::string tempCat=thePlugin->informations.back().back();
+ if(tempCat=="Languages")
+ thePlugin->category=PluginType_Languages;
+ else if(tempCat=="CopyEngine")
+ thePlugin->category=PluginType_CopyEngine;
+ else if(tempCat=="Listener")
+ thePlugin->category=PluginType_Listener;
+ else if(tempCat=="PluginLoader")
+ thePlugin->category=PluginType_PluginLoader;
+ else if(tempCat=="SessionLoader")
+ thePlugin->category=PluginType_SessionLoader;
+ else if(tempCat=="Themes")
+ thePlugin->category=PluginType_Themes;
+ else
+ thePlugin->errorString="Unknow category: "+std::to_string((int)thePlugin->category);
+ if(thePlugin->errorString.empty())
+ {
+ if(thePlugin->category!=PluginType_Languages)
+ {
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ loadBalise(root,"architecture",&(thePlugin->informations),&(thePlugin->errorString),true,false);
+ if(thePlugin->errorString.empty())
+ {
+ if(thePlugin->informations.back().back()!=ULTRACOPIER_PLATFORM_CODE)
+ thePlugin->errorString="Wrong platform code: "+thePlugin->informations.back().back();
+ }
+ #endif
+ }
+ }
+ }
+ }
+ if(thePlugin->errorString.empty())
+ {
+ loadBalise(root,"name",&(thePlugin->informations),&(thePlugin->errorString),true,false);
+ if(thePlugin->errorString.empty())
+ {
+ thePlugin->name=thePlugin->informations.back().back();
+ size_t index=0;
+ while(index<pluginsList.size())
+ {
+ size_t sub_index=0;
+ while(sub_index<pluginsList.at(index).informations.size())
+ {
+ if(pluginsList.at(index).informations.at(sub_index).front()=="name" &&
+ pluginsList.at(index).name==thePlugin->name &&
+ pluginsList.at(index).category==thePlugin->category)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Plugin duplicate found ("+std::to_string((int)thePlugin->category)+"/"+pluginsList.at(index).informations.at(sub_index).back()+"), already loaded, actual version skipped: "+thePlugin->version);
+ thePlugin->errorString=tr("Duplicated plugin found, already loaded!").toStdString();
+ break;
+ break;
+ }
+ sub_index++;
+ }
+ index++;
+ }
+ }
+ }
+ if(thePlugin->errorString.empty())
+ loadBalise(root,"dependencies",&(thePlugin->informations),&(thePlugin->errorString),true,false);
+ if(thePlugin->errorString.empty())
+ {
+ QDomElement child = root.firstChildElement("categorySpecific");
+ if(!child.isNull() && child.isElement())
+ thePlugin->categorySpecific=child;
+ }
+ }
+}
+
+/// \brief to load the multi-language balise
+void PluginsManager::loadBalise(const QDomElement &root,const std::string &name,std::vector<std::vector<std::string> > *informations,std::string *errorString,bool needHaveOneEntryMinimum,bool multiLanguage,bool englishNeedBeFound)
+{
+ int foundElement=0;
+ bool englishTextIsFoundForThisChild=false;
+ QDomElement child = root.firstChildElement(QString::fromStdString(name));
+ while(!child.isNull())
+ {
+ if(child.isElement())
+ {
+ std::vector<std::string> newInformations;
+ if(multiLanguage)
+ {
+ if(child.hasAttribute(QStringLiteral("xml:lang")))
+ {
+ if(child.attribute(QStringLiteral("xml:lang"))==QStringLiteral("en"))
+ englishTextIsFoundForThisChild=true;
+ foundElement++;
+ newInformations.push_back(child.tagName().toStdString());
+ newInformations.push_back(child.attribute(QStringLiteral("xml:lang")).toStdString());
+ newInformations.push_back(child.text().toStdString());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Have not the attribute xml:lang: child.tagName(): "+child.tagName().toStdString()+", child.text(): "+child.text().toStdString());
+ }
+ else
+ {
+ foundElement++;
+ newInformations.push_back(child.tagName().toStdString());
+ newInformations.push_back(child.text().toStdString());
+ }
+ informations->push_back(newInformations);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Is not Element: child.tagName(): "+child.tagName().toStdString());
+ child = child.nextSiblingElement(QString::fromStdString(name));
+ }
+ if(multiLanguage && englishTextIsFoundForThisChild==false && englishNeedBeFound)
+ {
+ informations->clear();
+ *errorString=tr("English text missing in the informations.xml for the tag: %1").arg(QString::fromStdString(name)).toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"English text missing into the informations.xml for the tag: "+name);
+ return;
+ }
+ if(needHaveOneEntryMinimum && foundElement==0)
+ {
+ informations->clear();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Tag not found: "+name);
+ *errorString=tr("Tag not found: %1").arg(QString::fromStdString(name)).toStdString();
+ }
+}
+
+/// \brief to load the get dom specific
+std::string PluginsManager::getDomSpecific(const QDomElement &root,const std::string &name,const std::vector<std::pair<std::string,std::string> > &listChildAttribute) const
+{
+ QDomElement child = root.firstChildElement(QString::fromStdString(name));
+ bool allIsFound;
+ while(!child.isNull())
+ {
+ if(child.isElement())
+ {
+ allIsFound=true;
+ size_t index=0;
+ while(index<listChildAttribute.size())
+ {
+ const std::pair<std::string,std::string> &entry=listChildAttribute.at(index);
+ if(child.attribute(QString::fromStdString(entry.first))!=QString::fromStdString(entry.second))
+ {
+ allIsFound=false;
+ break;
+ }
+ index++;
+ }
+ if(allIsFound)
+ return child.text().toStdString();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Is not Element: child.tagName(): "+child.tagName().toStdString());
+ child = child.nextSiblingElement(QString::fromStdString(name));
+ }
+ return std::string();
+}
+
+/// \brief to load the get dom specific
+std::string PluginsManager::getDomSpecific(const QDomElement &root,const std::string &name) const
+{
+ QDomElement child = root.firstChildElement(QString::fromStdString(name));
+ while(!child.isNull())
+ {
+ if(child.isElement())
+ return child.text().toStdString();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Is not Element: child.tagName(): "+child.tagName().toStdString());
+ child = child.nextSiblingElement(QString::fromStdString(name));
+ }
+ return std::string();
+}
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+/// \brief check the dependencies
+uint32_t PluginsManager::checkDependencies()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ uint32_t errors=0;
+ unsigned int index=0;
+ bool depCheck;
+ while(index<pluginsList.size())
+ {
+ unsigned int sub_index=0;
+ while(sub_index<pluginsList.at(index).informations.size())
+ {
+ if(pluginsList.at(index).informations.at(sub_index).size()==2 && pluginsList.at(index).informations.at(sub_index).at(0)=="dependencies")
+ {
+ std::string dependencies = pluginsList.at(index).informations.at(sub_index).at(1);
+ dependencies=std::regex_replace(dependencies, regexp_to_clean_1,"&&");
+ dependencies=std::regex_replace(dependencies, regexp_to_clean_2,"");
+ dependencies=std::regex_replace(dependencies, regexp_to_clean_3,"&&");
+ dependencies=std::regex_replace(dependencies, regexp_to_clean_4,"");
+ dependencies=std::regex_replace(dependencies, regexp_to_clean_5,"");
+ std::sregex_token_iterator iter(dependencies.begin(), dependencies.end(), regexp_to_dep_1, -1), end;
+ for ( ; iter != end; ++iter)
+ {
+ std::string dependenciesToParse=trim(*iter);
+ if(dependenciesToParse.empty()) {
+ continue;
+ }
+ if(!std::regex_match(dependenciesToParse, regexp_to_dep_2))
+ {
+ pluginsList[index].informations.clear();
+ pluginsList[index].errorString=tr("Dependencies part is wrong").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Dependencies part is wrong: "+dependenciesToParse);
+ emit onePluginInErrorAdded(pluginsList.at(index));
+ errors++;
+ break;
+ }
+ std::string partName=dependenciesToParse;
+ partName=std::regex_replace(partName, regexp_to_dep_3, "");
+ partName=std::regex_replace(partName, regexp_to_dep_4, "");
+ std::string partVersion=dependenciesToParse;
+ partVersion=std::regex_replace(partVersion, regexp_to_dep_3, "");
+ partVersion=std::regex_replace(partVersion, regexp_to_dep_5, "");
+ std::string partComp=dependenciesToParse;
+ partComp=std::regex_replace(partComp, regexp_to_dep_6, "");
+ //current version soft
+ std::string pluginVersion=getPluginVersion(partName);
+ depCheck=compareVersion(pluginVersion,partComp,partVersion);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"dependencies to resolv, partName: "+partName+", partVersion: "+partVersion+", partComp: "+partComp+", pluginVersion: "+pluginVersion+", depCheck: "+std::to_string(depCheck));
+ if(!depCheck)
+ {
+ pluginsList[index].informations.clear();
+ pluginsList[index].errorString=tr("Dependencies %1 are not satisfied, for plugin: %2").arg(QString::fromStdString(dependenciesToParse)).arg(QString::fromStdString(pluginsList[index].path)).toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Dependencies "+dependenciesToParse+" are not satisfied, for plugin: "+pluginsList[index].path);
+ pluginsListIndexed.erase(pluginsListIndexed.find(pluginsList.at(index).category));
+ emit onePluginInErrorAdded(pluginsList.at(index));
+ errors++;
+ break;
+ }
+ }
+ }
+ sub_index++;
+ }
+ index++;
+ }
+ return errors;
+}
+#endif
+
+/// \brief get the version
+std::string PluginsManager::getPluginVersion(const std::string &pluginName) const
+{
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ if(pluginName=="supercopier")
+ return ULTRACOPIER_VERSION;
+ #else
+ if(pluginName=="ultracopier")
+ return ULTRACOPIER_VERSION;
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginsList.size())
+ {
+ std::string version,internalName;
+ unsigned int sub_index=0;
+ while(sub_index<pluginsList.at(index).informations.size())
+ {
+ if(pluginsList.at(index).informations.at(sub_index).size()==2 && pluginsList.at(index).informations.at(sub_index).at(0)=="version")
+ version=pluginsList.at(index).informations.at(sub_index).at(1);
+ if(pluginsList.at(index).informations.at(sub_index).size()==2 && pluginsList.at(index).informations.at(sub_index).at(0)=="internalName")
+ internalName=pluginsList.at(index).informations.at(sub_index).at(1);
+ sub_index++;
+ }
+ if(internalName==pluginName)
+ return version;
+ index++;
+ }
+ return "";
+}
+
+/// \brief To compare version, \return true is case of error
+bool PluginsManager::compareVersion(const std::string &versionA,const std::string &sign,const std::string &versionB)
+{
+ std::vector<std::string> versionANumber=stringsplit(versionA,'.');
+ std::vector<std::string> versionBNumber=stringsplit(versionB,'.');
+ unsigned int index=0;
+ unsigned int defaultReturnValue=true;
+ if(sign=="<")
+ defaultReturnValue=false;
+ if(sign==">")
+ defaultReturnValue=false;
+ bool ok;
+ while(index<versionANumber.size() && index<versionBNumber.size())
+ {
+ unsigned int reaNumberA=stringtouint8(versionANumber.at(index),&ok);
+ if(!ok)
+ return true;
+ unsigned int reaNumberB=stringtouint8(versionBNumber.at(index),&ok);
+ if(!ok)
+ return true;
+ if(sign=="=" && reaNumberA!=reaNumberB)
+ return false;
+ if(sign=="<")
+ {
+ if(reaNumberA>reaNumberB)
+ return false;
+ if(reaNumberA<reaNumberB)
+ return true;
+ }
+ if(sign==">")
+ {
+ if(reaNumberA<reaNumberB)
+ return false;
+ if(reaNumberA>reaNumberB)
+ return true;
+ }
+ if(sign=="<=")
+ {
+ if(reaNumberA>reaNumberB)
+ return false;
+ if(reaNumberA<reaNumberB)
+ return true;
+ }
+ if(sign==">=")
+ {
+ if(reaNumberA<reaNumberB)
+ return false;
+ if(reaNumberA>reaNumberB)
+ return true;
+ }
+ index++;
+ }
+ return defaultReturnValue;
+}
+
+std::vector<PluginsAvailable> PluginsManager::getPluginsByCategory(const PluginType &category) const
+{
+ if(pluginsListIndexed.find(category)==pluginsListIndexed.cend())
+ return std::vector<PluginsAvailable>();
+ return pluginsListIndexed.at(category);
+}
+
+std::vector<PluginsAvailable> PluginsManager::getPlugins(bool withError) const
+{
+ std::vector<PluginsAvailable> list;
+ unsigned int index=0;
+ while(index<pluginsList.size())
+ {
+ if(withError || pluginsList.at(index).errorString.empty())
+ list.push_back(pluginsList.at(index));
+ index++;
+ }
+ return list;
+}
+
+/// \brief show the information
+void PluginsManager::showInformation(const std::string &path)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginsList.size())
+ {
+ if(pluginsList.at(index).path==path)
+ {
+ if(pluginInformation==NULL)
+ {
+ pluginInformation=new PluginInformation();
+ connect(this, &PluginsManager::newLanguageLoaded, pluginInformation, &PluginInformation::retranslateInformation,Qt::QueuedConnection);
+ }
+ pluginInformation->setLanguage(mainShortName);
+ pluginInformation->setPlugin(pluginsList.at(index));
+ pluginInformation->show();
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"item not selected");
+}
+
+void PluginsManager::showInformationDoubleClick()
+{
+// showInformation(false);
+}
+
+#ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+void PluginsManager::removeThePluginSelected(const std::string &path)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginsList.size())
+ {
+ if(pluginsList.at(index).path==path)
+ {
+ QMessageBox::StandardButton reply;
+ // if(pluginsList.at(index).internalVersionAlternative.isEmpty())
+ reply = QMessageBox::question(NULL,tr("Remove %1").arg(QString::fromStdString(pluginsList.at(index).name)),tr("Are you sure about removing \"%1\" in version %2?").arg(QString::fromStdString(pluginsList.at(index).name)).arg(QString::fromStdString(pluginsList.at(index).version)),QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
+ // else
+ // reply = QMessageBox::question(NULL,tr("Remove %1").arg(getTranslatedText(pluginsList.at(index),"name",mainShortName)),tr("Are you sure to wish remove \"%1\" in version %2 for the internal version %3?").arg(getTranslatedText(pluginsList.at(index),"name",mainShortName)).arg(pluginsList.at(index).version).arg(pluginsList.at(index).internalVersionAlternative),QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
+ if(reply==QMessageBox::Yes)
+ {
+ emit onePluginWillBeUnloaded(pluginsList.at(index));
+ emit onePluginWillBeRemoved(pluginsList.at(index));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"remove plugin at this path: "+pluginsList.at(index).path);
+ if(!ResourcesManager::removeFolder(pluginsList.at(index).path))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove the plugin");
+ QMessageBox::critical(NULL,tr("Error"),tr("Error while the removing plugin, please check the rights on the folder: \n%1").arg(QString::fromStdString(pluginsList.at(index).path)));
+ }
+ pluginsListIndexed.erase(pluginsListIndexed.find(pluginsList.at(index).category));
+ pluginsList.erase(pluginsList.begin()+index);
+ while(checkDependencies()!=0){};
+ }
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"item not selected");
+}
+
+void PluginsManager::addPlugin(const ImportBackend &backend)
+{
+ if(backend==ImportBackend_File)
+ executeTheFileBackendLoader();
+}
+
+void PluginsManager::executeTheFileBackendLoader()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(importingPlugin)
+ {
+ QMessageBox::information(NULL,tr("Information"),tr("Previous import is in progress..."));
+ return;
+ }
+ std::string fileName = QFileDialog::getOpenFileName(NULL,tr("Open Ultracopier plugin"),QString(),tr("Ultracopier plugin (*.urc)")).toStdString();
+ if(fileName!="")
+ tryLoadPlugin(fileName);
+}
+
+void PluginsManager::tryLoadPlugin(const std::string &file)
+{
+ QFile temp(QString::fromStdString(file));
+ if(temp.open(QIODevice::ReadOnly))
+ {
+ importingPlugin=true;
+ lunchDecodeThread(temp.readAll());
+ temp.close();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"unable to open the file: "+temp.errorString().toStdString());
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to open the plugin: %1").arg(temp.errorString()));
+ }
+}
+
+void PluginsManager::lunchDecodeThread(const QByteArray &data)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ decodeThread.setData(data);
+ decodeThread.start(QThread::LowestPriority);
+}
+
+void PluginsManager::decodingFinished()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(!decodeThread.errorFound())
+ {
+ QByteArray data=decodeThread.decodedData();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"data.size(): "+std::to_string(data.size()));
+ QTarDecode tarFile;
+ std::vector<char> cppdata;
+ cppdata.resize(data.size());
+ memcpy(cppdata.data(),data.data(),data.size());
+ if(!tarFile.decodeData(cppdata))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"tarFile.errorString(): "+tarFile.errorString());
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to load the plugin content, please check it: %1").arg(QString::fromStdString(tarFile.errorString())));
+ }
+ else
+ {
+ std::vector<std::string> fileList = tarFile.getFileList();
+ std::vector<std::vector<char> > dataList = tarFile.getDataList();
+ if(fileList.size()>1)
+ {
+ std::string basePluginArchive="";
+ /* block use less for tar?
+ if(fileList.at(0).contains(QRegularExpression("[\\/]")))
+ {
+ bool folderFoundEveryWhere=true;
+ basePluginArchive=fileList.at(0);
+ basePluginArchive=std::regex_replace(basePluginArchive, std::regex("[\\/].*$"), "");
+ for (int i = 0; i < list.size(); ++i)
+ {
+ if(!stringStartWith(fileList.at(i),basePluginArchive))
+ {
+ folderFoundEveryWhere=false;
+ break;
+ }
+ }
+ if(folderFoundEveryWhere)
+ {
+ for (int i = 0; i < fileList.size(); ++i)
+ fileList[i].substr(basePluginArchive.size());
+ }
+ else
+ basePluginArchive="";
+ }*/
+ PluginsAvailable tempPlugin;
+ std::string categoryFinal="";
+ for (unsigned int i = 0; i < fileList.size(); ++i)
+ if(fileList.at(i)=="informations.xml")
+ {
+ loadPluginXml(&tempPlugin,QByteArray(dataList.at(i).data(),static_cast<int>(dataList.at(i).size())));
+ break;
+ }
+ if(tempPlugin.errorString=="")
+ {
+ categoryFinal=categoryToString(tempPlugin.category);
+ if(categoryFinal!="")
+ {
+ std::string writablePath=ResourcesManager::resourcesManager->getWritablePath();
+ if(writablePath!="")
+ {
+ QDir dir;
+ std::string finalPluginPath=writablePath+categoryFinal+FacilityEngine::separator()+tempPlugin.name+FacilityEngine::separator();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"writablePath: \""+writablePath+"\"");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"basePluginArchive: \""+basePluginArchive+"\"");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"categoryFinal: \""+categoryFinal+"\"");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"finalPluginPath: \""+finalPluginPath+"\"");
+ if(!dir.exists(QString::fromStdString(finalPluginPath)))
+ {
+ bool errorFound=false;
+ for (unsigned int i = 0; i < fileList.size(); ++i)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"file "+std::to_string(i)+": "+finalPluginPath+fileList.at(i));
+ std::string fileListEntry=fileList[i];
+ fileListEntry=std::regex_replace(fileListEntry, std::regex("^(..?[\\/])+"), "");
+ QFile currentFile(QString::fromStdString(finalPluginPath+fileListEntry));
+ QFileInfo info(currentFile);
+ if(!dir.exists(info.absolutePath()))
+ if(!dir.mkpath(info.absolutePath()))
+ {
+ ResourcesManager::resourcesManager->disableWritablePath();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Unable to make the path: "+info.absolutePath().toStdString());
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to create a folder to install the plugin:\n%1").arg(info.absolutePath()));
+ errorFound=true;
+ break;
+ }
+ if(currentFile.open(QIODevice::ReadWrite))
+ {
+ currentFile.write(QByteArray(dataList.at(i).data(),static_cast<int>(dataList.at(i).size())));
+ currentFile.close();
+ }
+ else
+ {
+ ResourcesManager::resourcesManager->disableWritablePath();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Unable to make the file: "+info.absolutePath().toStdString()+", error:"+currentFile.errorString().toStdString());
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to create a file to install the plugin:\n%1\nsince:%2").arg(info.absolutePath()).arg(currentFile.errorString()));
+ errorFound=true;
+ break;
+ }
+ }
+ if(!errorFound)
+ {
+ if(loadPluginInformation(finalPluginPath))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"push the new plugin into the real list");
+ while(checkDependencies()!=0){};
+ emit needLangToRefreshPluginList();
+ emit manuallyAdded(tempPlugin);
+ }
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Folder with same name is present, skip the plugin installation: "+finalPluginPath);
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Folder with same name is present, skip the plugin installation:\n%1").arg(QString::fromStdString(finalPluginPath)));
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Have not writable path, then how add you plugin?");
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to load the plugin content, please check it"));
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"category into informations.xml not found!");
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to load the plugin content, please check it"));
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error in the xml: "+tempPlugin.errorString);
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to load the plugin content, please check it: %1").arg(QString::fromStdString(tempPlugin.errorString)));
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"No file found into the plugin");
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to load the plugin content, please check it"));
+ }
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"decodeThread.errorFound(), error: "+decodeThread.errorString().toStdString());
+ QMessageBox::critical(NULL,tr("Plugin loader"),tr("Unable to load the plugin content, please check it: %1").arg(decodeThread.errorString()));
+ }
+ importingPlugin=false;
+}
+#endif
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+void PluginsManager::newAuthPath(const std::string &path)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginsList.size())
+ {
+ if(pluginsList.at(index).path==path)
+ {
+ pluginsList[index].isAuth=true;
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"plugin not located");
+}
+#endif
+
+/// \brief transfor short plugin name into file name
+std::string PluginsManager::getResolvedPluginName(const std::string &name)
+{
+ #if defined(Q_OS_LINUX) || defined(Q_OS_HURD)
+ return "lib"+name+".so";
+ #elif defined(Q_OS_MAC)
+ #if defined(QT_DEBUG)
+ return "lib"+name+"_debug.dylib";
+ #else
+ return "lib"+name+".dylib";
+ #endif
+ #elif defined(Q_OS_WIN32)
+ #if defined(QT_DEBUG)
+ return name+"d.dll";
+ #else
+ return name+".dll";
+ #endif
+ #else
+ #error "Platform not supported"
+ #endif
+}
+
+bool operator==(PluginsAvailable pluginA,PluginsAvailable pluginB)
+{
+ return PluginsManager::isSamePlugin(pluginA,pluginB);
+}
diff --git a/PluginsManager.h b/PluginsManager.h
new file mode 100644
index 0000000..4e24839
--- /dev/null
+++ b/PluginsManager.h
@@ -0,0 +1,157 @@
+/** \file PluginsManager.h
+\brief Define the class to manage and load the plugins
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGINS_MANAGER_H
+#define PLUGINS_MANAGER_H
+
+#include <QObject>
+#include <QList>
+#include <QStringList>
+#include <QDomElement>
+#include <QDomDocument>
+#include <QDomNode>
+#include <QTreeWidgetItem>
+#include <QDateTime>
+#include <QAction>
+#include <QMenu>
+#include <QCryptographicHash>
+#include <QString>
+#include <QSemaphore>
+#include <QRegularExpression>
+#include <QThread>
+#include <map>
+#include <regex>
+
+#include "Environment.h"
+#include "OptionEngine.h"
+#include "ResourcesManager.h"
+#include "PluginInformation.h"
+#ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+#include "QXzDecodeThread.h"
+#include "QTarDecode.h"
+#endif
+
+namespace Ui {
+ class PluginOptions;
+}
+
+/** \brief Define the class to manage and load the resources linked with the themes
+
+This class provide a core load and manage the resources */
+class PluginsManager : public QThread
+{
+ Q_OBJECT
+ public:
+ /// \brief to get plugins of type specific
+ std::vector<PluginsAvailable> getPluginsByCategory(const PluginType &type) const;
+ /** \brief to get plugins */
+ std::vector<PluginsAvailable> getPlugins(bool withError=false) const;
+ /// \brief get translated text
+ //QString getTranslatedText(PluginsAvailable plugin,QString informationName,QString mainShortName);
+ //QString getTranslatedText(PluginsAvailable plugin,QString informationName);
+ /// \brief transform short plugin name into file name
+ static std::string getResolvedPluginName(const std::string &name);
+ static bool isSamePlugin(const PluginsAvailable &pluginA,const PluginsAvailable &pluginB);
+ void lockPluginListEdition();
+ void unlockPluginListEdition();
+ bool allPluginHaveBeenLoaded() const;
+ /// \brief to load the get dom specific
+ std::string getDomSpecific(const QDomElement &root,const std::string &name,const std::vector<std::pair<std::string,std::string> > &listChildAttribute) const;
+ std::string getDomSpecific(const QDomElement &root,const std::string &name) const;
+ /// \brief set current language
+ void setLanguage(const std::string &language);
+ /// \brief Enumeration of plugin add backend
+ enum ImportBackend
+ {
+ ImportBackend_File, //import plugin from local file
+ ImportBackend_Internet //import plugin form internet
+ };
+ static PluginsManager *pluginsManager;
+ /// \brief Create the manager and load the defaults variables
+ PluginsManager();
+ /// \brief Destroy the language manager
+ ~PluginsManager();
+ /// \brief To compare version, \return true is case of error
+ static bool compareVersion(const std::string &versionA,const std::string &sign,const std::string &versionB);
+ private:
+ /// \brief List of plugins
+ std::vector<PluginsAvailable> pluginsList;
+ std::map<PluginType,std::vector<PluginsAvailable> > pluginsListIndexed;
+ /// \brief to load the multi-language balise
+ void loadBalise(const QDomElement &root,const std::string &name,std::vector<std::vector<std::string> > *informations,std::string *errorString,bool needHaveOneEntryMinimum=true,bool multiLanguage=false,bool englishNeedBeFound=false);
+ /// \brief get the version
+ std::string getPluginVersion(const std::string &pluginName) const;
+ /// \brief list of cat plugin type
+ //QStringList catPlugin;
+ std::vector<std::string> englishPluginType;
+ std::vector<QTreeWidgetItem *> catItemList;
+ /// \brief store the current mainShortName
+ std::string mainShortName;
+ /// \brief load the plugin list
+ void loadPluginList();
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ QAction *backendMenuFile; ///< Pointer on the file backend menu
+ bool importingPlugin;
+ void lunchDecodeThread(const QByteArray &data);
+ QXzDecodeThread decodeThread;
+ void executeTheFileBackendLoader();
+ #endif
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ /// \brief check the dependencies, return number of error
+ uint32_t checkDependencies();
+ #endif
+ void loadPluginXml(PluginsAvailable * thePlugin,const QByteArray &xml);
+ std::vector<std::string> readPluginPath;
+ bool loadPluginInformation(const std::string &path);
+ QSemaphore editionSemList;
+ bool stopIt;
+ bool pluginLoaded;
+ std::string language;
+ std::string categoryToString(const PluginType &category) const;
+ std::string categoryToTranslation(const PluginType &category);
+ std::regex regexp_to_clean_1,regexp_to_clean_2,regexp_to_clean_3,regexp_to_clean_4,regexp_to_clean_5;
+ std::regex regexp_to_dep_1,regexp_to_dep_2,regexp_to_dep_3,regexp_to_dep_4,regexp_to_dep_5,regexp_to_dep_6;
+ PluginInformation *pluginInformation;
+ private slots:
+ /// \brief show the information
+ void showInformationDoubleClick();
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ void decodingFinished();
+ #endif
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void newAuthPath(const std::string &path);
+ #endif
+ void post_operation();
+/* public slots:
+ /// \brief to refresh the plugin list
+ void refreshPluginList(QString mainShortName="en");*/
+ signals:
+ void pluginListingIsfinish() const;
+ void onePluginAdded(const PluginsAvailable&) const;
+ void onePluginInErrorAdded(const PluginsAvailable&) const;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void onePluginWillBeRemoved(const PluginsAvailable&) const; // when will be really removed
+ void onePluginWillBeUnloaded(const PluginsAvailable&) const;//just unload to quit the application
+ #endif
+ void needLangToRefreshPluginList() const;
+ void newLanguageLoaded() const;
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ void manuallyAdded(const PluginsAvailable&) const;
+ #endif
+ protected:
+ void run();
+ public slots: //do gui action
+ void showInformation(const std::string &path);
+ #ifdef ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+ void removeThePluginSelected(const std::string &path);
+ void addPlugin(const ImportBackend &backend);
+ void tryLoadPlugin(const std::string &file);
+ #endif
+};
+
+/// \brief to do structure comparaison
+bool operator==(PluginsAvailable pluginA,PluginsAvailable pluginB);
+
+#endif // PLUGINS_MANAGER_H
diff --git a/README b/README
new file mode 100644
index 0000000..5b617ab
--- /dev/null
+++ b/README
@@ -0,0 +1,46 @@
+=======================================================
+Description ===========================================
+=======================================================
+
+Ultracopier (https://ultracopier.first-world.info/) is free and open
+source software licensed under GPLv3 that acts as a replacement for
+files copy dialogs.
+
+Main features include:
+ - pause/resume transfers
+ - dynamic speed limitation
+ - on-error resume,
+ - error/collision management
+
+=======================================================
+Changelog =============================================
+=======================================================
+You can have the changelog at this url (or search on the forum):
+https://forum-ultracopier.first-world.info/the-announces/changelog-for-ultracopier-1-0-x-x-supercopier-4-0-x-x-t406.html
+
+=======================================================
+License ===============================================
+=======================================================
+Ultracopier is licensed under the GNU General Public License version 3.
+The text of the GNU General Public License can be viewed at https://www.gnu.org/licenses/gpl.html
+See COPYING file.
+
+=======================================================
+Core Developers =======================================
+=======================================================
+BRULE Herman or alpha_one_x86 <ultracopier@first-world.info>
+- Original author, API, kio_slaves, source
+See the Development team section of https://ultracopier.first-world.info/contact.html for an updated list of Ultracopier team!
+
+=======================================================
+Building and documentation ============================
+=======================================================
+See the wiki for the general documentation and how to for building: https://ultracopier-wiki.first-world.info/
+For the code documentation: https://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.
+Prefer ultracopier.pro to have easy and NO modular software. This is more oriented to GNU/Linux and macOS.
+
+======================================================
+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.
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
new file mode 100644
index 0000000..32106a8
--- /dev/null
+++ b/ResourcesManager.cpp
@@ -0,0 +1,216 @@
+/** \file ResourcesManager.cpp
+\brief Define the class to manage and load the resources linked with the themes
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QDir>
+#include <QFile>
+#include <QApplication>
+#include <QFileInfo>
+
+#include "cpp11addition.h"
+#include "ResourcesManager.h"
+#include "FacilityEngine.h"
+
+std::regex ResourcesManager::slashEnd;
+
+/// \brief Create the manager and load the defaults variables
+ResourcesManager::ResourcesManager()
+{
+ slashEnd=std::regex("[/\\\\]$");
+
+ //load the internal path
+ searchPath.push_back(":/");
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ //load the user path but only if exists and writable
+ //load the ultracopier path
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ #ifdef ULTRACOPIER_VERSION_PORTABLEAPPS
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Ultracopier is compiled with the flag: ULTRACOPIER_VERSION_PORTABLEAPPS");
+ //load the data folder path
+ QDir dir(QApplication::applicationDirPath());
+ dir.cdUp();
+ dir.cdUp();
+ dir.cd(QStringLiteral("Data");
+ searchPath.push_back(ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString()));
+ writablePath=ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString());
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Ultracopier is compiled with the flag: ULTRACOPIER_VERSION_PORTABLE");
+ //load the ultracopier path
+ QDir dir(QApplication::applicationDirPath());
+ dir.cd(QStringLiteral("Data"));
+ searchPath.push_back(ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString()));
+ writablePath=ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString());
+ #endif
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Ultracopier is compiled as user privacy mode");
+ #ifdef Q_OS_WIN32
+ #define EXTRA_HOME_PATH QStringLiteral("\\ultracopier\\")
+ #else
+ #define EXTRA_HOME_PATH QStringLiteral("/.config/Ultracopier/")
+ #endif
+ #ifdef Q_OS_LINUX
+ QDir linuxArchIndepDir(QStringLiteral("/usr/share/ultracopier/"));
+ if(linuxArchIndepDir.exists())
+ searchPath.push_back(ResourcesManager::AddSlashIfNeeded(linuxArchIndepDir.absolutePath().toStdString()));
+ QDir linuxPluginsDir(QStringLiteral("/usr/lib/ultracopier/"));
+ if(linuxPluginsDir.exists())
+ searchPath.push_back(ResourcesManager::AddSlashIfNeeded(linuxPluginsDir.absolutePath().toStdString()));
+ #endif
+ //load the user path but only if exists and writable
+ QDir dir(QDir::homePath()+EXTRA_HOME_PATH);
+ if(dir.exists())
+ {
+ writablePath=ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString());
+ searchPath.push_back(ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString()));
+ } //if not exists try to create it
+ else if(dir.mkpath(dir.absolutePath()))
+ {
+ //if created, then have write permissions
+ writablePath=ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString());
+ searchPath.push_back(ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString()));
+ }
+ //load the ultracopier path
+ searchPath.push_back(ResourcesManager::AddSlashIfNeeded(QApplication::applicationDirPath().toStdString()));
+ #endif
+ #else
+ QDir dir(QApplication::applicationDirPath());
+ writablePath=ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString());
+ #endif
+ vectorRemoveDuplicatesForSmallList(searchPath);
+ #ifdef ULTRACOPIER_DEBUG
+ unsigned int index=0;
+ while(index<searchPath.size()) //look at each val
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"searchPath.at("+std::to_string(index)+"): "+searchPath.at(index));
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"writablePath: "+writablePath);
+ #endif // ULTRACOPIER_DEBUG
+}
+
+/// \brief Destroy the resource manager
+ResourcesManager::~ResourcesManager()
+{
+}
+
+/// \brief Get folder presence and the path
+std::string ResourcesManager::getFolderReadPath(const std::string &path) const
+{
+ unsigned int index=0;
+ while(index<searchPath.size()) //look at each val
+ {
+ QDir dir(QString::fromStdString(searchPath.at(index)+path));
+ if(dir.exists()) // if the path have been found, then return the full path
+ return ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString());
+ index++;
+ }
+ return std::string();
+}
+
+/// \brief Get folder presence, the path and check in the folder and sub-folder the file presence
+std::string ResourcesManager::getFolderReadPathMultiple(const std::string &path,const std::vector<std::string> &fileToCheck) const
+{
+ unsigned int index=0;
+ while(index<searchPath.size()) //look at each val
+ {
+ QDir dir(QString::fromStdString(searchPath.at(index)+path));
+ if(checkFolderContent(dir.absolutePath().toStdString(),fileToCheck))
+ return dir.absolutePath().toStdString()+FacilityEngine::separator();
+ index++;
+ }
+ return std::string();
+}
+
+bool ResourcesManager::checkFolderContent(const std::string &path,const std::vector<std::string> &fileToCheck) const
+{
+ QDir dir(QString::fromStdString(path));
+ if(dir.exists()) // if the path have been found, then return the full path
+ {
+ bool allFileToCheckIsFound=true;
+ unsigned int index=0;
+ std::string partialPath=ResourcesManager::AddSlashIfNeeded(dir.absolutePath().toStdString());
+ while(index<fileToCheck.size()) //look at each val
+ {
+ if(!QFile::exists(QString::fromStdString(partialPath+fileToCheck.at(index)))) //if a file have been not found, consider the folder as not suitable
+ {
+ allFileToCheckIsFound=false;
+ break;
+ }
+ index++;
+ }
+ if(allFileToCheckIsFound==true) // if all file into have been found then return this path
+ return true;
+ }
+ return false;
+}
+
+/// \brief add / or \ in function of the platform at the end of path if both / and \ are not found
+std::string ResourcesManager::AddSlashIfNeeded(const std::string &path)
+{
+ if(path.empty())
+ return "/";
+ if(path.at(path.size()-1)=='/')
+ return path;
+ else
+ return path+FacilityEngine::separator();
+}
+
+/// \brief get the writable path
+const std::string &ResourcesManager::getWritablePath() const
+{
+ return writablePath;
+}
+
+/// \brief disable the writable path, if ultracopier is unable to write into
+bool ResourcesManager::disableWritablePath()
+{
+ bool returnVal=true;
+ if(writablePath.empty())
+ returnVal=false;
+ else
+ writablePath.clear();
+ return returnVal;
+}
+
+/// \brief get the read path
+const std::vector<std::string> &ResourcesManager::getReadPath() const
+{
+ return searchPath;
+}
+
+/// \brief remove folder
+bool ResourcesManager::removeFolder(const std::string &dir)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"folder to remove: "+dir);
+ bool errorFound=false;
+ QDir currentDir(QString::fromStdString(dir));
+ QFileInfoList files = currentDir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);
+ int index=0;
+ const int &loop_size=files.size();
+ while(index<loop_size)
+ {
+ if(files.at(index).isFile())
+ {
+ QFile file(files.at(index).absoluteFilePath());
+ if(!file.remove())
+ {
+ errorFound=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"remove file failed: "+file.errorString().toStdString());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file removed: "+file.fileName().toStdString());
+ }
+ else if(files.at(index).isDir())
+ removeFolder(files.at(index).absoluteFilePath().toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unknow file type for: "+files.at(index).absoluteFilePath().toStdString());
+ index++;
+ }
+ if(!currentDir.rmpath(QString::fromStdString(dir)))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"remove path failed, check right and if is empty: "+dir);
+ errorFound=true;
+ }
+ return !errorFound;
+}
diff --git a/ResourcesManager.h b/ResourcesManager.h
new file mode 100644
index 0000000..fec25da
--- /dev/null
+++ b/ResourcesManager.h
@@ -0,0 +1,54 @@
+/** \file ResourcesManager.h
+\brief Define the class to manage and load the resources linked with the themes
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef RESOURCES_MANAGER_H
+#define RESOURCES_MANAGER_H
+
+#include <QStringList>
+#include <QString>
+#include <QObject>
+#include <regex>
+
+#include "Environment.h"
+
+/** \brief Define the class to manage and load the resources linked with the themes
+
+This class provide a core load and manage the resources */
+class ResourcesManager : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief Create the manager and load the default variable
+ ResourcesManager();
+ /// \brief Destroy the resource manager
+ ~ResourcesManager();
+ static ResourcesManager *resourcesManager;
+ /** \brief Get folder presence and the path
+ \return Empty QString if not found */
+ std::string getFolderReadPath(const std::string &path) const;
+ /** \brief Get folder presence, the path and check in the folder and sub-folder the file presence
+ \return Empty QString if not found */
+ std::string getFolderReadPathMultiple(const std::string &path,const std::vector<std::string> &fileToCheck) const;
+ bool checkFolderContent(const std::string &path,const std::vector<std::string> &fileToCheck) const;
+ /// \brief add / or \ in function of the platform at the end of path if both / and \ are not found
+ static std::string AddSlashIfNeeded(const std::string &path);
+ /// \brief get the writable path
+ const std::string &getWritablePath() const;
+ /// \brief disable the writable path, if ultracopier is unable to write into
+ bool disableWritablePath();
+ /// \brief get the read path
+ const std::vector<std::string> &getReadPath() const;
+ /// \brief remove folder
+ static bool removeFolder(const std::string &dir);
+ private:
+ /// \brief List of the path to read only access
+ std::vector<std::string> searchPath;
+ /// \brief The writable path, empty if not found
+ std::string writablePath;
+ /// \brief match with slash end
+ static std::regex slashEnd;
+};
+
+#endif // RESOURCES_MANAGER_H
diff --git a/SessionLoader.cpp b/SessionLoader.cpp
new file mode 100644
index 0000000..1266e2f
--- /dev/null
+++ b/SessionLoader.cpp
@@ -0,0 +1,171 @@
+/** \file SessionLoader.h
+\brief Define the session loader
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "SessionLoader.h"
+#include "LanguagesManager.h"
+#include "cpp11addition.h"
+
+#ifndef ULTRACOPIER_VERSION_PORTABLE
+SessionLoader::SessionLoader(OptionDialog *optionDialog)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->optionDialog=optionDialog;
+ //load the options
+ connect(OptionEngine::optionEngine,&OptionEngine::newOptionValue, this, &SessionLoader::newOptionValue,Qt::QueuedConnection);
+ //load the plugin
+ PluginsManager::pluginsManager->lockPluginListEdition();
+ connect(this,&SessionLoader::previouslyPluginAdded, this,&SessionLoader::onePluginAdded,Qt::QueuedConnection);
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginAdded, this,&SessionLoader::onePluginAdded,Qt::QueuedConnection);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginWillBeRemoved, this,&SessionLoader::onePluginWillBeRemoved,Qt::DirectConnection);
+ #endif
+ std::vector<PluginsAvailable> list=PluginsManager::pluginsManager->getPluginsByCategory(PluginType_SessionLoader);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
+ PluginsManager::pluginsManager->unlockPluginListEdition();
+ shouldEnabled=stringtobool(OptionEngine::optionEngine->getOptionValue("SessionLoader","LoadAtSessionStarting"));
+}
+
+SessionLoader::~SessionLoader()
+{
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).pluginLoader!=NULL)
+ {
+ if(!pluginList.at(index).pluginLoader->isLoaded() || pluginList.at(index).pluginLoader->unload())
+ {
+ delete pluginList.at(index).options;
+ pluginList.erase(pluginList.begin()+index);
+ }
+ }
+ index++;
+ }
+ #endif
+}
+
+void SessionLoader::onePluginAdded(const PluginsAvailable &plugin)
+{
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ if(plugin.category!=PluginType_SessionLoader)
+ return;
+ unsigned int index=0;
+ LocalPlugin newEntry;
+ std::string pluginPath=plugin.path+PluginsManager::getResolvedPluginName("sessionLoader");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"try load: "+pluginPath);
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+
+ PluginInterface_SessionLoader *sessionLoader;
+ QObjectList objectList=QPluginLoader::staticInstances();
+ index=0;
+ QObject *pluginObject;
+ while(index<objectList.size())
+ {
+ pluginObject=objectList.at(index);
+ sessionLoader = qobject_cast<PluginInterface_SessionLoader *>(pluginObject);
+ if(sessionLoader!=NULL)
+ break;
+ index++;
+ }
+ if(index==objectList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"static session loader not found");
+ return;
+ }
+ newEntry.pluginLoader=NULL;
+ #else
+ QPluginLoader *pluginLoader= new QPluginLoader(QString::fromStdString(pluginPath));
+ newEntry.pluginLoader=pluginLoader;
+ QObject *pluginInstance = pluginLoader->instance();
+ if(!pluginInstance)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to load the plugin: "+pluginLoader->errorString().toStdString());
+ return;
+ }
+ PluginInterface_SessionLoader *sessionLoader = qobject_cast<PluginInterface_SessionLoader *>(pluginInstance);
+ if(!sessionLoader)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to cast the plugin: "+pluginLoader->errorString().toStdString());
+ return;
+ }
+ //check if found
+ index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).sessionLoaderInterface==sessionLoader)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Plugin already found");
+ pluginLoader->unload();
+ return;
+ }
+ index++;
+ }
+ #endif
+ #ifdef ULTRACOPIER_DEBUG
+ connect(sessionLoader,&PluginInterface_SessionLoader::debugInformation,this,&SessionLoader::debugInformation);
+ #endif // ULTRACOPIER_DEBUG
+ newEntry.options=new LocalPluginOptions("SessionLoader-"+plugin.name);
+ 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(LanguagesManager::languagesManager,&LanguagesManager::newLanguageLoaded,newEntry.sessionLoaderInterface,&PluginInterface_SessionLoader::newLanguageLoaded);
+ pluginList.push_back(newEntry);
+ #else
+ Q_UNUSED(plugin);
+ return;
+ #endif
+}
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+void SessionLoader::onePluginWillBeRemoved(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_SessionLoader)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(plugin.path==pluginList.at(index).path)
+ {
+ if(pluginList.at(index).pluginLoader!=NULL)
+ {
+ if(!pluginList.at(index).pluginLoader->isLoaded() || pluginList.at(index).pluginLoader->unload())
+ {
+ delete pluginList.at(index).options;
+ pluginList.erase(pluginList.begin()+index);
+ }
+ }
+ break;
+ }
+ index++;
+ }
+}
+#endif
+
+void SessionLoader::newOptionValue(const std::string &groupName,const std::string &variableName,const std::string &value)
+{
+ if(groupName=="SessionLoader" && variableName=="LoadAtSessionStarting")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, value: "+value);
+ shouldEnabled=stringtobool(value);
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ pluginList.at(index).sessionLoaderInterface->setEnabled(shouldEnabled);
+ index++;
+ }
+ }
+}
+
+#ifdef ULTRACOPIER_DEBUG
+void SessionLoader::debugInformation(const Ultracopier::DebugLevel &level,const std::string& fonction,const std::string& text,const std::string& file,const int& ligne)
+{
+ DebugEngine::addDebugInformationStatic(level,fonction,text,file,ligne,"Session loader plugin");
+}
+#endif // ULTRACOPIER_DEBUG
+#endif // !defined(ULTRACOPIER_PLUGIN_ALL_IN_ONE) || !defined(ULTRACOPIER_VERSION_PORTABLE)
diff --git a/SessionLoader.h b/SessionLoader.h
new file mode 100644
index 0000000..7889284
--- /dev/null
+++ b/SessionLoader.h
@@ -0,0 +1,61 @@
+/** \file SessionLoader.h
+\brief Define the class to load the plugin and lunch it
+\author alpha_one_x86
+\licence GPL3, see the file COPYING
+
+This class load ALL plugin compatible to listen and catch the copy/move
+*/
+
+#ifndef SESSIONLOADER_H
+#define SESSIONLOADER_H
+
+#include <QObject>
+#include <QList>
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#include <QPluginLoader>
+#endif
+#include <QString>
+#include <QStringList>
+
+#include "interface/PluginInterface_SessionLoader.h"
+#include "PluginsManager.h"
+#include "OptionDialog.h"
+#include "LocalPluginOptions.h"
+
+#ifndef ULTRACOPIER_VERSION_PORTABLE
+/** \brief manage all SessionLoader plugin */
+class SessionLoader : public QObject
+{
+ Q_OBJECT
+ public:
+ explicit SessionLoader(OptionDialog *optionDialog);
+ ~SessionLoader();
+ private slots:
+ void onePluginAdded(const PluginsAvailable &plugin);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void onePluginWillBeRemoved(const PluginsAvailable &plugin);
+ #endif
+ void newOptionValue(const std::string &groupName,const std::string &variableName,const std::string &value);
+ #ifdef ULTRACOPIER_DEBUG
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string& fonction,const std::string& text,const std::string& file,const int& ligne);
+ #endif // ULTRACOPIER_DEBUG
+ private:
+ //variable
+ struct LocalPlugin
+ {
+ PluginInterface_SessionLoader * sessionLoaderInterface;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ QPluginLoader * pluginLoader;
+ #endif
+ std::string path;
+ LocalPluginOptions *options;
+ };
+ std::vector<LocalPlugin> pluginList;
+ bool shouldEnabled;
+ OptionDialog *optionDialog;
+ signals:
+ void previouslyPluginAdded(PluginsAvailable) const;
+};
+#endif
+
+#endif // SESSIONLOADER_H
diff --git a/StructEnumDefinition.h b/StructEnumDefinition.h
new file mode 100644
index 0000000..e8f8de2
--- /dev/null
+++ b/StructEnumDefinition.h
@@ -0,0 +1,153 @@
+/** \file StructEnumDefinition.h
+\brief Define the structure and enumeration used in ultracopier or into the plugin
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <string>
+#include <stdint.h>
+
+#ifndef STRUCTDEF_H
+#define STRUCTDEF_H
+
+namespace Ultracopier {
+/// \brief Define the mode of the copy window/request, if need be copy or move
+enum CopyMode
+{
+ Copy=0x00000000,
+ Move=0x00000001
+};
+
+enum RemainingTimeAlgo
+{
+ RemainingTimeAlgo_Traditional=0x00000000,
+ RemainingTimeAlgo_Logarithmic=0x00000001
+};
+
+/// \brief Define the catching state, if the copy is totally catch of the explorer, partially or nothing
+enum CatchState
+{
+ Uncaught=0x00000000,
+ Semiuncaught=0x00000001,
+ Caught=0x00000002
+};
+
+/// \brief Define the listening state
+enum ListeningState
+{
+ NotListening=0x00000000,///< 0 listener is listening
+ SemiListening=0x00000001,///< only part of listeners are listening
+ FullListening=0x00000002///< all the listeners are listening
+};
+
+/// \brief Define the copy type, if folder, file or both
+enum CopyType
+{
+ File = 0x00000001,
+ FileAndFolder = 0x00000002
+};
+
+/// \brief transfer list operation, can define nothing, the import/export or both
+enum TransferListOperation
+{
+ TransferListOperation_None = 0x00000000,
+ TransferListOperation_Import = 0x00000001,
+ TransferListOperation_Export = 0x00000002,
+ TransferListOperation_ImportExport = TransferListOperation_Import | TransferListOperation_Export
+};
+
+enum EngineActionInProgress
+{
+ Idle = 0x00000000,
+ Listing = 0x00000001,
+ Copying = 0x00000002,
+ CopyingAndListing = Listing | Copying
+};
+
+/// \brief the level of information
+enum DebugLevel
+{
+ 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
+{
+ SizeUnit_byte=0x00000000,
+ SizeUnit_KiloByte=0x00000001,
+ SizeUnit_MegaByte=0x00000002,
+ SizeUnit_GigaByte=0x00000003,
+ SizeUnit_TeraByte=0x00000004,
+ SizeUnit_PetaByte=0x00000005,
+ SizeUnit_ExaByte=0x00000006,
+ SizeUnit_ZettaByte=0x00000007,
+ SizeUnit_YottaByte=0x00000008
+};
+
+/// \brief structure for decompossed time
+struct TimeDecomposition
+{
+ uint16_t second;
+ uint16_t minute;
+ uint16_t hour;
+};
+
+//////////////////////////// Return list //////////////////////////////
+enum ActionTypeCopyList
+{
+ //playlist action
+ MoveItem=0x00000000,
+ RemoveItem=0x00000001,
+ AddingItem=0x00000002,
+ //Item action, to inform the stat of one entry
+ PreOperation=0x00000003,
+ Transfer=0x00000004,
+ PostOperation=0x00000005,
+ CustomOperation=0x00000006 /// \note this need be used after preoperation and before postoperation
+};
+
+/// \brief structure for progression item
+struct ProgressionItem
+{
+ uint64_t id;
+ uint64_t currentRead;
+ uint64_t currentWrite;
+ uint64_t total;
+};
+
+/// \brief item to insert item in the interface
+struct ItemOfCopyList
+{
+ uint64_t id;
+ // if type == CustomOperation, then is the translated name of the operation
+ std::string sourceFullPath;///< full path with file name: /foo/foo.txt
+ std::string sourceFileName;///< full path with file name: foo.txt
+ std::string destinationFullPath;///< full path with file name: /foo/foo.txt
+ std::string destinationFileName;///< full path with file name: foo.txt
+ // if type == CustomOperation, then 0 = without progression, 1 = with progression
+ uint64_t size;
+ CopyMode mode;
+};
+
+/// \brief The definition of no removing action on transfer list
+struct ActionOnCopyList
+{
+ int position;
+ // if type == MoveItem
+ // if type == RemoveItem, then 0 = normal remove, 1 = skip
+ int moveAt;
+};
+
+/// \brief action normal or due to interface query on copy list
+struct ReturnActionOnCopyList
+{
+ ActionTypeCopyList type;
+ ///< used if type == AddingItem || type == PreOperation (for interface without transfer list) || type == CustomOperation
+ ItemOfCopyList addAction;
+ ///< used if type != AddingItem
+ ActionOnCopyList userAction;
+};
+}
+
+#endif // STRUCTDEF_H
diff --git a/StructEnumDefinition_UltracopierSpecific.h b/StructEnumDefinition_UltracopierSpecific.h
new file mode 100644
index 0000000..480b7cb
--- /dev/null
+++ b/StructEnumDefinition_UltracopierSpecific.h
@@ -0,0 +1,55 @@
+/** \file StructEnumDefinition_UltracopierSpecific.h
+\brief Define the structure and enumeration used in ultracopier only
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <string>
+#include <vector>
+#include <QDomElement>
+
+#ifndef STRUCTDEF_ULTRACOPIERSPECIFIC_H
+#define STRUCTDEF_ULTRACOPIERSPECIFIC_H
+
+enum PluginType : uint8_t
+{
+ PluginType_Unknow=0,
+ PluginType_CopyEngine=1,
+ PluginType_Languages=2,
+ PluginType_Listener=3,
+ PluginType_PluginLoader=4,
+ PluginType_SessionLoader=5,
+ PluginType_Themes=6
+};
+
+/// \brief structure to store the general plugin related information
+struct PluginsAvailable
+{
+ PluginType category;
+ std::string path;
+ std::string name;
+ std::string writablePath;
+ QDomElement categorySpecific;
+ std::string version;
+ std::vector<std::vector<std::string> > informations;
+ std::string errorString;
+ bool isWritable;
+ bool isAuth;
+};
+
+enum DebugLevel_custom : uint8_t
+{
+ DebugLevel_custom_Information=0,
+ DebugLevel_custom_Critical=1,
+ DebugLevel_custom_Warning=2,
+ DebugLevel_custom_Notice=3,
+ DebugLevel_custom_UserNote=4
+};
+
+enum ActionOnManualOpen : uint8_t
+{
+ ActionOnManualOpen_Nothing=0x00,
+ ActionOnManualOpen_Folder=0x01,
+ ActionOnManualOpen_Files=0x02
+};
+
+#endif // STRUCTDEF_ULTRACOPIERSPECIFIC_H
diff --git a/SystrayIcon.cpp b/SystrayIcon.cpp
new file mode 100644
index 0000000..ab3c3e0
--- /dev/null
+++ b/SystrayIcon.cpp
@@ -0,0 +1,559 @@
+/** \file SystrayIcon.cpp
+\brief Define the class of the systray icon
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QMessageBox>
+#include <QMimeData>
+#include <QDesktopServices>
+
+#include "SystrayIcon.h"
+#include "PluginsManager.h"
+#include "ThemesManager.h"
+#include "LanguagesManager.h"
+#include "HelpDialog.h"
+
+#ifdef Q_OS_MAC
+//extern void qt_mac_set_dock_menu(QMenu *menu);
+#endif
+
+/// \brief Initiate and show the icon in the systray
+SystrayIcon::SystrayIcon(QObject * parent) :
+ QSystemTrayIcon(parent)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+
+ //setup the systray icon
+ haveListenerInfo = false;
+ havePluginLoaderInfo = false;
+ systrayMenu = new QMenu();
+ actionMenuAbout = new QAction(this);
+ #ifdef ULTRACOPIER_DEBUG
+ actionSaveBugReport = new QAction(this);
+ #endif
+ actionMenuQuit = new QAction(this);
+ actionOptions = new QAction(this);
+ //actionTransfer = new QAction(this);
+ #if ! defined(Q_OS_LINUX) || (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
+ copyMenu = NULL;
+ #endif
+ //to prevent init bug
+ stateListener=Ultracopier::NotListening;
+ statePluginLoader=Ultracopier::Uncaught;
+
+ setContextMenu(systrayMenu);
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ setToolTip(QStringLiteral("Supercopier"));
+ #else
+ setToolTip(QStringLiteral("Ultracopier"));
+ #endif
+ #ifdef Q_OS_WIN32
+ setIcon(QIcon(QStringLiteral(":/systray_Uncaught_Windows.png")));
+ #else
+ setIcon(QIcon(QStringLiteral(":/systray_Uncaught_Unix.png")));
+ #endif
+ //connect the action
+ connect(&timerCheckSetTooltip, &QTimer::timeout, this, &SystrayIcon::checkSetTooltip);
+ #ifdef ULTRACOPIER_DEBUG
+ connect(actionSaveBugReport, &QAction::triggered, this, &SystrayIcon::saveBugReport);
+ #endif
+ connect(actionMenuQuit, &QAction::triggered, this, &SystrayIcon::hide);
+ connect(actionMenuQuit, &QAction::triggered, this, &SystrayIcon::quit);
+ connect(actionMenuAbout, &QAction::triggered, this, &SystrayIcon::showHelp);
+ connect(actionOptions, &QAction::triggered, this, &SystrayIcon::showOptions);
+ connect(this, &SystrayIcon::activated, this, &SystrayIcon::CatchAction);
+ #ifdef ULTRACOPIER_INTERNET_SUPPORT
+ connect(this, &QSystemTrayIcon::messageClicked, this, &SystrayIcon::messageClicked);
+ #endif
+ connect(PluginsManager::pluginsManager, &PluginsManager::pluginListingIsfinish, this, &SystrayIcon::reloadEngineList);
+ //display the icon
+ updateCurrentTheme();
+ //if theme/language change, update graphic part
+ connect(ThemesManager::themesManager, &ThemesManager::theThemeIsReloaded, this, &SystrayIcon::updateCurrentTheme, Qt::QueuedConnection);
+ connect(LanguagesManager::languagesManager, &LanguagesManager::newLanguageLoaded, this, &SystrayIcon::retranslateTheUI, Qt::QueuedConnection);
+
+ systrayMenu->addAction(actionOptions);
+ systrayMenu->addAction(actionMenuAbout);
+ #ifdef ULTRACOPIER_DEBUG
+ systrayMenu->addAction(actionSaveBugReport);
+ #endif
+ systrayMenu->addAction(actionMenuQuit);
+ #ifndef Q_OS_MAC
+ systrayMenu->insertSeparator(actionOptions);
+ #endif
+ retranslateTheUI();
+ updateSystrayIcon();
+
+ #ifdef ULTRACOPIER_INTERNET_SUPPORT
+ lastVersion=ULTRACOPIER_VERSION;
+ #endif
+
+ timerCheckSetTooltip.setSingleShot(true);
+ timerCheckSetTooltip.start(1000);
+
+ //impossible with Qt on systray
+ /// \note important for drag and drop, \see dropEvent()
+ systrayMenu->setAcceptDrops(true);
+
+ #ifdef Q_OS_MAC
+// qt_mac_set_dock_menu(systrayMenu);
+ #endif
+
+ show();
+}
+
+/// \brief Hide and destroy the icon in the systray
+SystrayIcon::~SystrayIcon()
+{
+ delete actionMenuQuit;
+ #ifdef ULTRACOPIER_DEBUG
+ delete actionSaveBugReport;
+ #endif
+ delete actionMenuAbout;
+ delete actionOptions;
+ delete systrayMenu;
+ #if ! defined(Q_OS_LINUX) || (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
+ if(copyMenu!=NULL)
+ {
+ delete copyMenu;
+ copyMenu=NULL;
+ }
+ #endif
+}
+
+void SystrayIcon::checkSetTooltip()
+{
+ if(isSystemTrayAvailable())
+ {
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ setToolTip(QStringLiteral("Supercopier"));
+ #else
+ setToolTip(QStringLiteral("Ultracopier"));
+ #endif
+ updateSystrayIcon();
+ }
+ else
+ timerCheckSetTooltip.start();
+}
+
+void SystrayIcon::listenerReady(const Ultracopier::ListeningState &state,const bool &havePlugin,const bool &someAreInWaitOfReply)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"state: "+std::to_string((int)state)+", havePlugin: "+std::to_string((int)havePlugin)+", someAreInWaitOfReply: "+std::to_string((int)someAreInWaitOfReply));
+ Q_UNUSED(someAreInWaitOfReply);
+ stateListener=state;
+ haveListenerInfo=true;
+ haveListener=havePlugin;
+ updateSystrayIcon();
+ if(!havePlugin)
+ showTryCatchMessageWithNoListener();
+}
+
+void SystrayIcon::pluginLoaderReady(const Ultracopier::CatchState &state,const bool &havePlugin,const bool &someAreInWaitOfReply)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"state: "+std::to_string((int)state)+", havePlugin: "+std::to_string((int)havePlugin)+", someAreInWaitOfReply: "+std::to_string((int)someAreInWaitOfReply));
+ Q_UNUSED(someAreInWaitOfReply);
+ statePluginLoader=state;
+ havePluginLoaderInfo=true;
+ havePluginLoader=havePlugin;
+ updateSystrayIcon();
+}
+
+void SystrayIcon::showTryCatchMessageWithNoListener()
+{
+ showSystrayMessage(tr("No copy listener found. Do the copy manually by right click one the system tray icon.").toStdString());
+}
+
+/// \brief To show a message linked to the systray icon
+void SystrayIcon::showSystrayMessage(const std::string& text)
+{
+ showMessage(tr("Information"),QString::fromStdString(text),QSystemTrayIcon::Information,0);
+}
+
+#ifdef ULTRACOPIER_INTERNET_SUPPORT
+void SystrayIcon::messageClicked()
+{
+ QDesktopServices::openUrl(QString::fromStdString(HelpDialog::getUpdateUrl()));
+}
+#endif
+
+/// \brief To update the systray icon
+void SystrayIcon::updateSystrayIcon()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, haveListenerInfo "+std::to_string((int)haveListenerInfo)+", havePluginLoaderInfo: "+std::to_string((int)havePluginLoaderInfo));
+ std::string toolTip="???";
+ std::string icon;
+ if(!haveListenerInfo || !havePluginLoaderInfo)
+ {
+ toolTip=tr("Searching information...").toStdString();
+ icon="Uncaught";
+ }
+ else
+ {
+ Ultracopier::ListeningState stateListener=this->stateListener;
+ Ultracopier::CatchState statePluginLoader=this->statePluginLoader;
+ if(!haveListener)
+ stateListener=Ultracopier::NotListening;
+ if((stateListener==Ultracopier::NotListening && statePluginLoader==Ultracopier::Uncaught) || (stateListener==Ultracopier::SemiListening && statePluginLoader==Ultracopier::Semiuncaught) || (stateListener==Ultracopier::FullListening && statePluginLoader==Ultracopier::Caught))
+ {
+ if(stateListener==Ultracopier::NotListening)
+ {
+ toolTip=tr("Do not replace the explorer copy/move").toStdString();
+ icon="Uncaught";
+ }
+ else if(stateListener==Ultracopier::SemiListening)
+ {
+ toolTip=tr("Semi replace the explorer copy/move").toStdString();
+ icon="Semiuncaught";
+ }
+ else
+ {
+ toolTip=tr("Replace the explorer copy/move").toStdString();
+ icon="Caught";
+ }
+ }
+ else
+ {
+ icon="Semiuncaught";
+ std::string first_part;
+ std::string second_part;
+ if(stateListener==Ultracopier::NotListening)
+ first_part="No listening";
+ else if(stateListener==Ultracopier::SemiListening)
+ first_part="Semi listening";
+ else if(stateListener==Ultracopier::FullListening)
+ first_part="Full listening";
+ else
+ first_part="Unknow listening";
+ if(statePluginLoader==Ultracopier::Uncaught)
+ second_part="No replace";
+ else if(statePluginLoader==Ultracopier::Semiuncaught)
+ second_part="Semi replace";
+ else if(statePluginLoader==Ultracopier::Caught)
+ second_part="Full replace";
+ else
+ second_part="Unknow replace";
+ toolTip=first_part+"/"+second_part;
+ }
+ }
+ QIcon theNewSystrayIcon;
+ #ifdef Q_OS_WIN32
+ theNewSystrayIcon=ThemesManager::themesManager->loadIcon("SystemTrayIcon/systray_"+icon+"_Windows.png");
+ #else
+ theNewSystrayIcon=ThemesManager::themesManager->loadIcon("SystemTrayIcon/systray_"+icon+"_Unix.png");
+ #endif
+ if(theNewSystrayIcon.isNull())
+ {
+ #ifdef Q_OS_WIN32
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"use the default systray icon: :/systray_"+icon+"_Windows.png");
+ theNewSystrayIcon=QIcon(QString::fromStdString(":/systray_"+icon+"_Windows.png"));
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"use the default systray icon: :/systray_"+icon+"_Unix.png");
+ theNewSystrayIcon=QIcon(QString::fromStdString(":/systray_"+icon+"_Unix.png"));
+ #endif
+ }
+ else
+ {
+ #ifdef Q_OS_WIN32
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"icon: systray_"+icon+"_Windows.png");
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"icon: systray_"+icon+"_Unix.png");
+ #endif
+ }
+ if(theNewSystrayIcon.isNull())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"All the icon include the default icon remain null");
+ setIcon(theNewSystrayIcon);
+ #ifdef ULTRACOPIER_MODE_SUPERCOPIER
+ setToolTip(QString::fromStdString("Supercopier - "+toolTip));
+ #else
+ setToolTip(QString::fromStdString("Ultracopier - "+toolTip));
+ #endif
+}
+
+/* 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(Ultracopier::DebugLevel_Notice,"mimeData->urls().size()"+std::to_string(mimeData->urls().size()));
+ std::vector<std::string> urls;
+ unsigned int index=0;
+ while(index<(unsigned int)mimeData->urls().size())
+ {
+ urls.push_back(mimeData->urls().at(static_cast<int>(index)).toString().toStdString());
+ index++;
+ }
+ emit urlDropped(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()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"icon: start");
+ //load the systray menu item
+ QIcon tempIcon;
+
+ tempIcon=ThemesManager::themesManager->loadIcon("SystemTrayIcon/exit.png");
+ if(!tempIcon.isNull())
+ IconQuit=QIcon(tempIcon);
+ else
+ IconQuit=QIcon("");
+ actionMenuQuit->setIcon(IconQuit);
+
+ #ifdef ULTRACOPIER_DEBUG
+ actionSaveBugReport->setIcon(QIcon(":/warning.png"));
+ #endif
+
+ tempIcon=ThemesManager::themesManager->loadIcon("SystemTrayIcon/informations.png");
+ if(!tempIcon.isNull())
+ IconInfo=QIcon(tempIcon);
+ else
+ IconInfo=QIcon("");
+ actionMenuAbout->setIcon(IconInfo);
+
+ tempIcon=ThemesManager::themesManager->loadIcon("SystemTrayIcon/options.png");
+ if(!tempIcon.isNull())
+ IconOptions=QIcon(tempIcon);
+ else
+ IconOptions=QIcon("");
+ actionOptions->setIcon(IconOptions);
+
+ tempIcon=ThemesManager::themesManager->loadIcon("SystemTrayIcon/add.png");
+ if(!tempIcon.isNull())
+ IconAdd=QIcon(tempIcon);
+ else
+ IconAdd=QIcon("");
+
+ //update the systray icon
+ updateSystrayIcon();
+ reloadEngineList();
+}
+
+/* \brief For catch an action on the systray icon
+\param reason Why it activated */
+void SystrayIcon::CatchAction(QSystemTrayIcon::ActivationReason reason)
+{
+ if(reason==QSystemTrayIcon::DoubleClick || reason==QSystemTrayIcon::Trigger)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Double click on system tray icon");
+ if(stateListener!=Ultracopier::NotListening)
+ emit tryUncatchCopy();
+ else
+ {
+ if(!haveListener)
+ {
+ showTryCatchMessageWithNoListener();
+ return;
+ }
+ emit tryCatchCopy();
+ }
+ }
+ else if(reason==QSystemTrayIcon::Context)//do nothing on right click to show as auto the menu
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"The action on the systray icon is unknown: "+std::to_string((int)reason));
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The action on the systray icon is unknown: "+std::to_string((int)reason));
+ QMessageBox::warning(NULL,tr("Warning"),tr("The action on the systray icon is unknown!"));
+ }
+}
+
+/// \brief To catch copy menu action
+void SystrayIcon::CatchCopyQuery()
+{
+ QAction * currentAction=qobject_cast<QAction *>(QObject::sender());
+ if(currentAction==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action not found");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+currentAction->data().toString().toStdString());
+ emit addWindowCopyMove(Ultracopier::Copy,currentAction->data().toString().toStdString());
+}
+
+/// \brief To catch move menu action
+void SystrayIcon::CatchMoveQuery()
+{
+ QAction * currentAction=qobject_cast<QAction *>(QObject::sender());
+ if(currentAction==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action not found");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+currentAction->data().toString().toStdString());
+ emit addWindowCopyMove(Ultracopier::Move,currentAction->data().toString().toStdString());
+}
+
+/// \brief To catch transfer menu action
+void SystrayIcon::CatchTransferQuery()
+{
+ QAction * currentAction=qobject_cast<QAction *>(QObject::sender());
+ if(currentAction==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action not found");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+currentAction->data().toString().toStdString());
+ emit addWindowTransfer(currentAction->data().toString().toStdString());
+}
+
+/// \brief to retranslate the ui
+void SystrayIcon::retranslateTheUI()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"retranslateTheUI");
+ #ifdef ULTRACOPIER_DEBUG
+ actionMenuAbout ->setText(tr("&About/Debug report"));
+ #else // ULTRACOPIER_DEBUG
+ actionMenuAbout ->setText(tr("&About"));
+ #endif // ULTRACOPIER_DEBUG
+ #ifdef ULTRACOPIER_DEBUG
+ actionSaveBugReport->setText(tr("&Save bug report"));
+ #endif
+ actionMenuQuit ->setText(tr("&Quit"));
+ actionOptions ->setText(tr("&Options"));
+ reloadEngineList();
+ updateSystrayIcon();
+}
+
+void SystrayIcon::addCopyEngine(const std::string &name,const bool &canDoOnlyCopy)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ EngineEntry entry;
+ entry.name=name;
+ entry.canDoOnlyCopy=canDoOnlyCopy;
+ engineEntryList.push_back(entry);
+ if(PluginsManager::pluginsManager->allPluginHaveBeenLoaded())
+ reloadEngineList();
+}
+
+void SystrayIcon::removeCopyEngine(const std::string &name)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ unsigned int index=0;
+ while(index<engineEntryList.size())
+ {
+ if(engineEntryList.at(index).name==name)
+ {
+ engineEntryList.erase(engineEntryList.cbegin()+index);
+ break;
+ }
+ index++;
+ }
+ reloadEngineList();
+}
+
+#ifdef ULTRACOPIER_INTERNET_SUPPORT
+void SystrayIcon::newUpdate(const std::string &version)
+{
+ /*if(version==lastVersion)
+ return;*/
+ lastVersion=version;
+ showSystrayMessage((tr("New version: %1").arg(QString::fromStdString(version))+"\n"+tr("Click here to go on download page")).toStdString());
+}
+#endif
+
+void SystrayIcon::addEngineAction(const QString &name, const QIcon &icon, const QString &label, QMenu *menu, void (SystrayIcon::*query)())
+{
+ QAction *copy = new QAction(icon, label, menu);
+ connect(copy,&QAction::triggered, this, query);
+ copy->setData(name);
+ #if ! defined(Q_OS_LINUX) || (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
+ copyMenu->addAction(copy);
+ #else
+ actions.push_back(copy);
+ systrayMenu->insertAction(actionOptions, copy);
+ #endif
+}
+
+void SystrayIcon::reloadEngineList()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ #if ! defined(Q_OS_LINUX) || (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
+ if(copyMenu!=NULL)
+ {
+ delete copyMenu;
+ copyMenu=NULL;
+ }
+ copyMenu=new QMenu();
+ copyMenu ->setTitle(tr("A&dd copy/moving"));
+ copyMenu->setIcon(IconAdd);
+ systrayMenu->insertMenu(actionOptions,copyMenu);
+ copyMenu->setEnabled(true);
+ if(engineEntryList.size()==0)
+ {
+ copyMenu->setEnabled(false);
+ return;
+ }
+ #else
+ {
+ for(unsigned int index=0; index<actions.size(); index++)
+ {
+ delete actions.at(index);
+ }
+ actions.clear();
+ }
+ #endif
+
+ if(engineEntryList.size()==0)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"engineEntryList.size(): "+std::to_string(engineEntryList.size()));
+ for(unsigned int index=0; index<engineEntryList.size(); index++)
+ {
+ const EngineEntry &engineEntry = engineEntryList.at(index);
+ const QString &name = QString::fromStdString(engineEntry.name);
+ QString labelCopy = tr("Add &copy");
+ QString labelTransfer = tr("Add &transfer");
+ QString labelMove = tr("Add &move");
+ QMenu *menu = nullptr;
+ #if ! defined(Q_OS_LINUX) || (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
+ if(engineEntryList.size()==1)
+ menu = copyMenu;
+ else
+ menu = new QMenu(name);
+ #else
+ if(engineEntryList.size()!=1) {
+ labelCopy += " ("+name+")";
+ labelTransfer += " ("+name+")";
+ labelMove += " ("+name+")";
+ }
+ #endif
+ addEngineAction(name, IconAdd, labelCopy, menu, &SystrayIcon::CatchCopyQuery);
+ if(!engineEntry.canDoOnlyCopy)
+ {
+ addEngineAction(name, IconAdd, labelTransfer, menu, &SystrayIcon::CatchTransferQuery);
+ addEngineAction(name, IconAdd, labelMove, menu, &SystrayIcon::CatchMoveQuery);
+ }
+ #if ! defined(Q_OS_LINUX) || (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
+ if(engineEntryList.size()!=1)
+ copyMenu->addMenu(menu);
+ #endif
+ }
+ setContextMenu(systrayMenu);
+}
diff --git a/SystrayIcon.h b/SystrayIcon.h
new file mode 100644
index 0000000..5db5b4f
--- /dev/null
+++ b/SystrayIcon.h
@@ -0,0 +1,144 @@
+/** \file SystrayIcon.h
+\brief Define the class of the systray icon
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef SYSTRAY_ICON_H
+#define SYSTRAY_ICON_H
+
+#include <QSystemTrayIcon>
+#include <QObject>
+#include <QAction>
+#include <QMenu>
+#include <QTimer>
+#include <QDropEvent>
+#include <QList>
+#include <QUrl>
+
+#include "Environment.h"
+
+/** \brief The systray icon
+
+This class provide a systray icon and its functions */
+class SystrayIcon : public QSystemTrayIcon
+{
+ Q_OBJECT
+ public:
+ /// \brief Initiate and show the icon in the systray
+ SystrayIcon(QObject * parent = 0);
+ /// \brief Hide and destroy the icon in the systray
+ ~SystrayIcon();
+ public slots:
+ /// \brief For show a message linked to the systray icon
+ void showSystrayMessage(const std::string& text);
+ /** \brief Send that's caught state have changed for CatchedState::Uncatched or CatchedState::Semicatched or CatchedState::Catched
+ \see CatchState
+ \see tryCatchCopy()
+ \see tryUncatchCopy()
+ \param state is the new state */
+ void listenerReady(const Ultracopier::ListeningState &state,const bool &havePlugin,const bool &someAreInWaitOfReply);
+ void pluginLoaderReady(const Ultracopier::CatchState &state,const bool &havePlugin,const bool &someAreInWaitOfReply);
+ void addCopyEngine(const std::string &name,const bool &canDoOnlyCopy);
+ void removeCopyEngine(const std::string &name);
+ #ifdef ULTRACOPIER_INTERNET_SUPPORT
+ void newUpdate(const std::string &version);
+ #endif
+ private:
+ #ifdef ULTRACOPIER_INTERNET_SUPPORT
+ std::string lastVersion;
+ #endif
+ QMenu* systrayMenu; ///< Pointer on the menu
+ #if ! defined(Q_OS_LINUX) || (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
+ QMenu* copyMenu; ///< Pointer on the copy menu (move or copy)
+ #else
+ std::vector<QAction*> actions;
+ #endif
+ QAction* actionMenuQuit; ///< Pointer on the Quit action
+ #ifdef ULTRACOPIER_DEBUG
+ QAction* actionSaveBugReport;
+ #endif
+ QAction* actionMenuAbout; ///< Pointer on the About action
+ QAction* actionOptions; ///< Pointer on the Options action
+ QIcon IconQuit; ///< Pointer on the icon for quit
+ #ifdef ULTRACOPIER_DEBUG
+ QIcon IconSaveBugReport;
+ #endif
+ QIcon IconInfo; ///< Pointer on the icon for info
+ QIcon IconAdd; ///< Pointer on the icon for add
+ QIcon IconOptions; ///< Pointer on the options
+ /// \brief To update the systray icon
+ void updateSystrayIcon();
+ void showTryCatchMessageWithNoListener();
+ struct EngineEntry
+ {
+ bool canDoOnlyCopy;
+ std::string name;
+ };
+ std::vector<EngineEntry> engineEntryList;
+ // To store the current catch state
+ Ultracopier::ListeningState stateListener;
+ Ultracopier::CatchState statePluginLoader;
+ bool haveListenerInfo,havePluginLoaderInfo;
+ bool haveListener,havePluginLoader;
+ QTimer timerCheckSetTooltip;
+
+ void addEngineAction(const QString &name, const QIcon &icon, const QString &label, QMenu *menu, void (SystrayIcon::*query)());
+
+ /** \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();
+ /** \brief To catch an action on the systray icon
+ \param reason Why it activated */
+ void CatchAction(QSystemTrayIcon::ActivationReason reason);
+ /// \brief To catch copy menu action
+ void CatchCopyQuery();
+ /// \brief To catch move menu action
+ void CatchMoveQuery();
+ /// \brief To catch transfer menu action
+ void CatchTransferQuery();
+ /// \brief to retranslate the ui
+ void retranslateTheUI();
+ void reloadEngineList();
+ void checkSetTooltip();
+ #ifdef ULTRACOPIER_INTERNET_SUPPORT
+ void messageClicked();
+ #endif
+ signals:
+ /// \brief Quit ultracopier
+ void quit() const;
+ /// \brief Try catch the copy/move with plugin compatible
+ void tryCatchCopy() const;
+ /// \brief Try uncatch the copy/move with plugin compatible
+ void tryUncatchCopy() const;
+ /// \brief Show the help dialog
+ void showHelp() const;
+ /// \brief Show the help option
+ void showOptions() const;
+ /** \brief Add window copy or window move
+ \param mode Can be CopyMode::Copy or CopyMode::Move
+ \return The core object of the new window created */
+ void addWindowCopyMove(Ultracopier::CopyMode mode,std::string name) const;
+ void addWindowTransfer(std::string name) const;
+ void urlDropped(std::vector<std::string> urls) const;
+ void saveBugReport() const;
+};
+
+#endif // SYSTRAY_ICON_H
diff --git a/ThemesManager.cpp b/ThemesManager.cpp
new file mode 100644
index 0000000..ab61e44
--- /dev/null
+++ b/ThemesManager.cpp
@@ -0,0 +1,291 @@
+/** \file ThemesManager.cpp
+\brief Define the class for manage and load the themes
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QString>
+#include <QFile>
+#include <QMessageBox>
+
+#include "ThemesManager.h"
+#include "PluginsManager.h"
+#include "LanguagesManager.h"
+
+#ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+#include "plugins/Themes/Oxygen/ThemesFactory.h"
+#endif
+
+#ifdef ULTRACOPIER_MODE_SUPERCOPIER
+#define ULTRACOPIER_DEFAULT_STYLE "Supercopier"
+#else
+#define ULTRACOPIER_DEFAULT_STYLE "Oxygen"
+#endif
+
+/// \warning All plugin remain loaded
+/// \todo get the current themes instance
+
+/// \brief Create the manager and load the defaults variables
+ThemesManager::ThemesManager()
+{
+ //load the debug engine as external part because ThemesManager is base class
+ stopIt=false;
+ currentPluginIndex=-1;
+
+ //connect the plugin management
+ PluginsManager::pluginsManager->lockPluginListEdition();
+ connect(this, &ThemesManager::previouslyPluginAdded, this,&ThemesManager::onePluginAdded,Qt::QueuedConnection);
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginAdded, this,&ThemesManager::onePluginAdded,Qt::QueuedConnection);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginWillBeRemoved, this,&ThemesManager::onePluginWillBeRemoved,Qt::DirectConnection);
+ connect(PluginsManager::pluginsManager,&PluginsManager::onePluginWillBeUnloaded, this,&ThemesManager::onePluginWillBeRemoved,Qt::DirectConnection);
+ #endif
+ connect(PluginsManager::pluginsManager,&PluginsManager::pluginListingIsfinish, this,&ThemesManager::allPluginIsLoaded,Qt::QueuedConnection);
+ std::vector<PluginsAvailable> list=PluginsManager::pluginsManager->getPluginsByCategory(PluginType_Themes);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
+ PluginsManager::pluginsManager->unlockPluginListEdition();
+
+ //do the options
+ std::vector<std::pair<std::string, std::string> > KeysList;
+ KeysList.push_back(std::pair<std::string, std::string>("Ultracopier_current_theme",ULTRACOPIER_DEFAULT_STYLE));
+ OptionEngine::optionEngine->addOptionGroup("Themes",KeysList);
+
+ //load the default and current themes path
+ defaultStylePath=std::string(":/Themes/")+ULTRACOPIER_DEFAULT_STYLE+"/";
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Default style: "+defaultStylePath);
+ currentStylePath=defaultStylePath;
+ connect(OptionEngine::optionEngine, &OptionEngine::newOptionValue, this, &ThemesManager::newOptionValue,Qt::QueuedConnection);
+}
+
+/// \brief Destroy the themes manager
+ThemesManager::~ThemesManager()
+{
+ stopIt=true;
+}
+
+void ThemesManager::onePluginAdded(const PluginsAvailable &plugin)
+{
+ if(plugin.category!=PluginType_Themes)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+plugin.name);
+ PluginsAvailableThemes newPlugin;
+ newPlugin.plugin=plugin;
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ PluginInterface_ThemesFactory *factory;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ QObjectList objectList=QPluginLoader::staticInstances();
+ int index=0;
+ QObject *pluginObject;
+ while(index<objectList.size())
+ {
+ pluginObject=objectList.at(index);
+ factory = qobject_cast<PluginInterface_ThemesFactory *>(pluginObject);
+ if(factory!=NULL)
+ break;
+ index++;
+ }
+ if(index==objectList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"static themes not found");
+ emit newThemeOptions(newPlugin.plugin.name,NULL,false,true);
+ emit theThemeIsReloaded();
+ return;
+ }
+ newPlugin.pluginLoader=NULL;
+ #else
+ factory=new ThemesFactory();
+ #endif
+ #else
+ QPluginLoader *pluginLoader=new QPluginLoader(QString::fromStdString(newPlugin.plugin.path+FacilityEngine::separator()+PluginsManager::pluginsManager->getResolvedPluginName("interface")));
+ QObject *pluginInstance = pluginLoader->instance();
+ if(pluginInstance==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to load the plugin "+newPlugin.plugin.path+FacilityEngine::separator()+PluginsManager::pluginsManager->getResolvedPluginName("interface")+": "+pluginLoader->errorString().toStdString());
+ pluginLoader->unload();
+ emit newThemeOptions(newPlugin.plugin.name,NULL,false,true);
+ emit theThemeIsReloaded();
+ return;
+ }
+ PluginInterface_ThemesFactory *factory = qobject_cast<PluginInterface_ThemesFactory *>(pluginInstance);
+ if(factory==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to cast the plugin: "+pluginLoader->errorString().toStdString());
+ pluginLoader->unload();
+ emit newThemeOptions(newPlugin.plugin.name,NULL,false,true);
+ emit theThemeIsReloaded();
+ return;
+ }
+ //check if found
+ unsigned int indexTemp=0;
+ while(indexTemp<pluginList.size())
+ {
+ if(pluginList.at(indexTemp).factory==factory)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Plugin already found, current: "+newPlugin.plugin.path+FacilityEngine::separator()+PluginsManager::pluginsManager->getResolvedPluginName("interface")+", conflit plugin: "+pluginList.at(indexTemp).plugin.path+FacilityEngine::separator()+PluginsManager::pluginsManager->getResolvedPluginName("interface")+", name: "+newPlugin.plugin.name);
+ pluginLoader->unload();
+ emit newThemeOptions(newPlugin.plugin.name,NULL,false,true);
+ emit theThemeIsReloaded();
+ return;
+ }
+ indexTemp++;
+ }
+ newPlugin.pluginLoader=pluginLoader;
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"preload: "+newPlugin.plugin.name+", at the index: "+std::to_string(pluginList.size()));
+ #ifdef ULTRACOPIER_DEBUG
+ connect(factory,&PluginInterface_ThemesFactory::debugInformation,this,&ThemesManager::debugInformation,Qt::QueuedConnection);
+ #endif // ULTRACOPIER_DEBUG
+ connect(LanguagesManager::languagesManager,&LanguagesManager::newLanguageLoaded,factory,&PluginInterface_ThemesFactory::newLanguageLoaded);
+ newPlugin.factory=factory;
+
+ newPlugin.options=new LocalPluginOptions("Themes-"+newPlugin.plugin.name);
+ newPlugin.factory->setResources(newPlugin.options,newPlugin.plugin.writablePath,newPlugin.plugin.path,&FacilityEngine::facilityEngine,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ currentStylePath=newPlugin.plugin.path;
+ pluginList.push_back(newPlugin);
+ if(PluginsManager::pluginsManager->allPluginHaveBeenLoaded())
+ allPluginIsLoaded();
+ emit newThemeOptions(newPlugin.plugin.name,newPlugin.factory->options(),true,true);
+ emit theThemeIsReloaded();
+ return;
+}
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+void ThemesManager::onePluginWillBeRemoved(const PluginsAvailable &plugin)
+{
+ if(stopIt)
+ return;
+ if(plugin.category!=PluginType_Themes)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+plugin.name);
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).plugin==plugin)
+ {
+ if(pluginList.at(index).factory!=NULL)
+ delete pluginList.at(index).factory;
+ if(pluginList.at(index).pluginLoader!=NULL)
+ {
+ pluginList.at(index).pluginLoader->unload();
+ delete pluginList.at(index).pluginLoader;
+ }
+ if(currentPluginIndex==static_cast<int>(index))
+ currentPluginIndex=-1;
+ if(static_cast<int>(index)<currentPluginIndex)
+ currentPluginIndex--;
+ pluginList.erase(pluginList.begin()+index);
+ if(static_cast<unsigned int>(currentPluginIndex)>=pluginList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"plugin is out of inder!");
+ currentPluginIndex=-1;
+ }
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"plugin not found");
+}
+#endif
+
+/** \brief To get image into the current themes, or default if not found
+\param filePath The file path to search, like toto.png resolved with the root of the current themes
+\see currentStylePath */
+QIcon ThemesManager::loadIcon(const std::string &fileName)
+{
+ if(currentPluginIndex==-1)
+ return QIcon();
+ if(pluginList.at(static_cast<unsigned int>(currentPluginIndex)).factory==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Try get icon when the factory is not loaded");
+ return QIcon();
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Send interface pixmap: "+fileName);
+ return pluginList.at(static_cast<unsigned int>(currentPluginIndex)).factory->getIcon(fileName);
+}
+
+void ThemesManager::allPluginIsLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(pluginList.size()==0)
+ {
+ emit theThemeIsReloaded();
+ return;
+ }
+ std::string name=OptionEngine::optionEngine->getOptionValue("Themes","Ultracopier_current_theme");
+ unsigned int index=0;
+ while(index<pluginList.size())
+ {
+ if(pluginList.at(index).plugin.name==name)
+ {
+ currentPluginIndex=static_cast<int>(index);
+ emit theThemeIsReloaded();
+ return;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"theme not found!");
+ currentPluginIndex=-1;
+ emit theThemeIsReloaded();
+}
+
+PluginInterface_Themes * ThemesManager::getThemesInstance()
+{
+ if(currentPluginIndex==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to load the interface, copy aborted");
+ return NULL;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Send interface: "+pluginList.at(static_cast<unsigned int>(currentPluginIndex)).plugin.name);
+ if(static_cast<unsigned int>(currentPluginIndex)>=pluginList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to load the interface, internal selection bug");
+ return NULL;
+ }
+ if(pluginList.at(static_cast<unsigned int>(currentPluginIndex)).factory==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"No plugin factory loaded to get an instance");
+ return NULL;
+ }
+ return pluginList.at(static_cast<unsigned int>(currentPluginIndex)).factory->getInstance();
+}
+
+#ifdef ULTRACOPIER_DEBUG
+void ThemesManager::debugInformation(const Ultracopier::DebugLevel &level,const std::string& fonction,const std::string& text,const std::string& file,const int& ligne)
+{
+ DebugEngine::addDebugInformationStatic(level,fonction,text,file,ligne,"Theme plugin");
+}
+#endif // ULTRACOPIER_DEBUG
+
+void ThemesManager::newOptionValue(const std::string &group,const std::string &name,const std::string &value)
+{
+ if(group=="Themes" && name=="Ultracopier_current_theme")
+ {
+ if(!PluginsManager::pluginsManager->allPluginHaveBeenLoaded())
+ return;
+ if(currentPluginIndex!=-1 && value!=pluginList.at(static_cast<unsigned int>(currentPluginIndex)).plugin.name)
+ {
+ //int tempCurrentPluginIndex=currentPluginIndex;
+ emit theThemeNeedBeUnloaded();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"unload the themes: "+pluginList.at(static_cast<unsigned int>(currentPluginIndex)).plugin.name+" ("+std::to_string(currentPluginIndex)+")");
+ /* Themes remain loaded for the options
+ *if(pluginList.at(tempCurrentPluginIndex).options!=NULL)
+ {
+ delete pluginList.at(tempCurrentPluginIndex).options;
+ pluginList[tempCurrentPluginIndex].options=NULL;
+ }
+ if(pluginList.at(tempCurrentPluginIndex).factory!=NULL)
+ {
+ delete pluginList.at(tempCurrentPluginIndex).factory;
+ pluginList[tempCurrentPluginIndex].factory=NULL;
+ }
+ if(pluginList.at(tempCurrentPluginIndex).pluginLoader!=NULL)
+ {
+ pluginList.at(tempCurrentPluginIndex).pluginLoader->unload();
+ delete pluginList.at(tempCurrentPluginIndex).pluginLoader;
+ pluginList[tempCurrentPluginIndex].pluginLoader=NULL;
+ } */
+ }
+ allPluginIsLoaded();
+ //emit theThemeIsReloaded(); -> do into allPluginIsLoaded(); now
+ }
+}
diff --git a/ThemesManager.h b/ThemesManager.h
new file mode 100644
index 0000000..9e83af8
--- /dev/null
+++ b/ThemesManager.h
@@ -0,0 +1,87 @@
+/** \file ThemesManager.h
+\brief Define the class to manage and load the themes
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef THEMES_MANAGER_H
+#define THEMES_MANAGER_H
+
+#include <QString>
+#include <QObject>
+#include <QIcon>
+#include <QList>
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#include <QPluginLoader>
+#endif
+
+#include "Environment.h"
+#include "ResourcesManager.h"
+#include "OptionEngine.h"
+#include "PluginsManager.h"
+#include "LanguagesManager.h"
+#include "LocalPluginOptions.h"
+#include "FacilityEngine.h"
+
+#include "interface/PluginInterface_Themes.h"
+
+/** \brief Define the class to manage and load the themes
+
+This class provide a core load and manage the themes */
+class ThemesManager : public QObject
+{
+ Q_OBJECT
+ //public slots:
+ /*/// \brief To change the current themes selected
+ bool changeCurrentTheme(QString theNewThemeToLoad);*/
+ public:
+ /** \brief To get image into the current themes, or default if not found
+ \param filePath The file path to search, like toto.png resolved with the root of the current themes
+ \see currentStylePath */
+ QIcon loadIcon(const std::string &fileName);
+ /** \brief To get if one themes instance
+ \see Core() */
+ PluginInterface_Themes * getThemesInstance();
+
+ static ThemesManager *themesManager;
+ /// \brief Create the manager and load the defaults variables
+ ThemesManager();
+ /// \brief Destroy the themes manager
+ ~ThemesManager();
+ private:
+ /// \brief The default themes path where it has theme's files
+ std::string defaultStylePath;
+ /// \brief The current themes path loaded by ultracopier
+ std::string currentStylePath;
+ /// \brief OptionEngineGroupKey then: Group -> Key
+ struct PluginsAvailableThemes
+ {
+ PluginsAvailable plugin;
+ PluginInterface_ThemesFactory *factory;
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ QPluginLoader *pluginLoader;
+ #endif
+ LocalPluginOptions *options;
+ };
+ std::vector<PluginsAvailableThemes> pluginList;
+ int currentPluginIndex;//can bne -1
+ bool stopIt;
+ signals:
+ /// \brief send this signal when the themes have changed
+ void theThemeNeedBeUnloaded() const;
+ void theThemeIsReloaded() const;
+ void newThemeOptions(const std::string &name,QWidget *,const bool &isLoaded,const bool &havePlugin) const;
+ void previouslyPluginAdded(PluginsAvailable) const;
+ private slots:
+ /// \brief reload the themes
+ void onePluginAdded(const PluginsAvailable &plugin);
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ void onePluginWillBeRemoved(const PluginsAvailable &plugin);
+ #endif
+ void allPluginIsLoaded();
+ void newOptionValue(const std::string &group,const std::string &name,const std::string &value);
+ #ifdef ULTRACOPIER_DEBUG
+ void debugInformation(const Ultracopier::DebugLevel &level, const std::string& fonction, const std::string& text, const std::string& file, const int& ligne);
+ #endif // ULTRACOPIER_DEBUG
+};
+
+#endif // THEMES_MANAGER_H
diff --git a/Variable.h b/Variable.h
new file mode 100644
index 0000000..c3d01a3
--- /dev/null
+++ b/Variable.h
@@ -0,0 +1,50 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+/// \brief Un-comment this next line to put ultracopier in debug mode
+#define ULTRACOPIER_DEBUG
+#define ULTRACOPIER_DEBUG_MAX_GUI_LINE 50000 ///< \brief Max number of ligne show on the GUI
+#define ULTRACOPIER_DEBUG_MAX_ALL_SIZE 128 ///< \brief Max size (in MB) after the console/file output is dropped
+#define ULTRACOPIER_DEBUG_MAX_IMPORTANT_SIZE 150 ///< \brief Max size (in MB) after the console/file important output is dropped
+/// \brief the version
+#define ULTRACOPIER_VERSION "1.4.0.4"
+/// \brief the windows version
+#define ULTRACOPIER_WINDOWS_VERSION 1,4,0,4
+// define if the version is portable or not
+////#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
+//#define ULTRACOPIER_PLUGIN_ALL_IN_ONE
+//#define ULTRACOPIER_ILLEGAL
+//#define ULTRACOPIER_MODE_SUPERCOPIER
+/// \brief define time to update the speed detection update ont the interface (in ms)
+#define ULTRACOPIER_TIME_INTERFACE_UPDATE 500
+
+/** \brief How many value store to calculate the average value
+ * 5*ULTRACOPIER_TIME_INTERFACE_UPDATE = 5*500 to get 2.5s
+ * */
+#define ULTRACOPIER_MAXREMAININGTIMECOL 10
+#define ULTRACOPIER_MAXVALUESPEEDSTORED 5
+#define ULTRACOPIER_MINVALUESPEED 3
+#define ULTRACOPIER_MAXVALUESPEEDSTOREDTOREMAININGTIME 120
+#define ULTRACOPIER_MINVALUESPEEDTOREMAININGTIME 10
+#define ULTRACOPIER_REMAININGTIME_BIGFILEMEGABYTEBASE10 100
+
+/// \brief the socket name, to have unique instance of ultracopier, and pass arguments between the instance
+#define ULTRACOPIER_SOCKETNAME "ultracopier"
+
+/// \brief to have internet support, to communicate with the web site for update and plugins
+#define ULTRACOPIER_INTERNET_SUPPORT
+
+/// \brief to disable plugin support, import and remove
+#define ULTRACOPIER_PLUGIN_IMPORT_SUPPORT
+
+#define ULTRACOPIER_UPDATER_URL "http://ultracopier-update.first-world.info:10852/updater.txt"
+
+#endif // VARIABLE_H
diff --git a/cpp11addition.cpp b/cpp11addition.cpp
new file mode 100644
index 0000000..7da2205
--- /dev/null
+++ b/cpp11addition.cpp
@@ -0,0 +1,531 @@
+#include "cpp11addition.h"
+#include <sstream>
+#include <cassert>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <iostream>
+#include <chrono>
+
+/// \todo, check number validity by http://en.cppreference.com/w/c/string/byte/strtol
+/* to check: bool my_strtol(const std::string &str, long &v) {
+char *end = nullptr;
+v = strtol(str.c_str(), &end, 10);
+return end != nullptr;
+}*/
+
+static const std::regex ishexa("^([0-9a-fA-F][0-9a-fA-F])+$",std::regex::optimize);
+#if defined(_WIN32) || defined(CATCHCHALLENGER_EXTRA_CHECK)
+static const std::regex regexseparators("[/\\\\]+",std::regex::optimize);
+#endif
+
+static const std::string base64_chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/";
+
+static inline bool is_base64(unsigned char c) {
+ return (isalnum(c) || (c == '+') || (c == '/'));
+}
+
+static const char* const lut = "0123456789ABCDEF";
+
+std::size_t pairhash::operator()(const std::pair<uint8_t, uint8_t> &x) const
+{
+ return (x.first << 8) + x.second;
+}
+
+std::size_t pairhash::operator()(const std::pair<uint16_t, uint16_t> &x) const
+{
+ return (x.first << 16) + x.second;
+}
+
+std::string ltrim(const std::string& str)
+{
+ return std::regex_replace(str, std::regex("^ +"), "");
+}
+std::string rtrim(const std::string& str)
+{
+ return std::regex_replace(str, std::regex(" +$"), "");
+}
+std::string trim(const std::string& str)
+{
+ return std::regex_replace(str, std::regex("^ +| +$"), "");
+}
+
+bool stringreplaceOne(std::string& str, const std::string& from, const std::string& to)
+{
+ const size_t start_pos = str.find(from);
+ if(start_pos == std::string::npos)
+ return false;
+ str.replace(start_pos, from.length(), to);
+ return true;
+}
+
+uint8_t stringreplaceAll(std::string& str, const std::string& from, const std::string& to)
+{
+ if(from.empty())
+ return 0;
+ size_t start_pos = 0;
+ uint8_t count=0;
+ while((start_pos = str.find(from, start_pos)) != std::string::npos) {
+ str.replace(start_pos, from.length(), to);
+ start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
+ count++;
+ }
+ return count;
+}
+
+std::vector<std::string> stringregexsplit(const std::string& input, const std::regex& regex)
+{
+ // passing -1 as the submatch index parameter performs splitting
+ std::sregex_token_iterator
+ first{input.begin(), input.end(), regex, -1},
+ last;
+ return {first, last};
+}
+
+std::vector<std::string> stringsplit(const std::string &s, char delim)
+{
+ std::vector<std::string> elems;
+
+ std::string::size_type i = 0;
+ std::string::size_type j = s.find(delim);
+
+ if(j == std::string::npos)
+ {
+ if(!s.empty())
+ elems.push_back(s);
+ return elems;
+ }
+ else
+ {
+ while (j != std::string::npos) {
+ elems.push_back(s.substr(i, j-i));
+ i = ++j;
+ j = s.find(delim, j);
+
+ if (j == std::string::npos)
+ elems.push_back(s.substr(i, s.length()));
+ }
+ return elems;
+ }
+}
+
+bool stringEndsWith(std::string const &fullString, std::string const &ending)
+{
+ if (fullString.length() >= ending.length()) {
+ return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
+ } else {
+ return false;
+ }
+}
+
+bool stringEndsWith(std::string const &fullString, char const &ending)
+{
+ if (fullString.length()>0) {
+ return fullString[fullString.size()-1]==ending;
+ } else {
+ return false;
+ }
+}
+
+bool stringStartWith(std::string const &fullString, std::string const &starting)
+{
+ if (fullString.length() >= starting.length()) {
+ return (fullString.substr(0,starting.length())==starting);
+ } else {
+ return false;
+ }
+}
+
+bool stringStartWith(std::string const &fullString, char const &starting)
+{
+ if (fullString.length()>0) {
+ return fullString[0]==starting;
+ } else {
+ return false;
+ }
+}
+
+std::string& stringimplode(const std::vector<std::string>& elems, char delim, std::string& s)
+{
+ for (std::vector<std::string>::const_iterator ii = elems.begin(); ii != elems.cend(); ++ii)
+ {
+ s += (*ii);
+ if ( ii + 1 != elems.end() ) {
+ s += delim;
+ }
+ }
+
+ return s;
+}
+
+std::string stringimplode(const std::vector<std::string>& elems, char delim)
+{
+ std::string s;
+ return stringimplode(elems, delim, s);
+}
+
+std::string stringimplode(const std::queue<std::string>& elems, char delim)
+{
+ std::string newString;
+ std::queue<std::string> copy=elems;
+ unsigned int count=0;
+ while(!copy.empty())
+ {
+ if(count>0)
+ newString+=delim;
+ newString+=copy.front();
+ copy.pop();
+ ++count;
+ }
+
+ return newString;
+}
+
+std::string stringimplode(const std::vector<std::string>& elems, const std::string &delim)
+{
+ std::string newString;
+ for (std::vector<std::string>::const_iterator ii = elems.begin(); ii != elems.cend(); ++ii)
+ {
+ newString += (*ii);
+ if ( ii + 1 != elems.end() ) {
+ newString += delim;
+ }
+ }
+ return newString;
+}
+
+std::string binarytoHexa(const std::vector<char> &data, bool *ok)
+{
+ if(ok!=NULL)
+ *ok=true;
+ std::string output;
+ output.reserve(2*data.size());
+ for(size_t i=0;i<data.size();++i)
+ {
+ const unsigned char c = data[i];
+ output.push_back(lut[c >> 4]);
+ output.push_back(lut[c & 15]);
+ }
+ return output;
+}
+
+std::string binarytoHexa(const unsigned char * const data, const uint32_t &size, bool *ok)
+{
+ return binarytoHexa(reinterpret_cast<const char * const>(data),size,ok);
+}
+
+std::string binarytoHexa(const char * const data, const uint32_t &size, bool *ok)
+{
+ if(size==0)
+ return std::string();
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ if(__builtin_expect((size>100000000),0))
+ {
+ std::cerr << "cpp11addition binarytoHexa() size>100000000, seam be a bug, dropped to empty string" << std::endl;
+ return std::string();
+ }
+ #endif
+ if(ok!=NULL)
+ *ok=true;
+ std::string output;
+ output.reserve(2*size);
+ for(size_t i=0;i<size;++i)
+ {
+ const unsigned char c = data[i];
+ output.push_back(lut[c >> 4]);
+ output.push_back(lut[c & 15]);
+ }
+ return output;
+}
+
+uint8_t hexToDecUnit(const std::string& data, bool *ok)
+{
+ auto fromHex = [](char c, bool *ok)
+ {
+ if(ok!=NULL)
+ *ok=true;
+ if (isdigit(c)) return c - '0';
+ switch(c)
+ {
+ case '0':
+ return 0;
+ case '1':
+ return 1;
+ case '2':
+ return 2;
+ case '3':
+ return 3;
+ case '4':
+ return 4;
+ case '5':
+ return 5;
+ case '6':
+ return 6;
+ case '7':
+ return 7;
+ case '8':
+ return 8;
+ case '9':
+ return 9;
+
+ case 'a':
+ case 'A':
+ return 10;
+ case 'b':
+ case 'B':
+ return 11;
+ case 'c':
+ case 'C':
+ return 12;
+ case 'd':
+ case 'D':
+ return 13;
+ case 'e':
+ case 'E':
+ return 14;
+ case 'f':
+ case 'F':
+ return 15;
+ }
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ };
+ return fromHex(data[0],ok) << 4 | fromHex(data[1],ok);
+}
+
+std::vector<char> hexatoBinary(const std::string &data,bool *ok)
+{
+ if(data.size()%2!=0)
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return std::vector<char>();
+ }
+ if(Q_LIKELY(std::regex_match(data,ishexa)))
+ {
+ bool ok2;
+ std::vector<char> out;
+ out.reserve(data.length()/2);
+ for(size_t i=0;i<data.length();i+=2)
+ {
+ const std::string &partpfchain=data.substr(i,2);
+ const uint8_t &x=hexToDecUnit(partpfchain,&ok2);
+ if(!ok2)
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return std::vector<char>();
+ }
+ out.push_back(x);
+ }
+ if(ok!=NULL)
+ *ok=true;
+ return out;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return std::vector<char>();
+ }
+}
+
+void binaryAppend(std::vector<char> &data,const std::vector<char> &add)
+{
+ if(add.empty())
+ return;
+ if(data.empty())
+ {
+ data=add;
+ return;
+ }
+ const int oldsize=data.size();
+ data.resize(oldsize+add.size());
+ memcpy(data.data()+oldsize,add.data(),add.size());
+}
+
+void binaryAppend(std::vector<char> &data,const char * const add,const uint32_t &addSize)
+{
+ if(addSize==0)
+ return;
+ if(data.empty())
+ {
+ data.resize(addSize);
+ memcpy(data.data(),add,addSize);
+ return;
+ }
+ const int oldsize=data.size();
+ data.resize(oldsize+addSize);
+ memcpy(data.data()+oldsize,add,addSize);
+}
+
+std::vector<char> base64toBinary(const std::string &string)
+{
+ int index=0;
+ int sub_index=0;
+ int encoded_string_remaining=string.size();
+ int encoded_string_pos=0;
+ unsigned char char_array_4[4], char_array_3[3];
+ std::vector<char> ret;
+
+ while(encoded_string_remaining-- && (string[encoded_string_pos]!='=') && is_base64(string[encoded_string_pos]))
+ {
+ char_array_4[index++]=string[encoded_string_pos];
+ encoded_string_pos++;
+ if(index==4)
+ {
+ for(index=0;index<4;index++)
+ char_array_4[index]=base64_chars.find(char_array_4[index]);
+
+ char_array_3[0]=(char_array_4[0]<<2) + ((char_array_4[1]&0x30)>>4);
+ char_array_3[1]=((char_array_4[1]&0xf)<<4) + ((char_array_4[2]&0x3c)>>2);
+ char_array_3[2]=((char_array_4[2]&0x3)<<6) + char_array_4[3];
+
+ for(index=0;(index<3);index++)
+ ret.push_back(char_array_3[index]);
+
+ index=0;
+ }
+ }
+
+ if(index)
+ {
+ for(sub_index=index;sub_index<4;sub_index++)
+ char_array_4[sub_index]=0;
+
+ for(sub_index=0;sub_index<4;sub_index++)
+ char_array_4[sub_index]=base64_chars.find(char_array_4[sub_index]);
+
+ char_array_3[0]=(char_array_4[0]<<2) + ((char_array_4[1]&0x30)>>4);
+ char_array_3[1]=((char_array_4[1]&0xf)<<4) + ((char_array_4[2]&0x3c)>>2);
+ char_array_3[2]=((char_array_4[2]&0x3)<<6) + char_array_4[3];
+
+ for (sub_index=0;(sub_index<index-1);sub_index++)
+ ret.push_back(char_array_3[sub_index]);
+ }
+
+ return ret;
+}
+
+
+std::string FSabsoluteFilePath(const std::string &string)
+{
+ std::string newstring=string;
+ stringreplaceAll(newstring,"//","/");
+ #ifdef _WIN32
+ stringreplaceAll(newstring,"\\\\","\\");
+ std::vector<std::string> parts=stringregexsplit(newstring,regexseparators);
+ #else
+ std::vector<std::string> parts=stringsplit(newstring,'/');
+ #endif
+
+ #ifndef _WIN32
+ unsigned int index=1;
+ #else
+ unsigned int index=2;
+ #endif
+ while(index<parts.size())
+ {
+ if(parts.at(index)=="..")
+ {
+ parts.erase(parts.begin()+index);
+ #ifndef _WIN32
+ if(index>0 && (index>1 || !parts.at(index-1).empty()))
+ #else
+ if(index>1)
+ #endif
+ {
+ parts.erase(parts.begin()+index-1);
+ index--;
+ }
+ }
+ else
+ index++;
+ }
+
+ #ifndef _WIN32
+ if(parts.empty() || (parts.size()==1 && parts.at(0).empty()))
+ return "/";
+ #endif
+ return stringimplode(parts,'/');
+}
+
+std::string FSabsolutePath(const std::string &string)
+{
+ const std::string &tempFile=FSabsoluteFilePath(string);
+ const std::size_t &found=tempFile.find_last_of("/\\");
+ if(found!=std::string::npos)
+ return tempFile.substr(0,found)+'/';
+ else
+ return tempFile;
+}
+
+uint64_t msFrom1970()
+{
+ return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
+}
+
+uint64_t sFrom1970()
+{
+ return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()/1000;
+}
+
+std::string booltostring(const bool &value)
+{
+ if(value)
+ return "true";
+ else
+ return "false";
+}
+
+std::vector<std::string> stringtostringlist(const std::string &string)
+{
+ if(string.empty())
+ return std::vector<std::string>();
+ std::vector<std::string> returnedVar;
+ size_t start_pos = 0;
+ size_t firstChar = 0;
+ while((start_pos = string.find(',', start_pos)) != std::string::npos) {
+ if(start_pos==0 || string.at(start_pos-1)!=',')
+ {
+ std::string tempString=string.substr(firstChar,start_pos-1);
+ stringreplaceAll(tempString,",,",",");
+ returnedVar.push_back(tempString);
+ start_pos++;
+ firstChar=start_pos;
+ }
+ }
+ return returnedVar;
+}
+
+std::string stringlisttostring(const std::vector<std::string> &stringlist)
+{
+ std::string returnedString;
+ unsigned int index=0;
+ while(index<stringlist.size())
+ {
+ if(!returnedString.empty())
+ returnedString+=',';
+ std::string tempString=stringlist.at(index);
+ stringreplaceAll(tempString,",",",,");
+ returnedString+=tempString;
+ index++;
+ }
+ return returnedString;
+}
diff --git a/cpp11addition.h b/cpp11addition.h
new file mode 100644
index 0000000..db78b22
--- /dev/null
+++ b/cpp11addition.h
@@ -0,0 +1,203 @@
+#ifndef CATCHCHALLENGER_CPP11ADDITION_H
+#define CATCHCHALLENGER_CPP11ADDITION_H
+
+#include <vector>
+#include <queue>
+#include <string>
+#include <regex>
+#include <unordered_map>
+#include <unordered_set>
+
+#if ! defined(Q_LIKELY)
+ #if defined(__GNUC__)
+ # define Q_LIKELY(expr) __builtin_expect(!!(expr), true)
+ # define Q_UNLIKELY(expr) __builtin_expect(!!(expr), false)
+ #else
+ # define Q_LIKELY(x) (x)
+ #endif
+#endif
+
+struct pairhash {
+public:
+ std::size_t operator()(const std::pair<uint8_t, uint8_t> &x) const;
+ std::size_t operator()(const std::pair<uint16_t, uint16_t> &x) const;
+};
+
+std::string ltrim(const std::string& str);
+std::string rtrim(const std::string& str);
+std::string trim(const std::string& str);
+bool stringreplaceOne(std::string& str, const std::string& from, const std::string& to);
+uint8_t stringreplaceAll(std::string& str, const std::string& from, const std::string& to);
+std::vector<std::string> stringregexsplit(const std::string& input, const std::regex& regex);
+std::vector<std::string> stringsplit(const std::string &s, char delim);
+bool stringEndsWith(std::string const &fullString, std::string const &ending);
+bool stringEndsWith(std::string const &fullString, char const &ending);
+bool stringStartWith(std::string const &fullString, std::string const &starting);
+bool stringStartWith(std::string const &fullString, char const &starting);
+std::string& stringimplode(const std::vector<std::string>& elems, char delim, std::string& s);
+std::string stringimplode(const std::vector<std::string>& elems, char delim);
+std::string stringimplode(const std::queue<std::string>& elems, char delim);
+std::string stringimplode(const std::vector<std::string>& elems, const std::string &delim);
+
+uint8_t stringtouint8(const std::string &string,bool *ok=NULL);
+uint16_t stringtouint16(const std::string &string,bool *ok=NULL);
+uint32_t stringtouint32(const std::string &string,bool *ok=NULL);
+bool stringtobool(const std::string &string,bool *ok=NULL);
+uint64_t stringtouint64(const std::string &string,bool *ok=NULL);
+int8_t stringtoint8(const std::string &string,bool *ok=NULL);
+int16_t stringtoint16(const std::string &string,bool *ok=NULL);
+int32_t stringtoint32(const std::string &string,bool *ok=NULL);
+int64_t stringtoint64(const std::string &string,bool *ok=NULL);
+float stringtofloat(const std::string &string,bool *ok=NULL);
+double stringtodouble(const std::string &string,bool *ok=NULL);
+std::string booltostring(const bool &value);
+
+std::vector<std::string> stringtostringlist(const std::string &string);
+std::string stringlisttostring(const std::vector<std::string> &stringlist);
+
+std::string binarytoHexa(const std::vector<char> &data,bool *ok=NULL);
+std::string binarytoHexa(const char * const data,const uint32_t &size,bool *ok=NULL);
+std::string binarytoHexa(const unsigned char * const data,const uint32_t &size,bool *ok=NULL);
+uint8_t hexToDecUnit(const std::string& data,bool *ok=NULL);
+std::vector<char> hexatoBinary(const std::string &data,bool *ok=NULL);
+void binaryAppend(std::vector<char> &data,const std::vector<char> &add);
+void binaryAppend(std::vector<char> &data, const char * const add, const uint32_t &addSize);
+std::vector<char> base64toBinary(const std::string &string);
+std::string FSabsoluteFilePath(const std::string &string);
+std::string FSabsolutePath(const std::string &string);
+uint64_t msFrom1970();
+uint64_t sFrom1970();
+
+template <class T>
+int vectorindexOf(const std::vector<T> &list,const T &item)
+{
+ const auto &r=std::find(list.cbegin(),list.cend(),item);
+ if(r==list.cend())
+ return -1;
+ else
+ return std::distance(list.cbegin(),r);
+}
+
+template <class T>
+bool vectorremoveOne(std::vector<T> &list,const T &item)
+{
+ const auto &r=std::find(list.cbegin(),list.cend(),item);
+ if(r==list.cend())
+ {
+ return false;
+ }
+ else
+ {
+ list.erase(r);
+ return true;
+ }
+}
+
+template <class T>
+bool vectorcontainsAtLeastOne(const std::vector<T> &list,const T &item)
+{
+ const auto &r=std::find(list.cbegin(),list.cend(),item);
+ if(r==list.cend())
+ return false;
+ else
+ return true;
+}
+
+template <class T>
+unsigned int vectorcontainsCount(const std::vector<T> &list,const T &item)
+{
+ return std::count(list.cbegin(), list.cend(), item);
+}
+
+template <class T, class U>
+std::vector<T> unordered_map_keys_vector(const std::unordered_map<T,U> &unordered_map_var)
+{
+ std::vector<T> keyList;
+ keyList.reserve(unordered_map_var.size());
+ for ( auto it = unordered_map_var.cbegin(); it != unordered_map_var.cend(); ++it )
+ keyList.push_back(it->first);
+ return keyList;
+}
+
+template <class T>
+unsigned int vectorRemoveEmpty(std::vector<T> &list)
+{
+ unsigned int removedEntryNumber=0;
+ for(auto it = list.begin();it != list.cend();)
+ if((*it).empty())
+ {
+ list.erase(it);
+ ++removedEntryNumber;
+ }
+ else
+ ++it;
+ return removedEntryNumber;
+}
+
+template <class T>
+size_t vectorRemoveDuplicatesForSmallList(std::vector<T> &list)
+{
+ /*unsigned int removedEntryNumber=0;
+ for(auto it = list.begin();it < list.cend()-1;)
+ {
+ const auto indexOf=std::find(it+1,list.cend(),*it);
+ if(indexOf!=list.end())
+ {
+ list.erase(indexOf);
+ ++removedEntryNumber;
+ }
+ else
+ ++it;
+ }
+ return removedEntryNumber;*/
+
+ std::unordered_set<T> s(list.cbegin(),list.cend());
+ const size_t removedEntryNumber=list.size()-s.size();
+ list=std::vector<T>(s.cbegin(),s.cend());
+ return removedEntryNumber;
+}
+
+template <class T>
+unsigned int vectorRemoveDuplicatesForBigList(std::vector<T> &list)
+{
+ std::unordered_set<T> s(list.cbegin(),list.cend());
+ const unsigned int removedEntryNumber=list.size()-s.size();
+ list=std::vector<T>(s.cbegin(),s.cend());
+ return removedEntryNumber;
+}
+
+template <class T>
+unsigned int vectorRemoveAll(std::vector<T> &list,const T &item)
+{
+ unsigned int removedEntryNumber=0;
+ unsigned int index=0;
+ while(index<list.size())
+ {
+ if(list.at(index)==item)
+ {
+ removedEntryNumber++;
+ list.erase(list.cbegin()+index);
+ }
+ else
+ index++;
+ }
+ return removedEntryNumber;
+}
+
+template <class T>
+bool vectorHaveDuplicatesForSmallList(const std::vector<T> &list)
+{
+ std::unordered_set<T> s;
+ unsigned int index=0;
+ while(index<list.size())
+ {
+ if(s.find(list.at(index))==s.cend())
+ s.insert(list.at(index));
+ else
+ return true;
+ index++;
+ }
+ return false;
+}
+
+#endif
diff --git a/cpp11additionstringtointcpp.cpp b/cpp11additionstringtointcpp.cpp
new file mode 100644
index 0000000..50a9d17
--- /dev/null
+++ b/cpp11additionstringtointcpp.cpp
@@ -0,0 +1,485 @@
+#include "cpp11addition.h"
+#include <cstdio>
+#include <stdexcept>
+
+/// \todo, check number validity by http://en.cppreference.com/w/c/string/byte/strtol
+/* to check: bool my_strtol(const std::string &str, long &v) {
+char *end = nullptr;
+v = strtol(str.c_str(), &end, 10);
+return end != nullptr;
+}*/
+
+static const std::regex isaunsignednumber("^[0-9]+$",std::regex::optimize);
+static const std::regex isasignednumber("^-?[0-9]+$",std::regex::optimize);
+static const std::regex isadouble("^-?[0-9]+(\\.[0-9]+)?$",std::regex::optimize);
+
+uint8_t stringtouint8(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ unsigned int tempValue;
+ try {
+ tempValue = std::stoul(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(tempValue<=0xFF))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #else
+ if(Q_LIKELY(std::regex_match(string,isaunsignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoul(string);
+ if(Q_LIKELY(tempValue<=0xFF))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+uint16_t stringtouint16(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ unsigned int tempValue;
+ try {
+ tempValue = std::stoul(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(tempValue<=0xFFFF))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #else
+ if(Q_LIKELY(std::regex_match(string,isaunsignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoul(string);
+ if(Q_LIKELY(tempValue<=0xFFFF))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+uint32_t stringtouint32(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ uint32_t tempValue;
+ try {
+ tempValue = std::stoul(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ #else
+ if(Q_LIKELY(std::regex_match(string,isaunsignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoull(string);
+ if(Q_LIKELY(tempValue<=0xFFFFFFFF))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+bool stringtobool(const std::string &string,bool *ok)
+{
+ if(string=="1")
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return true;
+ }
+ if(string=="0")
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return false;
+ }
+ if(string=="true" || string=="t" /*postgresql*/ || string=="TRUE")
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return true;
+ }
+ if(string=="false" || string=="f" /*postgresql*/ || string=="FALSE")
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return false;
+ }
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return false;
+}
+
+uint64_t stringtouint64(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ uint64_t tempValue;
+ try {
+ tempValue = std::stoull(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ #else
+ if(Q_LIKELY(std::regex_match(string,isaunsignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stoull(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+int8_t stringtoint8(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ int tempValue;
+ try {
+ tempValue = std::stol(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(tempValue<=0x7F && tempValue>=-0x7F))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #else
+ if(Q_LIKELY(std::regex_match(string,isasignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoi(string);
+ if(Q_LIKELY(tempValue<=0x7F))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+int16_t stringtoint16(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ int tempValue;
+ try {
+ tempValue = std::stol(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(tempValue<=0x7FFF && tempValue>=-0x7FFF))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #else
+ if(Q_LIKELY(std::regex_match(string,isasignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ const unsigned int &tempValue=std::stoi(string);
+ if(Q_LIKELY(tempValue<=0x7FFF))
+ return tempValue;
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+int32_t stringtoint32(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ int32_t tempValue;
+ try {
+ tempValue = std::stol(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ #else
+ if(Q_LIKELY(std::regex_match(string,isasignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stoi(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+int64_t stringtoint64(const std::string &string,bool *ok)
+{
+ #ifdef __EXCEPTIONS
+ int64_t tempValue;
+ try {
+ tempValue = std::stoll(string);
+ }
+ catch(...) {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(Q_LIKELY(ok!=NULL))
+ *ok=false;
+ return 0;
+ }
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return tempValue;
+ #else
+ if(Q_LIKELY(std::regex_match(string,isasignednumber)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stoll(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+ #endif
+}
+
+float stringtofloat(const std::string &string,bool *ok)
+{
+ if(Q_LIKELY(std::regex_match(string,isadouble)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stof(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+}
+
+double stringtodouble(const std::string &string,bool *ok)
+{
+ if(Q_LIKELY(std::regex_match(string,isadouble)))
+ {
+ if(Q_LIKELY(ok!=NULL))
+ *ok=true;
+ return std::stod(string);
+ }
+ else
+ {
+ #ifdef CATCHCHALLENGER_EXTRA_CHECK
+ std::cerr << "Convertion failed and repported at " << __FILE__ << ":" << __LINE__ << std::endl;
+ #endif
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+}
diff --git a/interface/FacilityInterface.h b/interface/FacilityInterface.h
new file mode 100644
index 0000000..f9b000d
--- /dev/null
+++ b/interface/FacilityInterface.h
@@ -0,0 +1,44 @@
+/** \file FacilityInterface.h
+\brief Define the class of the facility engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef FACILITY_INTERFACE_H
+#define FACILITY_INTERFACE_H
+
+#include <string>
+#include <vector>
+#include <QObject>
+
+#include "../StructEnumDefinition.h"
+
+/// \brief To define the interface, to pass the facility object from Ultracopier to the plugins without compatibility problem
+//not possible to be static, because in the plugin it's not resolved
+class FacilityInterface : public QObject
+{
+ public:
+ /// \brief To force the text re-translation
+ virtual void retranslate() = 0;
+ /// \brief convert size in Byte to String
+ virtual std::string sizeToString(const double &size) const = 0;
+ /// \brief convert size unit to String
+ virtual std::string sizeUnitToString(const Ultracopier::SizeUnit &sizeUnit) const = 0;
+ /// \brief translate the text
+ virtual std::string translateText(const std::string &text) const = 0;
+ /// \brief speed to string in byte per seconds
+ virtual std::string speedToString(const double &speed) const = 0;
+ /// \brief Decompose the time in second
+ virtual Ultracopier::TimeDecomposition secondsToTimeDecomposition(const uint32_t &seconds) const = 0;
+ /// \brief have the fonctionnality
+ virtual bool haveFunctionality(const std::string &fonctionnality) const = 0;
+ /// \brief call the fonctionnality
+ virtual std::string callFunctionality(const std::string &fonctionnality,const std::vector<std::string> &args=std::vector<std::string>()) = 0;
+ /// \brief Do the simplified time
+ virtual std::string simplifiedRemainingTime(const uint32_t &seconds) const = 0;
+ /// \brief Do the simplified time
+ virtual std::string ultimateUrl() const = 0;
+ /// \brief Return the software name
+ virtual std::string softwareName() const = 0;
+};
+
+#endif // FACILITY_INTERFACE_H
diff --git a/interface/OptionInterface.h b/interface/OptionInterface.h
new file mode 100644
index 0000000..034b49d
--- /dev/null
+++ b/interface/OptionInterface.h
@@ -0,0 +1,36 @@
+/** \file OptionInterface.h
+\brief Define the class of the option engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef OPTION_INTERFACE_H
+#define OPTION_INTERFACE_H
+
+#include <string>
+#include <vector>
+#include <utility>
+#include <QObject>
+
+#include "../StructEnumDefinition.h"
+
+/** \brief to pass the options to the plugin, the instance is created into Ultracopier from the class LocalPluginOptions()
+ * \see LocalPluginOptions()
+ * **/
+class OptionInterface : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief To add option group to options
+ virtual bool addOptionGroup(const std::vector<std::pair<std::string, std::string> > &KeysList) = 0;
+ /*/// \brief To remove option group to options, removed to the load plugin
+ virtual bool removeOptionGroup() = 0;*/
+ /// \brief To get option value
+ virtual std::string getOptionValue(const std::string &variableName) const = 0;
+ /// \brief To set option value
+ virtual void setOptionValue(const std::string &variableName,const std::string &value) = 0;
+ signals:
+ //void newOptionValue(std::string,std::string);-> disabled because the value will not externally changed, then useless notification
+ void resetOptions() const;
+};
+
+#endif // OPTION_INTERFACE_H
diff --git a/interface/PluginInterface_CopyEngine.h b/interface/PluginInterface_CopyEngine.h
new file mode 100644
index 0000000..eb5b6bc
--- /dev/null
+++ b/interface/PluginInterface_CopyEngine.h
@@ -0,0 +1,208 @@
+/** \file PluginInterface_CopyEngine.h
+\brief Define the interface of the plugin of type: copy engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGININTERFACE_COPYENGINE_H
+#define PLUGININTERFACE_COPYENGINE_H
+
+#include <QObject>
+#include <QWidget>
+#include <string>
+#include <vector>
+
+#include "OptionInterface.h"
+#include "FacilityInterface.h"
+#include "../StructEnumDefinition.h"
+
+/** \brief To define the interface between Ultracopier and the copy engine
+ * This interface support:
+ * - Multiple transfer and multiple transfer progression
+ * - Only the copy mode (source as read only)
+ * - Only manipulation of folder, file, file + folder
+ * - Change on live file size
+ * - Speed is calculated by ultracopier in using the size \see getGeneralProgression()
+ * - Support speed limitation if the engine provide it, else inform Ultracopier
+ * - File/Folder can be added interactively or not
+ * - The collision and error is managed by the plug-in to have useful information (like preview, size, date, ...)
+ * **/
+class PluginInterface_CopyEngine : public QObject
+{
+ Q_OBJECT
+ public:
+ /** \brief to send the options panel
+ * \return return false if have not the options
+ * \param tempWidget the widget to generate on it the options */
+ virtual bool getOptionsEngine(QWidget * tempWidget) = 0;
+ /** \brief to have interface widget to do modal dialog
+ * \param interface to have the widget of the interface, useful for modal dialog */
+ virtual void setInterfacePointer(QWidget * interface) = 0;
+ /** \brief compare the current sources of the copy, with the passed arguments
+ * \param sources the sources list to compares with the current sources list
+ * \return true if have same sources, else false (or empty) */
+ virtual bool haveSameSource(const std::vector<std::string> &sources) = 0;
+ /** \brief compare the current destination of the copy, with the passed arguments
+ * \param destination the destination to compares with the current destination
+ * \return true if have same destination, else false (or empty) */
+ virtual bool haveSameDestination(const std::string &destination) = 0;
+
+
+ //external soft like file browser have send copy/move list to do
+ /** \brief send copy without destination, ask the destination
+ * \param sources the sources list to copy
+ * \return true if the copy have been accepted */
+ virtual bool newCopy(const std::vector<std::string> &sources) = 0;
+ /** \brief send copy with destination
+ * \param sources the sources list to copy
+ * \param destination the destination to copy
+ * \return true if the copy have been accepted */
+ virtual bool newCopy(const std::vector<std::string> &sources,const std::string &destination) = 0;
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \return true if the move have been accepted */
+ virtual bool newMove(const std::vector<std::string> &sources) = 0;
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \param destination the destination to move
+ * \return true if the move have been accepted */
+ virtual bool newMove(const std::vector<std::string> &sources,const std::string &destination) = 0;
+ /** \brief send the new transfer list
+ * \param file the transfer list */
+ virtual void newTransferList(const std::string &file) = 0;
+
+
+ /** \brief to get byte read, use by Ultracopier for the speed calculation
+ * real size transfered to right speed calculation */
+ virtual uint64_t realByteTransfered() = 0;
+
+
+ /** \brief support speed limitation */
+ virtual bool supportSpeedLimitation() const = 0;
+
+ //transfer list
+ /** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+ virtual void syncTransferList() = 0;
+ public slots:
+ //user ask ask to add folder (add it with interface ask source/destination)
+ /** \brief add folder called on the interface
+ * Used by manual adding */
+ virtual bool userAddFolder(const Ultracopier::CopyMode &mode) = 0;
+ /** \brief add file called on the interface
+ * Used by manual adding */
+ virtual bool userAddFile(const Ultracopier::CopyMode &mode) = 0;
+
+
+ //action on the transfer
+ /// \brief put the transfer in pause
+ virtual void pause() = 0;
+ /// \brief resume the transfer
+ virtual void resume() = 0;
+ /** \brief skip one transfer entry
+ * \param id id of the file to remove */
+ virtual void skip(const uint64_t &id) = 0;
+ /// \brief cancel all the transfer
+ virtual void cancel() = 0;
+
+
+ //edit the transfer list
+ /** \brief remove the selected item
+ * \param ids ids is the id list of the selected items */
+ virtual void removeItems(const std::vector<uint64_t> &ids) = 0;
+ /** \brief move on top of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ virtual void moveItemsOnTop(const std::vector<uint64_t> &ids) = 0;
+ /** \brief move up the list the selected item
+ * \param ids ids is the id list of the selected items */
+ virtual void moveItemsUp(const std::vector<uint64_t> &ids) = 0;
+ /** \brief move down the list the selected item
+ * \param ids ids is the id list of the selected items */
+ virtual void moveItemsDown(const std::vector<uint64_t> &ids) = 0;
+ /** \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 std::vector<uint64_t> &ids) = 0;
+
+
+ /** \brief give the forced mode, to export/import transfer list */
+ virtual void forceMode(const Ultracopier::CopyMode &mode) = 0;
+ /// \brief export the transfer list into a file
+ virtual void exportTransferList() = 0;
+ /// \brief export the transfer list into a file
+ virtual void exportErrorIntoTransferList() = 0;
+ /// \brief import the transfer list into a file
+ virtual void importTransferList() = 0;
+
+
+ /** \brief to set the speed limitation
+ * -1 if not able, 0 if disabled */
+ virtual bool setSpeedLimitation(const int64_t &speedLimitation) = 0;
+ // signal to implement
+ signals:
+ //send information about the copy
+ void actionInProgess(const Ultracopier::EngineActionInProgress &engineActionInProgress) const; //should update interface information on this event
+
+ void newFolderListing(const std::string &path) const;
+ void isInPause(const bool &isInPause) const;
+
+ void newActionOnList(const std::vector<Ultracopier::ReturnActionOnCopyList>&) const;///very important, need be temporized to group the modification to do and not flood the interface
+ void doneTime(const std::vector<std::pair<uint64_t,uint32_t> >&) const;
+ void syncReady() const;
+
+ /** \brief to get the progression for a specific file
+ * \param id the id of the transfer, id send during population the transfer list
+ * first = current transfered byte, second = byte to transfer */
+ void pushFileProgression(const std::vector<Ultracopier::ProgressionItem> &progressionList) const;
+ //get information about the copy
+ /** \brief to get the general progression
+ * first = current transfered byte, second = byte to transfer */
+ void pushGeneralProgression(const uint64_t &,const uint64_t &) const;
+
+ //when the cancel is clicked on copy engine dialog
+ void cancelAll() const;
+
+ //when can be deleted
+ void canBeDeleted() const;
+
+ //send error occurred
+ void error(const std::string &path,const uint64_t &size,const uint64_t &mtime,const std::string &error) const;
+ void errorToRetry(const std::string &source,const std::string &destination,const std::string &error) const;
+ //for the extra logging
+ void rmPath(const std::string &path) const;
+ void mkPath(const std::string &path) const;
+};
+
+/// \brief To define the interface for the factory to do copy engine instance
+class PluginInterface_CopyEngineFactory : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief to get one instance
+ virtual PluginInterface_CopyEngine * getInstance() = 0;
+ /// \brief to set resources, writePath can be empty if read only mode
+ virtual void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion) = 0;
+ //get mode allowed
+ /// \brief define if can copy file, folder or both
+ virtual Ultracopier::CopyType getCopyType() = 0;
+ /// \brief define if can import/export or nothing
+ virtual Ultracopier::TransferListOperation getTransferListOperation() = 0;
+ /// \brief define if can only copy, or copy and move
+ virtual bool canDoOnlyCopy() const = 0;
+ /// \brief to get the supported protocols for the source
+ virtual std::vector<std::string> supportedProtocolsForTheSource() const = 0;
+ /// \brief to get the supported protocols for the destination
+ virtual std::vector<std::string> supportedProtocolsForTheDestination() const = 0;
+ /// \brief to get the options of the copy engine
+ virtual QWidget * options() = 0;
+ public slots:
+ /// \brief to reset the options
+ virtual void resetOptions() = 0;
+ /// \brief to reload the translation, because the new language have been loaded
+ virtual void newLanguageLoaded() = 0;
+ signals:
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+};
+
+Q_DECLARE_INTERFACE(PluginInterface_CopyEngineFactory,"first-world.info.ultracopier.PluginInterface.CopyEngineFactory/1.2.4.0");
+
+#endif // PLUGININTERFACE_COPYENGINE_H
diff --git a/interface/PluginInterface_Listener.h b/interface/PluginInterface_Listener.h
new file mode 100644
index 0000000..61acb2f
--- /dev/null
+++ b/interface/PluginInterface_Listener.h
@@ -0,0 +1,56 @@
+/** \file PluginInterface_Listener.h
+\brief Define the interface of the plugin of type: listener
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGININTERFACE_LISTENER_H
+#define PLUGININTERFACE_LISTENER_H
+
+#include <QObject>
+#include <string>
+#include <vector>
+
+#include "OptionInterface.h"
+
+#include "../StructEnumDefinition.h"
+
+/** \brief To define the interface between Ultracopier and the listener
+ * */
+class PluginInterface_Listener : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief put this plugin in listen mode
+ virtual void listen() = 0;
+ /// \brief put close the listen
+ virtual void close() = 0;
+ /// \brief to get the error string
+ virtual const std::string errorString() const = 0;
+ /// \brief set the resources for the plugin
+ virtual void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,const bool &portableVersion) = 0;
+ /// \brief to get the options widget, NULL if not have
+ virtual QWidget * options() = 0;
+ /// \brief to get a client list
+ virtual std::vector<std::string> clientsList() const = 0;
+ public slots:
+ /// \brief send when copy is finished
+ virtual void transferFinished(const uint32_t &orderId,const bool &withError) = 0;
+ /// \brief send when copy is canceled
+ virtual void transferCanceled(const uint32_t &orderId) = 0;
+ /// \brief to reload the translation, because the new language have been loaded
+ virtual void newLanguageLoaded() = 0;
+ signals:
+ void newState(const Ultracopier::ListeningState &state) const;
+ void newCopyWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources) const;
+ void newCopy(const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination) const;
+ void newMoveWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources) const;
+ void newMove(const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination) const;
+ void error(const std::string &error) const;
+ void newClientList() const;
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+};
+
+Q_DECLARE_INTERFACE(PluginInterface_Listener,"first-world.info.ultracopier.PluginInterface.Listener/1.2.4.0");
+
+#endif // PLUGININTERFACE_LISTENER_H
diff --git a/interface/PluginInterface_PluginLoader.h b/interface/PluginInterface_PluginLoader.h
new file mode 100644
index 0000000..c702003
--- /dev/null
+++ b/interface/PluginInterface_PluginLoader.h
@@ -0,0 +1,39 @@
+/** \file PluginInterface_PluginLoader.h
+\brief Define the interface of the plugin of type: plugin loader
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGININTERFACE_PLUGINLOADER_H
+#define PLUGININTERFACE_PLUGINLOADER_H
+
+#include <string>
+
+#include "OptionInterface.h"
+
+#include "../StructEnumDefinition.h"
+
+/** \brief To define the interface between Ultracopier and the plugin loader
+ * */
+class PluginInterface_PluginLoader : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief try enable/disable the catching
+ virtual void setEnabled(const bool &enabled) = 0;
+ /// \brief to set resources, writePath can be empty if read only mode
+ virtual void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,const 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(const Ultracopier::CatchState &catchstate) const;
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+};
+
+Q_DECLARE_INTERFACE(PluginInterface_PluginLoader,"first-world.info.ultracopier.PluginInterface.PluginLoader/1.2.4.0");
+
+#endif // PLUGININTERFACE_PLUGINLOADER_H
diff --git a/interface/PluginInterface_SessionLoader.h b/interface/PluginInterface_SessionLoader.h
new file mode 100644
index 0000000..d0cd366
--- /dev/null
+++ b/interface/PluginInterface_SessionLoader.h
@@ -0,0 +1,39 @@
+/** \file PluginInterface_SessionLoader.h
+\brief Define the interface of the plugin of type: session loader
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGININTERFACE_SESSIONLOADER_H
+#define PLUGININTERFACE_SESSIONLOADER_H
+
+#include <string>
+
+#include "OptionInterface.h"
+
+#include "../StructEnumDefinition.h"
+
+/** \brief To define the interface between Ultracopier and the session loader
+ * */
+class PluginInterface_SessionLoader : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief set enabled/disabled
+ virtual void setEnabled(const bool &enabled) = 0;
+ /// \brief get if is enabled
+ virtual bool getEnabled() const = 0;
+ /// \brief set the resources
+ virtual void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,const 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;
+ signals:
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+};
+
+Q_DECLARE_INTERFACE(PluginInterface_SessionLoader,"first-world.info.ultracopier.PluginInterface.SessionLoader/1.2.4.0");
+
+#endif // PLUGININTERFACE_SESSIONLOADER_H
diff --git a/interface/PluginInterface_Themes.h b/interface/PluginInterface_Themes.h
new file mode 100644
index 0000000..7272c79
--- /dev/null
+++ b/interface/PluginInterface_Themes.h
@@ -0,0 +1,115 @@
+/** \file PluginInterface_Themes.h
+\brief Define the interface of the plugin of type: copy engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGININTERFACE_THEMES_H
+#define PLUGININTERFACE_THEMES_H
+
+#include <vector>
+#include <string>
+#include <QObject>
+#include <QWidget>
+#include <utility>
+#include <QIcon>
+
+#include "OptionInterface.h"
+#include "FacilityInterface.h"
+#include "../StructEnumDefinition.h"
+
+/** \brief To define the interface between Ultracopier and the interface
+ * */
+class PluginInterface_Themes : public QWidget
+{
+ Q_OBJECT
+ public slots:
+ //send information about the copy
+ /// \brief to set the action in progress
+ virtual void actionInProgess(const Ultracopier::EngineActionInProgress&) = 0;
+
+ /// \brief the new folder is listing
+ virtual void newFolderListing(const std::string &path) = 0;
+ /** \brief show the detected speed
+ * in byte per seconds */
+ virtual void detectedSpeed(const uint64_t &speed) = 0;
+ /** \brief show the remaining time
+ * time in seconds */
+ virtual void remainingTime(const int &remainingSeconds) = 0;
+ /// \brief set one error is detected
+ virtual void errorDetected() = 0;
+ /// \brief new error
+ virtual void errorToRetry(const std::string &source,const std::string &destination,const std::string &error) = 0;
+ /** \brief support speed limitation */
+ virtual void setSupportSpeedLimitation(const bool &supportSpeedLimitationBool) = 0;
+ /// \brief get action on the transfer list (add/move/remove)
+ virtual void getActionOnList(const std::vector<Ultracopier::ReturnActionOnCopyList> &returnActions) = 0;
+ /// \brief show the general progression
+ virtual void setGeneralProgression(const uint64_t &current,const uint64_t &total) = 0;
+ /// \brief show the file progression
+ virtual void setFileProgression(const std::vector<Ultracopier::ProgressionItem> &progressionList) = 0;
+ public:
+ /// \brief get the widget for the copy engine
+ virtual QWidget * getOptionsEngineWidget() = 0;
+ /// \brief to set if the copy engine is found
+ virtual void getOptionsEngineEnabled(const bool &isEnabled) = 0;
+ /// \brief set the copyType -> file or folder
+ virtual void setCopyType(const Ultracopier::CopyType&) = 0;
+ /// \brief set the copyMove -> copy or move, to force in copy or move, else support both
+ virtual void forceCopyMode(const Ultracopier::CopyMode&) = 0;
+ /// \brief set if transfer list is exportable/importable
+ virtual void setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation) = 0;
+ /** \brief set if the order is external (like file manager copy)
+ * to notify the interface, which can hide add folder/filer button */
+ virtual void haveExternalOrder() = 0;
+ /// \brief set if is in pause
+ virtual void isInPause(const bool &isInPause) = 0;
+ // signal to implement
+ signals:
+ //set the transfer list
+ void removeItems(const std::vector<uint64_t> &ids) const;
+ void moveItemsOnTop(const std::vector<uint64_t> &ids) const;
+ void moveItemsUp(const std::vector<uint64_t> &ids) const;
+ void moveItemsDown(const std::vector<uint64_t> &ids) const;
+ void moveItemsOnBottom(const std::vector<uint64_t> &ids) const;
+ void exportTransferList() const;
+ void importTransferList() const;
+ void exportErrorIntoTransferList() const;
+ //user ask ask to add folder (add it with interface ask source/destination)
+ void userAddFolder(const Ultracopier::CopyMode &mode) const;
+ void userAddFile(const Ultracopier::CopyMode &mode) const;
+ void urlDropped(const std::vector<std::string> &urls) const;
+ //action on the copy
+ void pause() const;
+ void resume() const;
+ void skip(const uint64_t &id) const;
+ void cancel() const;
+ //edit the action
+ void newSpeedLimitation(const uint64_t &speedLimitation) const;///< -1 if not able, 0 if disabled
+};
+
+/// \brief To define the interface for the factory to do themes instance
+class PluginInterface_ThemesFactory : public QObject
+{
+ Q_OBJECT
+ public:
+ /// \brief to get one instance
+ virtual PluginInterface_Themes * getInstance() = 0;
+ /// \brief to set resources, writePath can be empty if read only mode
+ virtual void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion) = 0;
+ /// \brief to get the default options widget
+ virtual QWidget * options() = 0;
+ /// \brief to get a resource icon
+ virtual QIcon getIcon(const std::string &fileName) const = 0;
+ public slots:
+ /// \brief to reset as default the local options
+ virtual void resetOptions() = 0;
+ /// \brief retranslate the language because the language have changed
+ virtual void newLanguageLoaded() = 0;
+ signals:
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+};
+
+Q_DECLARE_INTERFACE(PluginInterface_ThemesFactory,"first-world.info.ultracopier.PluginInterface.ThemesFactory/1.2.4.0");
+
+#endif // PLUGININTERFACE_THEMES_H
diff --git a/lib/qt-tar-xz/QTarDecode.cpp b/lib/qt-tar-xz/QTarDecode.cpp
new file mode 100644
index 0000000..10c38ca
--- /dev/null
+++ b/lib/qt-tar-xz/QTarDecode.cpp
@@ -0,0 +1,174 @@
+/** \file QTarDecode.cpp
+\brief To read a tar data block
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "QTarDecode.h"
+
+#include <inttypes.h>
+#include <regex>
+#include <cstring>
+#include <iostream>
+
+static const std::regex isaunsignednumber("^[0-9]+$",std::regex::optimize);
+static const std::regex isaunoctalnumber("^[0-7]+$",std::regex::optimize);
+//static const char* const lut = "0123456789ABCDEF";
+
+QTarDecode::QTarDecode()
+{
+ error="Unknown error";
+}
+
+uint64_t QTarDecode::octaltouint64(const std::string &string,bool *ok)
+{
+ if(std::regex_match(string,isaunsignednumber))
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return std::stoi(string,0,8);
+ }
+ else
+ {
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+}
+
+uint64_t QTarDecode::stringtouint64(const std::string &string,bool *ok)
+{
+ if(std::regex_match(string,isaunsignednumber))
+ {
+ if(ok!=NULL)
+ *ok=true;
+ return std::stoull(string);
+ }
+ else
+ {
+ if(ok!=NULL)
+ *ok=false;
+ return 0;
+ }
+}
+
+std::string QTarDecode::errorString()
+{
+ return error;
+}
+
+void QTarDecode::setErrorString(const std::string &error)
+{
+ this->error=error;
+ fileList.clear();
+ dataList.clear();
+}
+
+bool QTarDecode::stringStartWith(std::string const &fullString, std::string const &starting)
+{
+ if (fullString.length() >= starting.length()) {
+ return (fullString.substr(0,starting.length())==starting);
+ } else {
+ return false;
+ }
+}
+
+bool QTarDecode::decodeData(const std::vector<char> &data)
+{
+ setErrorString("Unknown error");
+ if(data.size()<1024)
+ return false;
+ unsigned int offset=0;
+ while(offset<data.size())
+ {
+ //load the file name from ascii, from 0+offset with size of 100
+ std::string fileName(data.data()+offset,100);
+ while(!fileName.empty() && fileName.at(fileName.size()-1)==0x00)
+ fileName.resize(fileName.size()-1);
+ //load the file type
+ std::string fileType(data.data()+156+offset,1);
+ while(!fileName.empty() && fileType.at(fileType.size()-1)==0x00)
+ fileType.resize(fileType.size()-1);
+ //load the ustar string
+ std::string ustar(data.data()+257+offset,5);
+ while(!fileName.empty() && ustar.at(ustar.size()-1)==0x00)
+ ustar.resize(ustar.size()-1);
+ //load the ustar version
+ std::string ustarVersion(data.data()+263+offset,2);
+ while(!fileName.empty() && ustarVersion.at(ustarVersion.size()-1)==0x00)
+ ustarVersion.resize(ustarVersion.size()-1);
+ bool ok=false;
+ //load the file size from ascii, from 124+offset with size of 12
+ uint64_t finalSize=0;
+ std::string sizeString(data.data()+124+offset,12);
+ if(sizeString.at(sizeString.size()-1)==0x00)
+ {
+ //the size is in octal base
+ sizeString.resize(sizeString.size()-1);
+ finalSize=octaltouint64(sizeString,&ok);
+ }
+ else
+ finalSize=stringtouint64(sizeString,&ok);
+ //if the size conversion to qulonglong have failed, then qui with error
+ if(ok==false)
+ {
+ //it's the end of the archive, no more verification
+ break;
+ }
+ //if check if the ustar not found
+ if(ustar!="ustar")
+ {
+ setErrorString("\"ustar\" string not found at "+std::to_string(257+offset)+", content: \""+ustar+"\"");
+ return false;
+ }
+ if(ustarVersion!="00")
+ {
+ setErrorString("ustar version string is wrong, content:\""+ustarVersion+"\"");
+ return false;
+ }
+ //check if the file have the good size for load the data
+ if((offset+512+finalSize)>data.size())
+ {
+ setErrorString("The tar file seem be too short");
+ return false;
+ }
+ if(fileType=="0") //this code manage only the file, then only the file is returned
+ {
+ std::vector<char> newdata;
+ newdata.resize(finalSize);
+ memcpy(newdata.data(),data.data()+512+offset,finalSize);
+ fileList.push_back(fileName);
+ dataList.push_back(newdata);
+ }
+ //calculate the offset for the next header
+ bool retenu=((finalSize%512)!=0);
+ //go to the next header
+ offset+=512+(finalSize/512+retenu)*512;
+ }
+ if(fileList.size()>0)
+ {
+ std::string baseDirToTest=fileList.at(0);
+ std::size_t found = baseDirToTest.find_last_of("/");
+ if(found!=std::string::npos && found>=baseDirToTest.size())
+ baseDirToTest.resize(baseDirToTest.size()-(baseDirToTest.size()-found));
+ bool isFoundForAllEntries=true;
+ for (unsigned int i = 0; i < fileList.size(); ++i)
+ if(!stringStartWith(fileList.at(i),baseDirToTest))
+ isFoundForAllEntries=false;
+ if(isFoundForAllEntries)
+ for (unsigned int i = 0; i < fileList.size(); ++i)
+ fileList[i].erase(0,baseDirToTest.size());
+ }
+ return true;
+}
+
+std::vector<std::string> QTarDecode::getFileList()
+{
+ return fileList;
+}
+
+std::vector<std::vector<char> > QTarDecode::getDataList()
+{
+ return dataList;
+}
+
+
diff --git a/lib/qt-tar-xz/QTarDecode.h b/lib/qt-tar-xz/QTarDecode.h
new file mode 100644
index 0000000..b37dc0e
--- /dev/null
+++ b/lib/qt-tar-xz/QTarDecode.h
@@ -0,0 +1,36 @@
+/** \file QTarDecode.h
+\brief To read a tar data block
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef QTARDECODE_H
+#define QTARDECODE_H
+
+#include <vector>
+#include <string>
+#include <string>
+
+/// \brief read the raw tar data, and organize it into data structure
+class QTarDecode
+{
+ public:
+ QTarDecode();
+ /// \brief to get the file list
+ std::vector<std::string> getFileList();
+ /// \brief to get the data of the file
+ std::vector<std::vector<char> > getDataList();
+ /// \brief to pass the raw tar data
+ bool decodeData(const std::vector<char> &data);
+ /// \brief to return error string
+ std::string errorString();
+ uint64_t stringtouint64(const std::string &string,bool *ok);
+ uint64_t octaltouint64(const std::string &string,bool *ok);
+ private:
+ std::vector<std::string> fileList;
+ std::vector<std::vector<char> > dataList;
+ std::string error;
+ void setErrorString(const std::string &error);
+ bool stringStartWith(std::string const &fullString, std::string const &starting);
+};
+
+#endif // QTARDECODE_H
diff --git a/lib/qt-tar-xz/QXzDecode.cpp b/lib/qt-tar-xz/QXzDecode.cpp
new file mode 100644
index 0000000..005ce10
--- /dev/null
+++ b/lib/qt-tar-xz/QXzDecode.cpp
@@ -0,0 +1,146 @@
+/** \file QXzDecode.cpp
+\brief To decompress a xz stream
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "QXzDecode.h"
+#include <QDebug>
+extern "C" {
+#include "xz.h"
+}
+
+static uint8_t in[BUFSIZ];
+static uint8_t out[BUFSIZ];
+
+QXzDecode::QXzDecode(QByteArray data,quint64 maxSize)
+{
+ error="Unknow error";
+ this->data=data;
+ this->maxSize=maxSize;
+ isDecoded=false;
+}
+
+bool QXzDecode::decodeStream(QDataStream *stream_xz_decode_in,QDataStream *stream_xz_decode_out)
+{
+ isDecoded=false;
+ struct xz_buf b;
+ struct xz_dec *s;
+ enum xz_ret ret;
+
+ xz_crc32_init();
+
+ /*
+ * Support up to 64 MiB dictionary. The actually needed memory
+ * is allocated once the headers have been parsed.
+ */
+ s = xz_dec_init(XZ_DYNALLOC, 1 << 26);
+ if (s == NULL) {
+ error=tr("Memory allocation failed");
+ xz_dec_end(s);
+ return isDecoded;
+ }
+
+ b.in = in;
+ b.in_pos = 0;
+ b.in_size = 0;
+ b.out = out;
+ b.out_pos = 0;
+ b.out_size = BUFSIZ;
+
+ while (true) {
+ //input of data
+ if (b.in_pos == b.in_size) {
+ b.in_size = stream_xz_decode_in->readRawData((char *)in,sizeof(in));
+ b.in_pos = 0;
+ }
+
+ ret = xz_dec_run(s, &b);
+
+ //output of data
+ if (b.out_pos == sizeof(out))
+ {
+ if (static_cast<size_t>(stream_xz_decode_out->writeRawData((char *)out,static_cast<int>(b.out_pos))) != b.out_pos)
+ {
+ error=tr("Write error");
+ xz_dec_end(s);
+ return isDecoded;
+ }
+ b.out_pos = 0;
+ }
+
+ if (ret == XZ_OK)
+ continue;
+
+#ifdef XZ_DEC_ANY_CHECK
+ if (ret == XZ_UNSUPPORTED_CHECK) {
+ continue;
+ }
+#endif
+
+ if (static_cast<size_t>(stream_xz_decode_out->writeRawData((char *)out,static_cast<int>(b.out_pos))) != b.out_pos)
+ {
+ error=tr("Write error");
+ xz_dec_end(s);
+ return isDecoded;
+ }
+
+ switch (ret) {
+ case XZ_STREAM_END:
+ xz_dec_end(s);
+ isDecoded=true;
+ return isDecoded;
+ case XZ_MEM_ERROR:
+ error=tr("Memory allocation failed");
+ xz_dec_end(s);
+ return isDecoded;
+ case XZ_MEMLIMIT_ERROR:
+ error=tr("Memory usage limit reached");
+ xz_dec_end(s);
+ return isDecoded;
+ case XZ_FORMAT_ERROR:
+ error=tr("Not a .xz file");
+ xz_dec_end(s);
+ return isDecoded;
+ case XZ_OPTIONS_ERROR:
+ error=tr("Unsupported options in the .xz headers");
+ xz_dec_end(s);
+ return isDecoded;
+ case XZ_DATA_ERROR:
+ case XZ_BUF_ERROR:
+ error=tr("The file is corrupted");
+ xz_dec_end(s);
+ return isDecoded;
+ default:
+ error=tr("Bug!");
+ xz_dec_end(s);
+ return isDecoded;
+ }
+ }
+}
+
+bool QXzDecode::decode()
+{
+ if(data.size() < 32) // check the minimal size
+ error=tr("The input data is too short");
+ QByteArray outputData;
+ QDataStream stream_xz_decode_in(&data,QIODevice::ReadOnly);
+ QDataStream stream_xz_decode_out(&outputData,QIODevice::WriteOnly);
+ int returnVal=decodeStream(&stream_xz_decode_in,&stream_xz_decode_out);
+ data=outputData;
+ return returnVal;
+}
+
+QByteArray QXzDecode::decodedData()
+{
+ if(isDecoded)
+ return data;
+ else
+ return QByteArray();
+}
+
+QString QXzDecode::errorString()
+{
+ return error;
+}
+
+
diff --git a/lib/qt-tar-xz/QXzDecode.h b/lib/qt-tar-xz/QXzDecode.h
new file mode 100644
index 0000000..85cb04e
--- /dev/null
+++ b/lib/qt-tar-xz/QXzDecode.h
@@ -0,0 +1,40 @@
+/** \file QXzDecode.h
+\brief To decompress a xz stream
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef QXZDECODE_H
+#define QXZDECODE_H
+
+#include <QObject>
+#include <QByteArray>
+#include <QDataStream>
+
+//comment this to check integrity of compressed file, compressed via: xz --check=crc32 YourFile
+//#define XZ_DEC_ANY_CHECK
+
+/// \brief The decode class for the xz stream
+class QXzDecode : public QObject
+{
+ public:
+ /** \brief create the object to decode it
+ * \param data the compressed data
+ * \param maxSize the max size
+ * **/
+ QXzDecode(QByteArray data,quint64 maxSize=0);
+ /// \brief lunch the decode
+ bool decode();
+ /// \brief the error string
+ QString errorString();
+ /// \brief the un-compressed data
+ QByteArray decodedData();
+ /// \brief un-compress the data by stream
+ bool decodeStream(QDataStream *stream_xz_decode_in,QDataStream *stream_xz_decode_out);
+ private:
+ QByteArray data;
+ QString error;
+ bool isDecoded;
+ quint64 maxSize;
+};
+
+#endif // QXZDECODE_H
diff --git a/lib/qt-tar-xz/QXzDecodeThread.cpp b/lib/qt-tar-xz/QXzDecodeThread.cpp
new file mode 100644
index 0000000..5e7f755
--- /dev/null
+++ b/lib/qt-tar-xz/QXzDecodeThread.cpp
@@ -0,0 +1,48 @@
+/** \file QXzDecodeThread.cpp
+\brief To have thread to decode the data
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "QXzDecodeThread.h"
+
+QXzDecodeThread::QXzDecodeThread()
+{
+ moveToThread(this);
+ DataToDecode=NULL;
+ error=false;
+}
+
+QXzDecodeThread::~QXzDecodeThread()
+{
+ if(DataToDecode!=NULL)
+ delete DataToDecode;
+}
+
+void QXzDecodeThread::setData(QByteArray data,quint64 maxSize)
+{
+ if(DataToDecode!=NULL)
+ delete DataToDecode;
+ DataToDecode=new QXzDecode(data,maxSize);
+}
+
+bool QXzDecodeThread::errorFound()
+{
+ return error;
+}
+
+QString QXzDecodeThread::errorString()
+{
+ return DataToDecode->errorString();
+}
+
+QByteArray QXzDecodeThread::decodedData()
+{
+ return DataToDecode->decodedData();
+}
+
+void QXzDecodeThread::run()
+{
+ error=!DataToDecode->decode();
+ emit decodedIsFinish();
+}
+
diff --git a/lib/qt-tar-xz/QXzDecodeThread.h b/lib/qt-tar-xz/QXzDecodeThread.h
new file mode 100644
index 0000000..1b69e4a
--- /dev/null
+++ b/lib/qt-tar-xz/QXzDecodeThread.h
@@ -0,0 +1,37 @@
+/** \file QXzDecodeThread.h
+\brief To have thread to decode the data
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef QXZDECODETHREAD_H
+#define QXZDECODETHREAD_H
+
+#include <QThread>
+#include "QXzDecode.h"
+
+/// \brief to decode the xz via a thread
+class QXzDecodeThread : public QThread
+{
+ Q_OBJECT
+ public:
+ QXzDecodeThread();
+ ~QXzDecodeThread();
+ /// \brief to return if the error have been found
+ bool errorFound();
+ /// \brief to return the error string
+ QString errorString();
+ /// \brief to get the decoded data
+ QByteArray decodedData();
+ /// \brief to send the data
+ void setData(QByteArray data,quint64 maxSize=0);
+ protected:
+ void run();
+ private:
+ /// \brief to have temporary storage
+ QXzDecode *DataToDecode;
+ bool error;
+ signals:
+ void decodedIsFinish();
+};
+
+#endif // QXZDECODETHREAD_H
diff --git a/lib/qt-tar-xz/xz.h b/lib/qt-tar-xz/xz.h
new file mode 100644
index 0000000..470f6df
--- /dev/null
+++ b/lib/qt-tar-xz/xz.h
@@ -0,0 +1,273 @@
+/*
+ * XZ decompressor
+ *
+ * Authors: Lasse Collin <lasse.collin@tukaani.org>
+ * Igor Pavlov <http://7-zip.org/>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#define XZ_DEC_ANY_CHECK
+
+#ifndef XZ_H
+#define XZ_H
+
+#ifdef __KERNEL__
+# include <linux/stddef.h>
+# include <linux/types.h>
+#else
+# include <stddef.h>
+# include <stdint.h>
+#endif
+
+/* In Linux, this is used to make extern functions static when needed. */
+#ifndef XZ_EXTERN
+# define XZ_EXTERN extern
+#endif
+
+/* In Linux, this is used to mark the functions with __init when needed. */
+#ifndef XZ_FUNC
+# define XZ_FUNC
+#endif
+
+/**
+ * enum xz_mode - Operation mode
+ *
+ * @XZ_SINGLE: Single-call mode. This uses less RAM than
+ * than multi-call modes, because the LZMA2
+ * dictionary doesn't need to be allocated as
+ * part of the decoder state. All required data
+ * structures are allocated at initialization,
+ * so xz_dec_run() cannot return XZ_MEM_ERROR.
+ * @XZ_PREALLOC: Multi-call mode with preallocated LZMA2
+ * dictionary buffer. All data structures are
+ * allocated at initialization, so xz_dec_run()
+ * cannot return XZ_MEM_ERROR.
+ * @XZ_DYNALLOC: Multi-call mode. The LZMA2 dictionary is
+ * allocated once the required size has been
+ * parsed from the stream headers. If the
+ * allocation fails, xz_dec_run() will return
+ * XZ_MEM_ERROR.
+ *
+ * It is possible to enable support only for a subset of the above
+ * modes at compile time by defining XZ_DEC_SINGLE, XZ_DEC_PREALLOC,
+ * or XZ_DEC_DYNALLOC. The xz_dec kernel module is always compiled
+ * with support for all operation modes, but the preboot code may
+ * be built with fewer features to minimize code size.
+ */
+enum xz_mode {
+ XZ_SINGLE,
+ XZ_PREALLOC,
+ XZ_DYNALLOC
+};
+
+/**
+ * enum xz_ret - Return codes
+ * @XZ_OK: Everything is OK so far. More input or more
+ * output space is required to continue. This
+ * return code is possible only in multi-call mode
+ * (XZ_PREALLOC or XZ_DYNALLOC).
+ * @XZ_STREAM_END: Operation finished successfully.
+ * @XZ_UNSUPPORTED_CHECK: Integrity check type is not supported. Decoding
+ * is still possible in multi-call mode by simply
+ * calling xz_dec_run() again.
+ * NOTE: This return value is used only if
+ * XZ_DEC_ANY_CHECK was defined at build time,
+ * which is not used in the kernel. Unsupported
+ * check types return XZ_OPTIONS_ERROR if
+ * XZ_DEC_ANY_CHECK was not defined at build time.
+ * @XZ_MEM_ERROR: Allocating memory failed. This return code is
+ * possible only if the decoder was initialized
+ * with XZ_DYNALLOC. The amount of memory that was
+ * tried to be allocated was no more than the
+ * dict_max argument given to xz_dec_init().
+ * @XZ_MEMLIMIT_ERROR: A bigger LZMA2 dictionary would be needed than
+ * allowed by the dict_max argument given to
+ * xz_dec_init(). This return value is possible
+ * only in multi-call mode (XZ_PREALLOC or
+ * XZ_DYNALLOC); the single-call mode (XZ_SINGLE)
+ * ignores the dict_max argument.
+ * @XZ_FORMAT_ERROR: File format was not recognized (wrong magic
+ * bytes).
+ * @XZ_OPTIONS_ERROR: This implementation doesn't support the requested
+ * compression options. In the decoder this means
+ * that the header CRC32 matches, but the header
+ * itself specifies something that we don't support.
+ * @XZ_DATA_ERROR: Compressed data is corrupt.
+ * @XZ_BUF_ERROR: Cannot make any progress. Details are slightly
+ * different between multi-call and single-call
+ * mode; more information below.
+ *
+ * In multi-call mode, XZ_BUF_ERROR is returned when two consecutive calls
+ * to XZ code cannot consume any input and cannot produce any new output.
+ * This happens when there is no new input available, or the output buffer
+ * is full while at least one output byte is still pending. Assuming your
+ * code is not buggy, you can get this error only when decoding a compressed
+ * stream that is truncated or otherwise corrupt.
+ *
+ * In single-call mode, XZ_BUF_ERROR is returned only when the output buffer
+ * is too small, or the compressed input is corrupt in a way that makes the
+ * decoder produce more output than the caller expected. When it is
+ * (relatively) clear that the compressed input is truncated, XZ_DATA_ERROR
+ * is used instead of XZ_BUF_ERROR.
+ */
+enum xz_ret {
+ XZ_OK,
+ XZ_STREAM_END,
+ XZ_UNSUPPORTED_CHECK,
+ XZ_MEM_ERROR,
+ XZ_MEMLIMIT_ERROR,
+ XZ_FORMAT_ERROR,
+ XZ_OPTIONS_ERROR,
+ XZ_DATA_ERROR,
+ XZ_BUF_ERROR
+};
+
+/**
+ * struct xz_buf - Passing input and output buffers to XZ code
+ * @in: Beginning of the input buffer. This may be NULL if and only
+ * if in_pos is equal to in_size.
+ * @in_pos: Current position in the input buffer. This must not exceed
+ * in_size.
+ * @in_size: Size of the input buffer
+ * @out: Beginning of the output buffer. This may be NULL if and only
+ * if out_pos is equal to out_size.
+ * @out_pos: Current position in the output buffer. This must not exceed
+ * out_size.
+ * @out_size: Size of the output buffer
+ *
+ * Only the contents of the output buffer from out[out_pos] onward, and
+ * the variables in_pos and out_pos are modified by the XZ code.
+ */
+struct xz_buf {
+ const uint8_t *in;
+ size_t in_pos;
+ size_t in_size;
+
+ uint8_t *out;
+ size_t out_pos;
+ size_t out_size;
+};
+
+/**
+ * struct xz_dec - Opaque type to hold the XZ decoder state
+ */
+struct xz_dec;
+
+/**
+ * xz_dec_init() - Allocate and initialize a XZ decoder state
+ * @mode: Operation mode
+ * @dict_max: Maximum size of the LZMA2 dictionary (history buffer) for
+ * multi-call decoding. This is ignored in single-call mode
+ * (mode == XZ_SINGLE). LZMA2 dictionary is always 2^n bytes
+ * or 2^n + 2^(n-1) bytes (the latter sizes are less common
+ * in practice), so other values for dict_max don't make sense.
+ * In the kernel, dictionary sizes of 64 KiB, 128 KiB, 256 KiB,
+ * 512 KiB, and 1 MiB are probably the only reasonable values,
+ * except for kernel and initramfs images where a bigger
+ * dictionary can be fine and useful.
+ *
+ * Single-call mode (XZ_SINGLE): xz_dec_run() decodes the whole stream at
+ * once. The caller must provide enough output space or the decoding will
+ * fail. The output space is used as the dictionary buffer, which is why
+ * there is no need to allocate the dictionary as part of the decoder's
+ * internal state.
+ *
+ * Because the output buffer is used as the workspace, streams encoded using
+ * a big dictionary are not a problem in single-call mode. It is enough that
+ * the output buffer is big enough to hold the actual uncompressed data; it
+ * can be smaller than the dictionary size stored in the stream headers.
+ *
+ * Multi-call mode with preallocated dictionary (XZ_PREALLOC): dict_max bytes
+ * of memory is preallocated for the LZMA2 dictionary. This way there is no
+ * risk that xz_dec_run() could run out of memory, since xz_dec_run() will
+ * never allocate any memory. Instead, if the preallocated dictionary is too
+ * small for decoding the given input stream, xz_dec_run() will return
+ * XZ_MEMLIMIT_ERROR. Thus, it is important to know what kind of data will be
+ * decoded to avoid allocating excessive amount of memory for the dictionary.
+ *
+ * Multi-call mode with dynamically allocated dictionary (XZ_DYNALLOC):
+ * dict_max specifies the maximum allowed dictionary size that xz_dec_run()
+ * may allocate once it has parsed the dictionary size from the stream
+ * headers. This way excessive allocations can be avoided while still
+ * limiting the maximum memory usage to a sane value to prevent running the
+ * system out of memory when decompressing streams from untrusted sources.
+ *
+ * On success, xz_dec_init() returns a pointer to struct xz_dec, which is
+ * ready to be used with xz_dec_run(). If memory allocation fails,
+ * xz_dec_init() returns NULL.
+ */
+XZ_EXTERN struct xz_dec * XZ_FUNC xz_dec_init(
+ enum xz_mode mode, uint32_t dict_max);
+
+/**
+ * xz_dec_run() - Run the XZ decoder
+ * @s: Decoder state allocated using xz_dec_init()
+ * @b: Input and output buffers
+ *
+ * The possible return values depend on build options and operation mode.
+ * See enum xz_ret for details.
+ *
+ * NOTE: If an error occurs in single-call mode (return value is not
+ * XZ_STREAM_END), b->in_pos and b->out_pos are not modified, and the
+ * contents of the output buffer from b->out[b->out_pos] onward are
+ * undefined. This is true even after XZ_BUF_ERROR, because with some filter
+ * chains, there may be a second pass over the output buffer, and this pass
+ * cannot be properly done if the output buffer is truncated. Thus, you
+ * cannot give the single-call decoder a too small buffer and then expect to
+ * get that amount valid data from the beginning of the stream. You must use
+ * the multi-call decoder if you don't want to uncompress the whole stream.
+ */
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_run(struct xz_dec *s, struct xz_buf *b);
+
+/**
+ * xz_dec_reset() - Reset an already allocated decoder state
+ * @s: Decoder state allocated using xz_dec_init()
+ *
+ * This function can be used to reset the multi-call decoder state without
+ * freeing and reallocating memory with xz_dec_end() and xz_dec_init().
+ *
+ * In single-call mode, xz_dec_reset() is always called in the beginning of
+ * xz_dec_run(). Thus, explicit call to xz_dec_reset() is useful only in
+ * multi-call mode.
+ */
+XZ_EXTERN void XZ_FUNC xz_dec_reset(struct xz_dec *s);
+
+/**
+ * xz_dec_end() - Free the memory allocated for the decoder state
+ * @s: Decoder state allocated using xz_dec_init(). If s is NULL,
+ * this function does nothing.
+ */
+XZ_EXTERN void XZ_FUNC xz_dec_end(struct xz_dec *s);
+
+/*
+ * Standalone build (userspace build or in-kernel build for boot time use)
+ * needs a CRC32 implementation. For normal in-kernel use, kernel's own
+ * CRC32 module is used instead, and users of this module don't need to
+ * care about the functions below.
+ */
+#ifndef XZ_INTERNAL_CRC32
+# ifdef __KERNEL__
+# define XZ_INTERNAL_CRC32 0
+# else
+# define XZ_INTERNAL_CRC32 1
+# endif
+#endif
+
+#if XZ_INTERNAL_CRC32
+/*
+ * This must be called before any other xz_* function to initialize
+ * the CRC32 lookup table.
+ */
+XZ_EXTERN void XZ_FUNC xz_crc32_init(void);
+
+/*
+ * Update CRC32 value using the polynomial from IEEE-802.3. To start a new
+ * calculation, the third argument must be zero. To continue the calculation,
+ * the previously returned value is passed as the third argument.
+ */
+XZ_EXTERN uint32_t XZ_FUNC xz_crc32(
+ const uint8_t *buf, size_t size, uint32_t crc);
+#endif
+#endif
diff --git a/lib/qt-tar-xz/xz_config.h b/lib/qt-tar-xz/xz_config.h
new file mode 100644
index 0000000..9d714f3
--- /dev/null
+++ b/lib/qt-tar-xz/xz_config.h
@@ -0,0 +1,123 @@
+/*
+ * Private includes and definitions for userspace use of XZ Embedded
+ *
+ * Author: Lasse Collin <lasse.collin@tukaani.org>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#ifndef XZ_CONFIG_H
+#define XZ_CONFIG_H
+
+/* Uncomment as needed to enable BCJ filter decoders. */
+/* #define XZ_DEC_X86 */
+/* #define XZ_DEC_POWERPC */
+/* #define XZ_DEC_IA64 */
+/* #define XZ_DEC_ARM */
+/* #define XZ_DEC_ARMTHUMB */
+/* #define XZ_DEC_SPARC */
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xz.h"
+
+#define kmalloc(size, flags) malloc(size)
+#define kfree(ptr) free(ptr)
+#define vmalloc(size) malloc(size)
+#define vfree(ptr) free(ptr)
+
+#define memeq(a, b, size) (memcmp(a, b, size) == 0)
+#define memzero(buf, size) memset(buf, 0, size)
+
+#ifndef min
+# define min(x, y) ((x) < (y) ? (x) : (y))
+#endif
+#define min_t(type, x, y) min(x, y)
+
+/*
+ * Some functions have been marked with __always_inline to keep the
+ * performance reasonable even when the compiler is optimizing for
+ * small code size. You may be able to save a few bytes by #defining
+ * __always_inline to plain inline, but don't complain if the code
+ * becomes slow.
+ *
+ * NOTE: System headers on GNU/Linux may #define this macro already,
+ * so if you want to change it, you need to #undef it first.
+ */
+#ifndef __always_inline
+# ifdef __GNUC__
+# define __always_inline \
+ inline __attribute__((__always_inline__))
+# else
+# define __always_inline inline
+# endif
+#endif
+
+/*
+ * Some functions are marked to never be inlined to reduce stack usage.
+ * If you don't care about stack usage, you may want to modify this so
+ * that noinline_for_stack is #defined to be empty even when using GCC.
+ * Doing so may save a few bytes in binary size.
+ */
+#ifndef noinline_for_stack
+# ifdef __GNUC__
+# define noinline_for_stack __attribute__((__noinline__))
+# else
+# define noinline_for_stack
+# endif
+#endif
+
+/* Inline functions to access unaligned unsigned 32-bit integers */
+#ifndef get_unaligned_le32
+static inline uint32_t XZ_FUNC get_unaligned_le32(const uint8_t *buf)
+{
+ return (uint32_t)buf[0]
+ | ((uint32_t)buf[1] << 8)
+ | ((uint32_t)buf[2] << 16)
+ | ((uint32_t)buf[3] << 24);
+}
+#endif
+
+#ifndef get_unaligned_be32
+static inline uint32_t XZ_FUNC get_unaligned_be32(const uint8_t *buf)
+{
+ return (uint32_t)(buf[0] << 24)
+ | ((uint32_t)buf[1] << 16)
+ | ((uint32_t)buf[2] << 8)
+ | (uint32_t)buf[3];
+}
+#endif
+
+#ifndef put_unaligned_le32
+static inline void XZ_FUNC put_unaligned_le32(uint32_t val, uint8_t *buf)
+{
+ buf[0] = (uint8_t)val;
+ buf[1] = (uint8_t)(val >> 8);
+ buf[2] = (uint8_t)(val >> 16);
+ buf[3] = (uint8_t)(val >> 24);
+}
+#endif
+
+#ifndef put_unaligned_be32
+static inline void XZ_FUNC put_unaligned_be32(uint32_t val, uint8_t *buf)
+{
+ buf[0] = (uint8_t)(val >> 24);
+ buf[1] = (uint8_t)(val >> 16);
+ buf[2] = (uint8_t)(val >> 8);
+ buf[3] = (uint8_t)val;
+}
+#endif
+
+/*
+ * Use get_unaligned_le32() also for aligned access for simplicity. On
+ * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr))
+ * could save a few bytes in code size.
+ */
+#ifndef get_le32
+# define get_le32 get_unaligned_le32
+#endif
+
+#endif
diff --git a/lib/qt-tar-xz/xz_crc32.c b/lib/qt-tar-xz/xz_crc32.c
new file mode 100644
index 0000000..eea7b33
--- /dev/null
+++ b/lib/qt-tar-xz/xz_crc32.c
@@ -0,0 +1,52 @@
+/*
+ * CRC32 using the polynomial from IEEE-802.3
+ *
+ * Authors: Lasse Collin <lasse.collin@tukaani.org>
+ * Igor Pavlov <http://7-zip.org/>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+/*
+ * This is not the fastest implementation, but it is pretty compact.
+ * The fastest versions of xz_crc32() on modern CPUs without hardware
+ * accelerated CRC instruction are 3-5 times as fast as this version,
+ * but they are bigger and use more memory for the lookup table.
+ */
+
+#include "xz_private.h"
+
+static uint32_t xz_crc32_table[256];
+
+XZ_EXTERN void XZ_FUNC xz_crc32_init(void)
+{
+ const uint32_t poly = 0xEDB88320;
+
+ uint32_t i;
+ uint32_t j;
+ uint32_t r;
+
+ for (i = 0; i < 256; ++i) {
+ r = i;
+ for (j = 0; j < 8; ++j)
+ r = (r >> 1) ^ (poly & ~((r & 1) - 1));
+
+ xz_crc32_table[i] = r;
+ }
+
+ return;
+}
+
+XZ_EXTERN uint32_t XZ_FUNC xz_crc32(
+ const uint8_t *buf, size_t size, uint32_t crc)
+{
+ crc = ~crc;
+
+ while (size != 0) {
+ crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
+ --size;
+ }
+
+ return ~crc;
+}
diff --git a/lib/qt-tar-xz/xz_dec_bcj.c b/lib/qt-tar-xz/xz_dec_bcj.c
new file mode 100644
index 0000000..09162b5
--- /dev/null
+++ b/lib/qt-tar-xz/xz_dec_bcj.c
@@ -0,0 +1,564 @@
+/*
+ * Branch/Call/Jump (BCJ) filter decoders
+ *
+ * Authors: Lasse Collin <lasse.collin@tukaani.org>
+ * Igor Pavlov <http://7-zip.org/>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#include "xz_private.h"
+
+/*
+ * The rest of the file is inside this ifdef. It makes things a little more
+ * convenient when building without support for any BCJ filters.
+ */
+#ifdef XZ_DEC_BCJ
+
+struct xz_dec_bcj {
+ /* Type of the BCJ filter being used */
+ enum {
+ BCJ_X86 = 4, /* x86 or x86-64 */
+ BCJ_POWERPC = 5, /* Big endian only */
+ BCJ_IA64 = 6, /* Big or little endian */
+ BCJ_ARM = 7, /* Little endian only */
+ BCJ_ARMTHUMB = 8, /* Little endian only */
+ BCJ_SPARC = 9 /* Big or little endian */
+ } type;
+
+ /*
+ * Return value of the next filter in the chain. We need to preserve
+ * this information across calls, because we must not call the next
+ * filter anymore once it has returned XZ_STREAM_END.
+ */
+ enum xz_ret ret;
+
+ /* True if we are operating in single-call mode. */
+ bool single_call;
+
+ /*
+ * Absolute position relative to the beginning of the uncompressed
+ * data (in a single .xz Block). We care only about the lowest 32
+ * bits so this doesn't need to be uint64_t even with big files.
+ */
+ uint32_t pos;
+
+ /* x86 filter state */
+ uint32_t x86_prev_mask;
+
+ /* Temporary space to hold the variables from struct xz_buf */
+ uint8_t *out;
+ size_t out_pos;
+ size_t out_size;
+
+ struct {
+ /* Amount of already filtered data in the beginning of buf */
+ size_t filtered;
+
+ /* Total amount of data currently stored in buf */
+ size_t size;
+
+ /*
+ * Buffer to hold a mix of filtered and unfiltered data. This
+ * needs to be big enough to hold Alignment + 2 * Look-ahead:
+ *
+ * Type Alignment Look-ahead
+ * x86 1 4
+ * PowerPC 4 0
+ * IA-64 16 0
+ * ARM 4 0
+ * ARM-Thumb 2 2
+ * SPARC 4 0
+ */
+ uint8_t buf[16];
+ } temp;
+};
+
+#ifdef XZ_DEC_X86
+/*
+ * This is macro used to test the most significant byte of a memory address
+ * in an x86 instruction.
+ */
+#define bcj_x86_test_msbyte(b) ((b) == 0x00 || (b) == 0xFF)
+
+static noinline_for_stack size_t XZ_FUNC bcj_x86(
+ struct xz_dec_bcj *s, uint8_t *buf, size_t size)
+{
+ static const bool mask_to_allowed_status[8]
+ = { true, true, true, false, true, false, false, false };
+
+ static const uint8_t mask_to_bit_num[8] = { 0, 1, 2, 2, 3, 3, 3, 3 };
+
+ size_t i;
+ size_t prev_pos = (size_t)-1;
+ uint32_t prev_mask = s->x86_prev_mask;
+ uint32_t src;
+ uint32_t dest;
+ uint32_t j;
+ uint8_t b;
+
+ if (size <= 4)
+ return 0;
+
+ size -= 4;
+ for (i = 0; i < size; ++i) {
+ if ((buf[i] & 0xFE) != 0xE8)
+ continue;
+
+ prev_pos = i - prev_pos;
+ if (prev_pos > 3) {
+ prev_mask = 0;
+ } else {
+ prev_mask = (prev_mask << (prev_pos - 1)) & 7;
+ if (prev_mask != 0) {
+ b = buf[i + 4 - mask_to_bit_num[prev_mask]];
+ if (!mask_to_allowed_status[prev_mask]
+ || bcj_x86_test_msbyte(b)) {
+ prev_pos = i;
+ prev_mask = (prev_mask << 1) | 1;
+ continue;
+ }
+ }
+ }
+
+ prev_pos = i;
+
+ if (bcj_x86_test_msbyte(buf[i + 4])) {
+ src = get_unaligned_le32(buf + i + 1);
+ while (true) {
+ dest = src - (s->pos + (uint32_t)i + 5);
+ if (prev_mask == 0)
+ break;
+
+ j = mask_to_bit_num[prev_mask] * 8;
+ b = (uint8_t)(dest >> (24 - j));
+ if (!bcj_x86_test_msbyte(b))
+ break;
+
+ src = dest ^ (((uint32_t)1 << (32 - j)) - 1);
+ }
+
+ dest &= 0x01FFFFFF;
+ dest |= (uint32_t)0 - (dest & 0x01000000);
+ put_unaligned_le32(dest, buf + i + 1);
+ i += 4;
+ } else {
+ prev_mask = (prev_mask << 1) | 1;
+ }
+ }
+
+ prev_pos = i - prev_pos;
+ s->x86_prev_mask = prev_pos > 3 ? 0 : prev_mask << (prev_pos - 1);
+ return i;
+}
+#endif
+
+#ifdef XZ_DEC_POWERPC
+static noinline_for_stack size_t XZ_FUNC bcj_powerpc(
+ struct xz_dec_bcj *s, uint8_t *buf, size_t size)
+{
+ size_t i;
+ uint32_t instr;
+
+ for (i = 0; i + 4 <= size; i += 4) {
+ instr = get_unaligned_be32(buf + i);
+ if ((instr & 0xFC000003) == 0x48000001) {
+ instr &= 0x03FFFFFC;
+ instr -= s->pos + (uint32_t)i;
+ instr &= 0x03FFFFFC;
+ instr |= 0x48000001;
+ put_unaligned_be32(instr, buf + i);
+ }
+ }
+
+ return i;
+}
+#endif
+
+#ifdef XZ_DEC_IA64
+static noinline_for_stack size_t XZ_FUNC bcj_ia64(
+ struct xz_dec_bcj *s, uint8_t *buf, size_t size)
+{
+ static const uint8_t branch_table[32] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 4, 6, 6, 0, 0, 7, 7,
+ 4, 4, 0, 0, 4, 4, 0, 0
+ };
+
+ /*
+ * The local variables take a little bit stack space, but it's less
+ * than what LZMA2 decoder takes, so it doesn't make sense to reduce
+ * stack usage here without doing that for the LZMA2 decoder too.
+ */
+
+ /* Loop counters */
+ size_t i;
+ size_t j;
+
+ /* Instruction slot (0, 1, or 2) in the 128-bit instruction word */
+ uint32_t slot;
+
+ /* Bitwise offset of the instruction indicated by slot */
+ uint32_t bit_pos;
+
+ /* bit_pos split into byte and bit parts */
+ uint32_t byte_pos;
+ uint32_t bit_res;
+
+ /* Address part of an instruction */
+ uint32_t addr;
+
+ /* Mask used to detect which instructions to convert */
+ uint32_t mask;
+
+ /* 41-bit instruction stored somewhere in the lowest 48 bits */
+ uint64_t instr;
+
+ /* Instruction normalized with bit_res for easier manipulation */
+ uint64_t norm;
+
+ for (i = 0; i + 16 <= size; i += 16) {
+ mask = branch_table[buf[i] & 0x1F];
+ for (slot = 0, bit_pos = 5; slot < 3; ++slot, bit_pos += 41) {
+ if (((mask >> slot) & 1) == 0)
+ continue;
+
+ byte_pos = bit_pos >> 3;
+ bit_res = bit_pos & 7;
+ instr = 0;
+ for (j = 0; j < 6; ++j)
+ instr |= (uint64_t)(buf[i + j + byte_pos])
+ << (8 * j);
+
+ norm = instr >> bit_res;
+
+ if (((norm >> 37) & 0x0F) == 0x05
+ && ((norm >> 9) & 0x07) == 0) {
+ addr = (norm >> 13) & 0x0FFFFF;
+ addr |= ((uint32_t)(norm >> 36) & 1) << 20;
+ addr <<= 4;
+ addr -= s->pos + (uint32_t)i;
+ addr >>= 4;
+
+ norm &= ~((uint64_t)0x8FFFFF << 13);
+ norm |= (uint64_t)(addr & 0x0FFFFF) << 13;
+ norm |= (uint64_t)(addr & 0x100000)
+ << (36 - 20);
+
+ instr &= (1 << bit_res) - 1;
+ instr |= norm << bit_res;
+
+ for (j = 0; j < 6; j++)
+ buf[i + j + byte_pos]
+ = (uint8_t)(instr >> (8 * j));
+ }
+ }
+ }
+
+ return i;
+}
+#endif
+
+#ifdef XZ_DEC_ARM
+static noinline_for_stack size_t XZ_FUNC bcj_arm(
+ struct xz_dec_bcj *s, uint8_t *buf, size_t size)
+{
+ size_t i;
+ uint32_t addr;
+
+ for (i = 0; i + 4 <= size; i += 4) {
+ if (buf[i + 3] == 0xEB) {
+ addr = (uint32_t)buf[i] | ((uint32_t)buf[i + 1] << 8)
+ | ((uint32_t)buf[i + 2] << 16);
+ addr <<= 2;
+ addr -= s->pos + (uint32_t)i + 8;
+ addr >>= 2;
+ buf[i] = (uint8_t)addr;
+ buf[i + 1] = (uint8_t)(addr >> 8);
+ buf[i + 2] = (uint8_t)(addr >> 16);
+ }
+ }
+
+ return i;
+}
+#endif
+
+#ifdef XZ_DEC_ARMTHUMB
+static noinline_for_stack size_t XZ_FUNC bcj_armthumb(
+ struct xz_dec_bcj *s, uint8_t *buf, size_t size)
+{
+ size_t i;
+ uint32_t addr;
+
+ for (i = 0; i + 4 <= size; i += 2) {
+ if ((buf[i + 1] & 0xF8) == 0xF0
+ && (buf[i + 3] & 0xF8) == 0xF8) {
+ addr = (((uint32_t)buf[i + 1] & 0x07) << 19)
+ | ((uint32_t)buf[i] << 11)
+ | (((uint32_t)buf[i + 3] & 0x07) << 8)
+ | (uint32_t)buf[i + 2];
+ addr <<= 1;
+ addr -= s->pos + (uint32_t)i + 4;
+ addr >>= 1;
+ buf[i + 1] = (uint8_t)(0xF0 | ((addr >> 19) & 0x07));
+ buf[i] = (uint8_t)(addr >> 11);
+ buf[i + 3] = (uint8_t)(0xF8 | ((addr >> 8) & 0x07));
+ buf[i + 2] = (uint8_t)addr;
+ i += 2;
+ }
+ }
+
+ return i;
+}
+#endif
+
+#ifdef XZ_DEC_SPARC
+static noinline_for_stack size_t XZ_FUNC bcj_sparc(
+ struct xz_dec_bcj *s, uint8_t *buf, size_t size)
+{
+ size_t i;
+ uint32_t instr;
+
+ for (i = 0; i + 4 <= size; i += 4) {
+ instr = get_unaligned_be32(buf + i);
+ if ((instr >> 22) == 0x100 || (instr >> 22) == 0x1FF) {
+ instr <<= 2;
+ instr -= s->pos + (uint32_t)i;
+ instr >>= 2;
+ instr = ((uint32_t)0x40000000 - (instr & 0x400000))
+ | 0x40000000 | (instr & 0x3FFFFF);
+ put_unaligned_be32(instr, buf + i);
+ }
+ }
+
+ return i;
+}
+#endif
+
+/*
+ * Apply the selected BCJ filter. Update *pos and s->pos to match the amount
+ * of data that got filtered.
+ *
+ * NOTE: This is implemented as a switch statement to avoid using function
+ * pointers, which could be problematic in the kernel boot code, which must
+ * avoid pointers to static data (at least on x86).
+ */
+static void XZ_FUNC bcj_apply(struct xz_dec_bcj *s,
+ uint8_t *buf, size_t *pos, size_t size)
+{
+ size_t filtered;
+
+ buf += *pos;
+ size -= *pos;
+
+ switch (s->type) {
+#ifdef XZ_DEC_X86
+ case BCJ_X86:
+ filtered = bcj_x86(s, buf, size);
+ break;
+#endif
+#ifdef XZ_DEC_POWERPC
+ case BCJ_POWERPC:
+ filtered = bcj_powerpc(s, buf, size);
+ break;
+#endif
+#ifdef XZ_DEC_IA64
+ case BCJ_IA64:
+ filtered = bcj_ia64(s, buf, size);
+ break;
+#endif
+#ifdef XZ_DEC_ARM
+ case BCJ_ARM:
+ filtered = bcj_arm(s, buf, size);
+ break;
+#endif
+#ifdef XZ_DEC_ARMTHUMB
+ case BCJ_ARMTHUMB:
+ filtered = bcj_armthumb(s, buf, size);
+ break;
+#endif
+#ifdef XZ_DEC_SPARC
+ case BCJ_SPARC:
+ filtered = bcj_sparc(s, buf, size);
+ break;
+#endif
+ default:
+ /* Never reached but silence compiler warnings. */
+ filtered = 0;
+ break;
+ }
+
+ *pos += filtered;
+ s->pos += filtered;
+}
+
+/*
+ * Flush pending filtered data from temp to the output buffer.
+ * Move the remaining mixture of possibly filtered and unfiltered
+ * data to the beginning of temp.
+ */
+static void XZ_FUNC bcj_flush(struct xz_dec_bcj *s, struct xz_buf *b)
+{
+ size_t copy_size;
+
+ copy_size = min_t(size_t, s->temp.filtered, b->out_size - b->out_pos);
+ memcpy(b->out + b->out_pos, s->temp.buf, copy_size);
+ b->out_pos += copy_size;
+
+ s->temp.filtered -= copy_size;
+ s->temp.size -= copy_size;
+ memmove(s->temp.buf, s->temp.buf + copy_size, s->temp.size);
+}
+
+/*
+ * The BCJ filter functions are primitive in sense that they process the
+ * data in chunks of 1-16 bytes. To hide this issue, this function does
+ * some buffering.
+ */
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_bcj_run(struct xz_dec_bcj *s,
+ struct xz_dec_lzma2 *lzma2, struct xz_buf *b)
+{
+ size_t out_start;
+
+ /*
+ * Flush pending already filtered data to the output buffer. Return
+ * immediatelly if we couldn't flush everything, or if the next
+ * filter in the chain had already returned XZ_STREAM_END.
+ */
+ if (s->temp.filtered > 0) {
+ bcj_flush(s, b);
+ if (s->temp.filtered > 0)
+ return XZ_OK;
+
+ if (s->ret == XZ_STREAM_END)
+ return XZ_STREAM_END;
+ }
+
+ /*
+ * If we have more output space than what is currently pending in
+ * temp, copy the unfiltered data from temp to the output buffer
+ * and try to fill the output buffer by decoding more data from the
+ * next filter in the chain. Apply the BCJ filter on the new data
+ * in the output buffer. If everything cannot be filtered, copy it
+ * to temp and rewind the output buffer position accordingly.
+ */
+ if (s->temp.size < b->out_size - b->out_pos) {
+ out_start = b->out_pos;
+ memcpy(b->out + b->out_pos, s->temp.buf, s->temp.size);
+ b->out_pos += s->temp.size;
+
+ s->ret = xz_dec_lzma2_run(lzma2, b);
+ if (s->ret != XZ_STREAM_END
+ && (s->ret != XZ_OK || s->single_call))
+ return s->ret;
+
+ bcj_apply(s, b->out, &out_start, b->out_pos);
+
+ /*
+ * As an exception, if the next filter returned XZ_STREAM_END,
+ * we can do that too, since the last few bytes that remain
+ * unfiltered are meant to remain unfiltered.
+ */
+ if (s->ret == XZ_STREAM_END)
+ return XZ_STREAM_END;
+
+ s->temp.size = b->out_pos - out_start;
+ b->out_pos -= s->temp.size;
+ memcpy(s->temp.buf, b->out + b->out_pos, s->temp.size);
+ }
+
+ /*
+ * If we have unfiltered data in temp, try to fill by decoding more
+ * data from the next filter. Apply the BCJ filter on temp. Then we
+ * hopefully can fill the actual output buffer by copying filtered
+ * data from temp. A mix of filtered and unfiltered data may be left
+ * in temp; it will be taken care on the next call to this function.
+ */
+ if (s->temp.size > 0) {
+ /* Make b->out{,_pos,_size} temporarily point to s->temp. */
+ s->out = b->out;
+ s->out_pos = b->out_pos;
+ s->out_size = b->out_size;
+ b->out = s->temp.buf;
+ b->out_pos = s->temp.size;
+ b->out_size = sizeof(s->temp.buf);
+
+ s->ret = xz_dec_lzma2_run(lzma2, b);
+
+ s->temp.size = b->out_pos;
+ b->out = s->out;
+ b->out_pos = s->out_pos;
+ b->out_size = s->out_size;
+
+ if (s->ret != XZ_OK && s->ret != XZ_STREAM_END)
+ return s->ret;
+
+ bcj_apply(s, s->temp.buf, &s->temp.filtered, s->temp.size);
+
+ /*
+ * If the next filter returned XZ_STREAM_END, we mark that
+ * everything is filtered, since the last unfiltered bytes
+ * of the stream are meant to be left as is.
+ */
+ if (s->ret == XZ_STREAM_END)
+ s->temp.filtered = s->temp.size;
+
+ bcj_flush(s, b);
+ if (s->temp.filtered > 0)
+ return XZ_OK;
+ }
+
+ return s->ret;
+}
+
+XZ_EXTERN struct xz_dec_bcj * XZ_FUNC xz_dec_bcj_create(bool single_call)
+{
+ struct xz_dec_bcj *s = kmalloc(sizeof(*s), GFP_KERNEL);
+ if (s != NULL)
+ s->single_call = single_call;
+
+ return s;
+}
+
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_bcj_reset(
+ struct xz_dec_bcj *s, uint8_t id)
+{
+ switch (id) {
+#ifdef XZ_DEC_X86
+ case BCJ_X86:
+#endif
+#ifdef XZ_DEC_POWERPC
+ case BCJ_POWERPC:
+#endif
+#ifdef XZ_DEC_IA64
+ case BCJ_IA64:
+#endif
+#ifdef XZ_DEC_ARM
+ case BCJ_ARM:
+#endif
+#ifdef XZ_DEC_ARMTHUMB
+ case BCJ_ARMTHUMB:
+#endif
+#ifdef XZ_DEC_SPARC
+ case BCJ_SPARC:
+#endif
+ break;
+
+ default:
+ /* Unsupported Filter ID */
+ return XZ_OPTIONS_ERROR;
+ }
+
+ s->type = id;
+ s->ret = XZ_OK;
+ s->pos = 0;
+ s->x86_prev_mask = 0;
+ s->temp.filtered = 0;
+ s->temp.size = 0;
+
+ return XZ_OK;
+}
+
+#endif
diff --git a/lib/qt-tar-xz/xz_dec_lzma2.c b/lib/qt-tar-xz/xz_dec_lzma2.c
new file mode 100644
index 0000000..ad36e29
--- /dev/null
+++ b/lib/qt-tar-xz/xz_dec_lzma2.c
@@ -0,0 +1,1175 @@
+/*
+ * LZMA2 decoder
+ *
+ * Authors: Lasse Collin <lasse.collin@tukaani.org>
+ * Igor Pavlov <http://7-zip.org/>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#include "xz_private.h"
+#include "xz_lzma2.h"
+
+/*
+ * Range decoder initialization eats the first five bytes of each LZMA chunk.
+ */
+#define RC_INIT_BYTES 5
+
+/*
+ * Minimum number of usable input buffer to safely decode one LZMA symbol.
+ * The worst case is that we decode 22 bits using probabilities and 26
+ * direct bits. This may decode at maximum of 20 bytes of input. However,
+ * lzma_main() does an extra normalization before returning, thus we
+ * need to put 21 here.
+ */
+#define LZMA_IN_REQUIRED 21
+
+/*
+ * Dictionary (history buffer)
+ *
+ * These are always true:
+ * start <= pos <= full <= end
+ * pos <= limit <= end
+ *
+ * In multi-call mode, also these are true:
+ * end == size
+ * size <= size_max
+ * allocated <= size
+ *
+ * Most of these variables are size_t to support single-call mode,
+ * in which the dictionary variables address the actual output
+ * buffer directly.
+ */
+struct dictionary {
+ /* Beginning of the history buffer */
+ uint8_t *buf;
+
+ /* Old position in buf (before decoding more data) */
+ size_t start;
+
+ /* Position in buf */
+ size_t pos;
+
+ /*
+ * How full dictionary is. This is used to detect corrupt input that
+ * would read beyond the beginning of the uncompressed stream.
+ */
+ size_t full;
+
+ /* Write limit; we don't write to buf[limit] or later bytes. */
+ size_t limit;
+
+ /*
+ * End of the dictionary buffer. In multi-call mode, this is
+ * the same as the dictionary size. In single-call mode, this
+ * indicates the size of the output buffer.
+ */
+ size_t end;
+
+ /*
+ * Size of the dictionary as specified in Block Header. This is used
+ * together with "full" to detect corrupt input that would make us
+ * read beyond the beginning of the uncompressed stream.
+ */
+ uint32_t size;
+
+ /*
+ * Maximum allowed dictionary size in multi-call mode.
+ * This is ignored in single-call mode.
+ */
+ uint32_t size_max;
+
+ /*
+ * Amount of memory currently allocated for the dictionary.
+ * This is used only with XZ_DYNALLOC. (With XZ_PREALLOC,
+ * size_max is always the same as the allocated size.)
+ */
+ uint32_t allocated;
+
+ /* Operation mode */
+ enum xz_mode mode;
+};
+
+/* Range decoder */
+struct rc_dec {
+ uint32_t range;
+ uint32_t code;
+
+ /*
+ * Number of initializing bytes remaining to be read
+ * by rc_read_init().
+ */
+ uint32_t init_bytes_left;
+
+ /*
+ * Buffer from which we read our input. It can be either
+ * temp.buf or the caller-provided input buffer.
+ */
+ const uint8_t *in;
+ size_t in_pos;
+ size_t in_limit;
+};
+
+/* Probabilities for a length decoder. */
+struct lzma_len_dec {
+ /* Probability of match length being at least 10 */
+ uint16_t choice;
+
+ /* Probability of match length being at least 18 */
+ uint16_t choice2;
+
+ /* Probabilities for match lengths 2-9 */
+ uint16_t low[POS_STATES_MAX][LEN_LOW_SYMBOLS];
+
+ /* Probabilities for match lengths 10-17 */
+ uint16_t mid[POS_STATES_MAX][LEN_MID_SYMBOLS];
+
+ /* Probabilities for match lengths 18-273 */
+ uint16_t high[LEN_HIGH_SYMBOLS];
+};
+
+struct lzma_dec {
+ /* Distances of latest four matches */
+ uint32_t rep0;
+ uint32_t rep1;
+ uint32_t rep2;
+ uint32_t rep3;
+
+ /* Types of the most recently seen LZMA symbols */
+ enum lzma_state state;
+
+ /*
+ * Length of a match. This is updated so that dict_repeat can
+ * be called again to finish repeating the whole match.
+ */
+ uint32_t len;
+
+ /*
+ * LZMA properties or related bit masks (number of literal
+ * context bits, a mask dervied from the number of literal
+ * position bits, and a mask dervied from the number
+ * position bits)
+ */
+ uint32_t lc;
+ uint32_t literal_pos_mask; /* (1 << lp) - 1 */
+ uint32_t pos_mask; /* (1 << pb) - 1 */
+
+ /* If 1, it's a match. Otherwise it's a single 8-bit literal. */
+ uint16_t is_match[STATES][POS_STATES_MAX];
+
+ /* If 1, it's a repeated match. The distance is one of rep0 .. rep3. */
+ uint16_t is_rep[STATES];
+
+ /*
+ * If 0, distance of a repeated match is rep0.
+ * Otherwise check is_rep1.
+ */
+ uint16_t is_rep0[STATES];
+
+ /*
+ * If 0, distance of a repeated match is rep1.
+ * Otherwise check is_rep2.
+ */
+ uint16_t is_rep1[STATES];
+
+ /* If 0, distance of a repeated match is rep2. Otherwise it is rep3. */
+ uint16_t is_rep2[STATES];
+
+ /*
+ * If 1, the repeated match has length of one byte. Otherwise
+ * the length is decoded from rep_len_decoder.
+ */
+ uint16_t is_rep0_long[STATES][POS_STATES_MAX];
+
+ /*
+ * Probability tree for the highest two bits of the match
+ * distance. There is a separate probability tree for match
+ * lengths of 2 (i.e. MATCH_LEN_MIN), 3, 4, and [5, 273].
+ */
+ uint16_t dist_slot[DIST_STATES][DIST_SLOTS];
+
+ /*
+ * Probility trees for additional bits for match distance
+ * when the distance is in the range [4, 127].
+ */
+ uint16_t dist_special[FULL_DISTANCES - DIST_MODEL_END];
+
+ /*
+ * Probability tree for the lowest four bits of a match
+ * distance that is equal to or greater than 128.
+ */
+ uint16_t dist_align[ALIGN_SIZE];
+
+ /* Length of a normal match */
+ struct lzma_len_dec match_len_dec;
+
+ /* Length of a repeated match */
+ struct lzma_len_dec rep_len_dec;
+
+ /* Probabilities of literals */
+ uint16_t literal[LITERAL_CODERS_MAX][LITERAL_CODER_SIZE];
+};
+
+struct lzma2_dec {
+ /* Position in xz_dec_lzma2_run(). */
+ enum lzma2_seq {
+ SEQ_CONTROL,
+ SEQ_UNCOMPRESSED_1,
+ SEQ_UNCOMPRESSED_2,
+ SEQ_COMPRESSED_0,
+ SEQ_COMPRESSED_1,
+ SEQ_PROPERTIES,
+ SEQ_LZMA_PREPARE,
+ SEQ_LZMA_RUN,
+ SEQ_COPY
+ } sequence;
+
+ /* Next position after decoding the compressed size of the chunk. */
+ enum lzma2_seq next_sequence;
+
+ /* Uncompressed size of LZMA chunk (2 MiB at maximum) */
+ uint32_t uncompressed;
+
+ /*
+ * Compressed size of LZMA chunk or compressed/uncompressed
+ * size of uncompressed chunk (64 KiB at maximum)
+ */
+ uint32_t compressed;
+
+ /*
+ * True if dictionary reset is needed. This is false before
+ * the first chunk (LZMA or uncompressed).
+ */
+ bool need_dict_reset;
+
+ /*
+ * True if new LZMA properties are needed. This is false
+ * before the first LZMA chunk.
+ */
+ bool need_props;
+};
+
+struct xz_dec_lzma2 {
+ /*
+ * The order below is important on x86 to reduce code size and
+ * it shouldn't hurt on other platforms. Everything up to and
+ * including lzma.pos_mask are in the first 128 bytes on x86-32,
+ * which allows using smaller instructions to access those
+ * variables. On x86-64, fewer variables fit into the first 128
+ * bytes, but this is still the best order without sacrificing
+ * the readability by splitting the structures.
+ */
+ struct rc_dec rc;
+ struct dictionary dict;
+ struct lzma2_dec lzma2;
+ struct lzma_dec lzma;
+
+ /*
+ * Temporary buffer which holds small number of input bytes between
+ * decoder calls. See lzma2_lzma() for details.
+ */
+ struct {
+ uint32_t size;
+ uint8_t buf[3 * LZMA_IN_REQUIRED];
+ } temp;
+};
+
+/**************
+ * Dictionary *
+ **************/
+
+/*
+ * Reset the dictionary state. When in single-call mode, set up the beginning
+ * of the dictionary to point to the actual output buffer.
+ */
+static void XZ_FUNC dict_reset(struct dictionary *dict, struct xz_buf *b)
+{
+ if (DEC_IS_SINGLE(dict->mode)) {
+ dict->buf = b->out + b->out_pos;
+ dict->end = b->out_size - b->out_pos;
+ }
+
+ dict->start = 0;
+ dict->pos = 0;
+ dict->limit = 0;
+ dict->full = 0;
+}
+
+/* Set dictionary write limit */
+static void XZ_FUNC dict_limit(struct dictionary *dict, size_t out_max)
+{
+ if (dict->end - dict->pos <= out_max)
+ dict->limit = dict->end;
+ else
+ dict->limit = dict->pos + out_max;
+}
+
+/* Return true if at least one byte can be written into the dictionary. */
+static inline bool XZ_FUNC dict_has_space(const struct dictionary *dict)
+{
+ return dict->pos < dict->limit;
+}
+
+/*
+ * Get a byte from the dictionary at the given distance. The distance is
+ * assumed to valid, or as a special case, zero when the dictionary is
+ * still empty. This special case is needed for single-call decoding to
+ * avoid writing a '\0' to the end of the destination buffer.
+ */
+static inline uint32_t XZ_FUNC dict_get(
+ const struct dictionary *dict, uint32_t dist)
+{
+ size_t offset = dict->pos - dist - 1;
+
+ if (dist >= dict->pos)
+ offset += dict->end;
+
+ return dict->full > 0 ? dict->buf[offset] : 0;
+}
+
+/*
+ * Put one byte into the dictionary. It is assumed that there is space for it.
+ */
+static inline void XZ_FUNC dict_put(struct dictionary *dict, uint8_t byte)
+{
+ dict->buf[dict->pos++] = byte;
+
+ if (dict->full < dict->pos)
+ dict->full = dict->pos;
+}
+
+/*
+ * Repeat given number of bytes from the given distance. If the distance is
+ * invalid, false is returned. On success, true is returned and *len is
+ * updated to indicate how many bytes were left to be repeated.
+ */
+static bool XZ_FUNC dict_repeat(
+ struct dictionary *dict, uint32_t *len, uint32_t dist)
+{
+ size_t back;
+ uint32_t left;
+
+ if (dist >= dict->full || dist >= dict->size)
+ return false;
+
+ left = min_t(size_t, dict->limit - dict->pos, *len);
+ *len -= left;
+
+ back = dict->pos - dist - 1;
+ if (dist >= dict->pos)
+ back += dict->end;
+
+ do {
+ dict->buf[dict->pos++] = dict->buf[back++];
+ if (back == dict->end)
+ back = 0;
+ } while (--left > 0);
+
+ if (dict->full < dict->pos)
+ dict->full = dict->pos;
+
+ return true;
+}
+
+/* Copy uncompressed data as is from input to dictionary and output buffers. */
+static void XZ_FUNC dict_uncompressed(
+ struct dictionary *dict, struct xz_buf *b, uint32_t *left)
+{
+ size_t copy_size;
+
+ while (*left > 0 && b->in_pos < b->in_size
+ && b->out_pos < b->out_size) {
+ copy_size = min(b->in_size - b->in_pos,
+ b->out_size - b->out_pos);
+ if (copy_size > dict->end - dict->pos)
+ copy_size = dict->end - dict->pos;
+ if (copy_size > *left)
+ copy_size = *left;
+
+ *left -= copy_size;
+
+ memcpy(dict->buf + dict->pos, b->in + b->in_pos, copy_size);
+ dict->pos += copy_size;
+
+ if (dict->full < dict->pos)
+ dict->full = dict->pos;
+
+ if (DEC_IS_MULTI(dict->mode)) {
+ if (dict->pos == dict->end)
+ dict->pos = 0;
+
+ memcpy(b->out + b->out_pos, b->in + b->in_pos,
+ copy_size);
+ }
+
+ dict->start = dict->pos;
+
+ b->out_pos += copy_size;
+ b->in_pos += copy_size;
+
+ }
+}
+
+/*
+ * Flush pending data from dictionary to b->out. It is assumed that there is
+ * enough space in b->out. This is guaranteed because caller uses dict_limit()
+ * before decoding data into the dictionary.
+ */
+static uint32_t XZ_FUNC dict_flush(struct dictionary *dict, struct xz_buf *b)
+{
+ size_t copy_size = dict->pos - dict->start;
+
+ if (DEC_IS_MULTI(dict->mode)) {
+ if (dict->pos == dict->end)
+ dict->pos = 0;
+
+ memcpy(b->out + b->out_pos, dict->buf + dict->start,
+ copy_size);
+ }
+
+ dict->start = dict->pos;
+ b->out_pos += copy_size;
+ return copy_size;
+}
+
+/*****************
+ * Range decoder *
+ *****************/
+
+/* Reset the range decoder. */
+static void XZ_FUNC rc_reset(struct rc_dec *rc)
+{
+ rc->range = (uint32_t)-1;
+ rc->code = 0;
+ rc->init_bytes_left = RC_INIT_BYTES;
+}
+
+/*
+ * Read the first five initial bytes into rc->code if they haven't been
+ * read already. (Yes, the first byte gets completely ignored.)
+ */
+static bool XZ_FUNC rc_read_init(struct rc_dec *rc, struct xz_buf *b)
+{
+ while (rc->init_bytes_left > 0) {
+ if (b->in_pos == b->in_size)
+ return false;
+
+ rc->code = (rc->code << 8) + b->in[b->in_pos++];
+ --rc->init_bytes_left;
+ }
+
+ return true;
+}
+
+/* Return true if there may not be enough input for the next decoding loop. */
+static inline bool XZ_FUNC rc_limit_exceeded(const struct rc_dec *rc)
+{
+ return rc->in_pos > rc->in_limit;
+}
+
+/*
+ * Return true if it is possible (from point of view of range decoder) that
+ * we have reached the end of the LZMA chunk.
+ */
+static inline bool XZ_FUNC rc_is_finished(const struct rc_dec *rc)
+{
+ return rc->code == 0;
+}
+
+/* Read the next input byte if needed. */
+static __always_inline void XZ_FUNC rc_normalize(struct rc_dec *rc)
+{
+ if (rc->range < RC_TOP_VALUE) {
+ rc->range <<= RC_SHIFT_BITS;
+ rc->code = (rc->code << RC_SHIFT_BITS) + rc->in[rc->in_pos++];
+ }
+}
+
+/*
+ * Decode one bit. In some versions, this function has been splitted in three
+ * functions so that the compiler is supposed to be able to more easily avoid
+ * an extra branch. In this particular version of the LZMA decoder, this
+ * doesn't seem to be a good idea (tested with GCC 3.3.6, 3.4.6, and 4.3.3
+ * on x86). Using a non-splitted version results in nicer looking code too.
+ *
+ * NOTE: This must return an int. Do not make it return a bool or the speed
+ * of the code generated by GCC 3.x decreases 10-15 %. (GCC 4.3 doesn't care,
+ * and it generates 10-20 % faster code than GCC 3.x from this file anyway.)
+ */
+static __always_inline int XZ_FUNC rc_bit(struct rc_dec *rc, uint16_t *prob)
+{
+ uint32_t bound;
+ int bit;
+
+ rc_normalize(rc);
+ bound = (rc->range >> RC_BIT_MODEL_TOTAL_BITS) * *prob;
+ if (rc->code < bound) {
+ rc->range = bound;
+ *prob += (RC_BIT_MODEL_TOTAL - *prob) >> RC_MOVE_BITS;
+ bit = 0;
+ } else {
+ rc->range -= bound;
+ rc->code -= bound;
+ *prob -= *prob >> RC_MOVE_BITS;
+ bit = 1;
+ }
+
+ return bit;
+}
+
+/* Decode a bittree starting from the most significant bit. */
+static __always_inline uint32_t XZ_FUNC rc_bittree(
+ struct rc_dec *rc, uint16_t *probs, uint32_t limit)
+{
+ uint32_t symbol = 1;
+
+ do {
+ if (rc_bit(rc, &probs[symbol]))
+ symbol = (symbol << 1) + 1;
+ else
+ symbol <<= 1;
+ } while (symbol < limit);
+
+ return symbol;
+}
+
+/* Decode a bittree starting from the least significant bit. */
+static __always_inline void XZ_FUNC rc_bittree_reverse(struct rc_dec *rc,
+ uint16_t *probs, uint32_t *dest, uint32_t limit)
+{
+ uint32_t symbol = 1;
+ uint32_t i = 0;
+
+ do {
+ if (rc_bit(rc, &probs[symbol])) {
+ symbol = (symbol << 1) + 1;
+ *dest += 1 << i;
+ } else {
+ symbol <<= 1;
+ }
+ } while (++i < limit);
+}
+
+/* Decode direct bits (fixed fifty-fifty probability) */
+static inline void XZ_FUNC rc_direct(
+ struct rc_dec *rc, uint32_t *dest, uint32_t limit)
+{
+ uint32_t mask;
+
+ do {
+ rc_normalize(rc);
+ rc->range >>= 1;
+ rc->code -= rc->range;
+ mask = (uint32_t)0 - (rc->code >> 31);
+ rc->code += rc->range & mask;
+ *dest = (*dest << 1) + (mask + 1);
+ } while (--limit > 0);
+}
+
+/********
+ * LZMA *
+ ********/
+
+/* Get pointer to literal coder probability array. */
+static uint16_t * XZ_FUNC lzma_literal_probs(struct xz_dec_lzma2 *s)
+{
+ uint32_t prev_byte = dict_get(&s->dict, 0);
+ uint32_t low = prev_byte >> (8 - s->lzma.lc);
+ uint32_t high = (s->dict.pos & s->lzma.literal_pos_mask) << s->lzma.lc;
+ return s->lzma.literal[low + high];
+}
+
+/* Decode a literal (one 8-bit byte) */
+static void XZ_FUNC lzma_literal(struct xz_dec_lzma2 *s)
+{
+ uint16_t *probs;
+ uint32_t symbol;
+ uint32_t match_byte;
+ uint32_t match_bit;
+ uint32_t offset;
+ uint32_t i;
+
+ probs = lzma_literal_probs(s);
+
+ if (lzma_state_is_literal(s->lzma.state)) {
+ symbol = rc_bittree(&s->rc, probs, 0x100);
+ } else {
+ symbol = 1;
+ match_byte = dict_get(&s->dict, s->lzma.rep0) << 1;
+ offset = 0x100;
+
+ do {
+ match_bit = match_byte & offset;
+ match_byte <<= 1;
+ i = offset + match_bit + symbol;
+
+ if (rc_bit(&s->rc, &probs[i])) {
+ symbol = (symbol << 1) + 1;
+ offset &= match_bit;
+ } else {
+ symbol <<= 1;
+ offset &= ~match_bit;
+ }
+ } while (symbol < 0x100);
+ }
+
+ dict_put(&s->dict, (uint8_t)symbol);
+ lzma_state_literal(&s->lzma.state);
+}
+
+/* Decode the length of the match into s->lzma.len. */
+static void XZ_FUNC lzma_len(struct xz_dec_lzma2 *s, struct lzma_len_dec *l,
+ uint32_t pos_state)
+{
+ uint16_t *probs;
+ uint32_t limit;
+
+ if (!rc_bit(&s->rc, &l->choice)) {
+ probs = l->low[pos_state];
+ limit = LEN_LOW_SYMBOLS;
+ s->lzma.len = MATCH_LEN_MIN;
+ } else {
+ if (!rc_bit(&s->rc, &l->choice2)) {
+ probs = l->mid[pos_state];
+ limit = LEN_MID_SYMBOLS;
+ s->lzma.len = MATCH_LEN_MIN + LEN_LOW_SYMBOLS;
+ } else {
+ probs = l->high;
+ limit = LEN_HIGH_SYMBOLS;
+ s->lzma.len = MATCH_LEN_MIN + LEN_LOW_SYMBOLS
+ + LEN_MID_SYMBOLS;
+ }
+ }
+
+ s->lzma.len += rc_bittree(&s->rc, probs, limit) - limit;
+}
+
+/* Decode a match. The distance will be stored in s->lzma.rep0. */
+static void XZ_FUNC lzma_match(struct xz_dec_lzma2 *s, uint32_t pos_state)
+{
+ uint16_t *probs;
+ uint32_t dist_slot;
+ uint32_t limit;
+
+ lzma_state_match(&s->lzma.state);
+
+ s->lzma.rep3 = s->lzma.rep2;
+ s->lzma.rep2 = s->lzma.rep1;
+ s->lzma.rep1 = s->lzma.rep0;
+
+ lzma_len(s, &s->lzma.match_len_dec, pos_state);
+
+ probs = s->lzma.dist_slot[lzma_get_dist_state(s->lzma.len)];
+ dist_slot = rc_bittree(&s->rc, probs, DIST_SLOTS) - DIST_SLOTS;
+
+ if (dist_slot < DIST_MODEL_START) {
+ s->lzma.rep0 = dist_slot;
+ } else {
+ limit = (dist_slot >> 1) - 1;
+ s->lzma.rep0 = 2 + (dist_slot & 1);
+
+ if (dist_slot < DIST_MODEL_END) {
+ s->lzma.rep0 <<= limit;
+ probs = s->lzma.dist_special + s->lzma.rep0
+ - dist_slot - 1;
+ rc_bittree_reverse(&s->rc, probs,
+ &s->lzma.rep0, limit);
+ } else {
+ rc_direct(&s->rc, &s->lzma.rep0, limit - ALIGN_BITS);
+ s->lzma.rep0 <<= ALIGN_BITS;
+ rc_bittree_reverse(&s->rc, s->lzma.dist_align,
+ &s->lzma.rep0, ALIGN_BITS);
+ }
+ }
+}
+
+/*
+ * Decode a repeated match. The distance is one of the four most recently
+ * seen matches. The distance will be stored in s->lzma.rep0.
+ */
+static void XZ_FUNC lzma_rep_match(struct xz_dec_lzma2 *s, uint32_t pos_state)
+{
+ uint32_t tmp;
+
+ if (!rc_bit(&s->rc, &s->lzma.is_rep0[s->lzma.state])) {
+ if (!rc_bit(&s->rc, &s->lzma.is_rep0_long[
+ s->lzma.state][pos_state])) {
+ lzma_state_short_rep(&s->lzma.state);
+ s->lzma.len = 1;
+ return;
+ }
+ } else {
+ if (!rc_bit(&s->rc, &s->lzma.is_rep1[s->lzma.state])) {
+ tmp = s->lzma.rep1;
+ } else {
+ if (!rc_bit(&s->rc, &s->lzma.is_rep2[s->lzma.state])) {
+ tmp = s->lzma.rep2;
+ } else {
+ tmp = s->lzma.rep3;
+ s->lzma.rep3 = s->lzma.rep2;
+ }
+
+ s->lzma.rep2 = s->lzma.rep1;
+ }
+
+ s->lzma.rep1 = s->lzma.rep0;
+ s->lzma.rep0 = tmp;
+ }
+
+ lzma_state_long_rep(&s->lzma.state);
+ lzma_len(s, &s->lzma.rep_len_dec, pos_state);
+}
+
+/* LZMA decoder core */
+static bool XZ_FUNC lzma_main(struct xz_dec_lzma2 *s)
+{
+ uint32_t pos_state;
+
+ /*
+ * If the dictionary was reached during the previous call, try to
+ * finish the possibly pending repeat in the dictionary.
+ */
+ if (dict_has_space(&s->dict) && s->lzma.len > 0)
+ dict_repeat(&s->dict, &s->lzma.len, s->lzma.rep0);
+
+ /*
+ * Decode more LZMA symbols. One iteration may consume up to
+ * LZMA_IN_REQUIRED - 1 bytes.
+ */
+ while (dict_has_space(&s->dict) && !rc_limit_exceeded(&s->rc)) {
+ pos_state = s->dict.pos & s->lzma.pos_mask;
+
+ if (!rc_bit(&s->rc, &s->lzma.is_match[
+ s->lzma.state][pos_state])) {
+ lzma_literal(s);
+ } else {
+ if (rc_bit(&s->rc, &s->lzma.is_rep[s->lzma.state]))
+ lzma_rep_match(s, pos_state);
+ else
+ lzma_match(s, pos_state);
+
+ if (!dict_repeat(&s->dict, &s->lzma.len, s->lzma.rep0))
+ return false;
+ }
+ }
+
+ /*
+ * Having the range decoder always normalized when we are outside
+ * this function makes it easier to correctly handle end of the chunk.
+ */
+ rc_normalize(&s->rc);
+
+ return true;
+}
+
+/*
+ * Reset the LZMA decoder and range decoder state. Dictionary is nore reset
+ * here, because LZMA state may be reset without resetting the dictionary.
+ */
+static void XZ_FUNC lzma_reset(struct xz_dec_lzma2 *s)
+{
+ uint16_t *probs;
+ size_t i;
+
+ s->lzma.state = STATE_LIT_LIT;
+ s->lzma.rep0 = 0;
+ s->lzma.rep1 = 0;
+ s->lzma.rep2 = 0;
+ s->lzma.rep3 = 0;
+
+ /*
+ * All probabilities are initialized to the same value. This hack
+ * makes the code smaller by avoiding a separate loop for each
+ * probability array.
+ *
+ * This could be optimized so that only that part of literal
+ * probabilities that are actually required. In the common case
+ * we would write 12 KiB less.
+ */
+ probs = s->lzma.is_match[0];
+ for (i = 0; i < PROBS_TOTAL; ++i)
+ probs[i] = RC_BIT_MODEL_TOTAL / 2;
+
+ rc_reset(&s->rc);
+}
+
+/*
+ * Decode and validate LZMA properties (lc/lp/pb) and calculate the bit masks
+ * from the decoded lp and pb values. On success, the LZMA decoder state is
+ * reset and true is returned.
+ */
+static bool XZ_FUNC lzma_props(struct xz_dec_lzma2 *s, uint8_t props)
+{
+ if (props > (4 * 5 + 4) * 9 + 8)
+ return false;
+
+ s->lzma.pos_mask = 0;
+ while (props >= 9 * 5) {
+ props -= 9 * 5;
+ ++s->lzma.pos_mask;
+ }
+
+ s->lzma.pos_mask = (1 << s->lzma.pos_mask) - 1;
+
+ s->lzma.literal_pos_mask = 0;
+ while (props >= 9) {
+ props -= 9;
+ ++s->lzma.literal_pos_mask;
+ }
+
+ s->lzma.lc = props;
+
+ if (s->lzma.lc + s->lzma.literal_pos_mask > 4)
+ return false;
+
+ s->lzma.literal_pos_mask = (1 << s->lzma.literal_pos_mask) - 1;
+
+ lzma_reset(s);
+
+ return true;
+}
+
+/*********
+ * LZMA2 *
+ *********/
+
+/*
+ * The LZMA decoder assumes that if the input limit (s->rc.in_limit) hasn't
+ * been exceeded, it is safe to read up to LZMA_IN_REQUIRED bytes. This
+ * wrapper function takes care of making the LZMA decoder's assumption safe.
+ *
+ * As long as there is plenty of input left to be decoded in the current LZMA
+ * chunk, we decode directly from the caller-supplied input buffer until
+ * there's LZMA_IN_REQUIRED bytes left. Those remaining bytes are copied into
+ * s->temp.buf, which (hopefully) gets filled on the next call to this
+ * function. We decode a few bytes from the temporary buffer so that we can
+ * continue decoding from the caller-supplied input buffer again.
+ */
+static bool XZ_FUNC lzma2_lzma(struct xz_dec_lzma2 *s, struct xz_buf *b)
+{
+ size_t in_avail;
+ uint32_t tmp;
+
+ in_avail = b->in_size - b->in_pos;
+ if (s->temp.size > 0 || s->lzma2.compressed == 0) {
+ tmp = 2 * LZMA_IN_REQUIRED - s->temp.size;
+ if (tmp > s->lzma2.compressed - s->temp.size)
+ tmp = s->lzma2.compressed - s->temp.size;
+ if (tmp > in_avail)
+ tmp = in_avail;
+
+ memcpy(s->temp.buf + s->temp.size, b->in + b->in_pos, tmp);
+
+ if (s->temp.size + tmp == s->lzma2.compressed) {
+ memzero(s->temp.buf + s->temp.size + tmp,
+ sizeof(s->temp.buf)
+ - s->temp.size - tmp);
+ s->rc.in_limit = s->temp.size + tmp;
+ } else if (s->temp.size + tmp < LZMA_IN_REQUIRED) {
+ s->temp.size += tmp;
+ b->in_pos += tmp;
+ return true;
+ } else {
+ s->rc.in_limit = s->temp.size + tmp - LZMA_IN_REQUIRED;
+ }
+
+ s->rc.in = s->temp.buf;
+ s->rc.in_pos = 0;
+
+ if (!lzma_main(s) || s->rc.in_pos > s->temp.size + tmp)
+ return false;
+
+ s->lzma2.compressed -= s->rc.in_pos;
+
+ if (s->rc.in_pos < s->temp.size) {
+ s->temp.size -= s->rc.in_pos;
+ memmove(s->temp.buf, s->temp.buf + s->rc.in_pos,
+ s->temp.size);
+ return true;
+ }
+
+ b->in_pos += s->rc.in_pos - s->temp.size;
+ s->temp.size = 0;
+ }
+
+ in_avail = b->in_size - b->in_pos;
+ if (in_avail >= LZMA_IN_REQUIRED) {
+ s->rc.in = b->in;
+ s->rc.in_pos = b->in_pos;
+
+ if (in_avail >= s->lzma2.compressed + LZMA_IN_REQUIRED)
+ s->rc.in_limit = b->in_pos + s->lzma2.compressed;
+ else
+ s->rc.in_limit = b->in_size - LZMA_IN_REQUIRED;
+
+ if (!lzma_main(s))
+ return false;
+
+ in_avail = s->rc.in_pos - b->in_pos;
+ if (in_avail > s->lzma2.compressed)
+ return false;
+
+ s->lzma2.compressed -= in_avail;
+ b->in_pos = s->rc.in_pos;
+ }
+
+ in_avail = b->in_size - b->in_pos;
+ if (in_avail < LZMA_IN_REQUIRED) {
+ if (in_avail > s->lzma2.compressed)
+ in_avail = s->lzma2.compressed;
+
+ memcpy(s->temp.buf, b->in + b->in_pos, in_avail);
+ s->temp.size = in_avail;
+ b->in_pos += in_avail;
+ }
+
+ return true;
+}
+
+/*
+ * Take care of the LZMA2 control layer, and forward the job of actual LZMA
+ * decoding or copying of uncompressed chunks to other functions.
+ */
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_lzma2_run(
+ struct xz_dec_lzma2 *s, struct xz_buf *b)
+{
+ uint32_t tmp;
+
+ while (b->in_pos < b->in_size || s->lzma2.sequence == SEQ_LZMA_RUN) {
+ switch (s->lzma2.sequence) {
+ case SEQ_CONTROL:
+ /*
+ * LZMA2 control byte
+ *
+ * Exact values:
+ * 0x00 End marker
+ * 0x01 Dictionary reset followed by
+ * an uncompressed chunk
+ * 0x02 Uncompressed chunk (no dictionary reset)
+ *
+ * Highest three bits (s->control & 0xE0):
+ * 0xE0 Dictionary reset, new properties and state
+ * reset, followed by LZMA compressed chunk
+ * 0xC0 New properties and state reset, followed
+ * by LZMA compressed chunk (no dictionary
+ * reset)
+ * 0xA0 State reset using old properties,
+ * followed by LZMA compressed chunk (no
+ * dictionary reset)
+ * 0x80 LZMA chunk (no dictionary or state reset)
+ *
+ * For LZMA compressed chunks, the lowest five bits
+ * (s->control & 1F) are the highest bits of the
+ * uncompressed size (bits 16-20).
+ *
+ * A new LZMA2 stream must begin with a dictionary
+ * reset. The first LZMA chunk must set new
+ * properties and reset the LZMA state.
+ *
+ * Values that don't match anything described above
+ * are invalid and we return XZ_DATA_ERROR.
+ */
+ tmp = b->in[b->in_pos++];
+
+ if (tmp >= 0xE0 || tmp == 0x01) {
+ s->lzma2.need_props = true;
+ s->lzma2.need_dict_reset = false;
+ dict_reset(&s->dict, b);
+ } else if (s->lzma2.need_dict_reset) {
+ return XZ_DATA_ERROR;
+ }
+
+ if (tmp >= 0x80) {
+ s->lzma2.uncompressed = (tmp & 0x1F) << 16;
+ s->lzma2.sequence = SEQ_UNCOMPRESSED_1;
+
+ if (tmp >= 0xC0) {
+ /*
+ * When there are new properties,
+ * state reset is done at
+ * SEQ_PROPERTIES.
+ */
+ s->lzma2.need_props = false;
+ s->lzma2.next_sequence
+ = SEQ_PROPERTIES;
+
+ } else if (s->lzma2.need_props) {
+ return XZ_DATA_ERROR;
+
+ } else {
+ s->lzma2.next_sequence
+ = SEQ_LZMA_PREPARE;
+ if (tmp >= 0xA0)
+ lzma_reset(s);
+ }
+ } else {
+ if (tmp == 0x00)
+ return XZ_STREAM_END;
+
+ if (tmp > 0x02)
+ return XZ_DATA_ERROR;
+
+ s->lzma2.sequence = SEQ_COMPRESSED_0;
+ s->lzma2.next_sequence = SEQ_COPY;
+ }
+
+ break;
+
+ case SEQ_UNCOMPRESSED_1:
+ s->lzma2.uncompressed
+ += (uint32_t)b->in[b->in_pos++] << 8;
+ s->lzma2.sequence = SEQ_UNCOMPRESSED_2;
+ break;
+
+ case SEQ_UNCOMPRESSED_2:
+ s->lzma2.uncompressed
+ += (uint32_t)b->in[b->in_pos++] + 1;
+ s->lzma2.sequence = SEQ_COMPRESSED_0;
+ break;
+
+ case SEQ_COMPRESSED_0:
+ s->lzma2.compressed
+ = (uint32_t)b->in[b->in_pos++] << 8;
+ s->lzma2.sequence = SEQ_COMPRESSED_1;
+ break;
+
+ case SEQ_COMPRESSED_1:
+ s->lzma2.compressed
+ += (uint32_t)b->in[b->in_pos++] + 1;
+ s->lzma2.sequence = s->lzma2.next_sequence;
+ break;
+
+ case SEQ_PROPERTIES:
+ if (!lzma_props(s, b->in[b->in_pos++]))
+ return XZ_DATA_ERROR;
+
+ s->lzma2.sequence = SEQ_LZMA_PREPARE;
+
+ case SEQ_LZMA_PREPARE:
+ if (s->lzma2.compressed < RC_INIT_BYTES)
+ return XZ_DATA_ERROR;
+
+ if (!rc_read_init(&s->rc, b))
+ return XZ_OK;
+
+ s->lzma2.compressed -= RC_INIT_BYTES;
+ s->lzma2.sequence = SEQ_LZMA_RUN;
+
+ case SEQ_LZMA_RUN:
+ /*
+ * Set dictionary limit to indicate how much we want
+ * to be encoded at maximum. Decode new data into the
+ * dictionary. Flush the new data from dictionary to
+ * b->out. Check if we finished decoding this chunk.
+ * In case the dictionary got full but we didn't fill
+ * the output buffer yet, we may run this loop
+ * multiple times without changing s->lzma2.sequence.
+ */
+ dict_limit(&s->dict, min_t(size_t,
+ b->out_size - b->out_pos,
+ s->lzma2.uncompressed));
+ if (!lzma2_lzma(s, b))
+ return XZ_DATA_ERROR;
+
+ s->lzma2.uncompressed -= dict_flush(&s->dict, b);
+
+ if (s->lzma2.uncompressed == 0) {
+ if (s->lzma2.compressed > 0 || s->lzma.len > 0
+ || !rc_is_finished(&s->rc))
+ return XZ_DATA_ERROR;
+
+ rc_reset(&s->rc);
+ s->lzma2.sequence = SEQ_CONTROL;
+
+ } else if (b->out_pos == b->out_size
+ || (b->in_pos == b->in_size
+ && s->temp.size
+ < s->lzma2.compressed)) {
+ return XZ_OK;
+ }
+
+ break;
+
+ case SEQ_COPY:
+ dict_uncompressed(&s->dict, b, &s->lzma2.compressed);
+ if (s->lzma2.compressed > 0)
+ return XZ_OK;
+
+ s->lzma2.sequence = SEQ_CONTROL;
+ break;
+ }
+ }
+
+ return XZ_OK;
+}
+
+XZ_EXTERN struct xz_dec_lzma2 * XZ_FUNC xz_dec_lzma2_create(
+ enum xz_mode mode, uint32_t dict_max)
+{
+ struct xz_dec_lzma2 *s = kmalloc(sizeof(*s), GFP_KERNEL);
+ if (s == NULL)
+ return NULL;
+
+ s->dict.mode = mode;
+ s->dict.size_max = dict_max;
+
+ if (DEC_IS_PREALLOC(mode)) {
+ s->dict.buf = vmalloc(dict_max);
+ if (s->dict.buf == NULL) {
+ kfree(s);
+ return NULL;
+ }
+ } else if (DEC_IS_DYNALLOC(mode)) {
+ s->dict.buf = NULL;
+ s->dict.allocated = 0;
+ }
+
+ return s;
+}
+
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_lzma2_reset(
+ struct xz_dec_lzma2 *s, uint8_t props)
+{
+ /* This limits dictionary size to 3 GiB to keep parsing simpler. */
+ if (props > 39)
+ return XZ_OPTIONS_ERROR;
+
+ s->dict.size = 2 + (props & 1);
+ s->dict.size <<= (props >> 1) + 11;
+
+ if (DEC_IS_MULTI(s->dict.mode)) {
+ if (s->dict.size > s->dict.size_max)
+ return XZ_MEMLIMIT_ERROR;
+
+ s->dict.end = s->dict.size;
+
+ if (DEC_IS_DYNALLOC(s->dict.mode)) {
+ if (s->dict.allocated < s->dict.size) {
+ vfree(s->dict.buf);
+ s->dict.buf = vmalloc(s->dict.size);
+ if (s->dict.buf == NULL) {
+ s->dict.allocated = 0;
+ return XZ_MEM_ERROR;
+ }
+ }
+ }
+ }
+
+ s->lzma.len = 0;
+
+ s->lzma2.sequence = SEQ_CONTROL;
+ s->lzma2.need_dict_reset = true;
+
+ s->temp.size = 0;
+
+ return XZ_OK;
+}
+
+XZ_EXTERN void XZ_FUNC xz_dec_lzma2_end(struct xz_dec_lzma2 *s)
+{
+ if (DEC_IS_MULTI(s->dict.mode))
+ vfree(s->dict.buf);
+
+ kfree(s);
+}
diff --git a/lib/qt-tar-xz/xz_dec_stream.c b/lib/qt-tar-xz/xz_dec_stream.c
new file mode 100644
index 0000000..bdcbf1b
--- /dev/null
+++ b/lib/qt-tar-xz/xz_dec_stream.c
@@ -0,0 +1,822 @@
+/*
+ * .xz Stream decoder
+ *
+ * Author: Lasse Collin <lasse.collin@tukaani.org>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#include "xz_private.h"
+#include "xz_stream.h"
+
+/* Hash used to validate the Index field */
+struct xz_dec_hash {
+ vli_type unpadded;
+ vli_type uncompressed;
+ uint32_t crc32;
+};
+
+struct xz_dec {
+ /* Position in dec_main() */
+ enum {
+ SEQ_STREAM_HEADER,
+ SEQ_BLOCK_START,
+ SEQ_BLOCK_HEADER,
+ SEQ_BLOCK_UNCOMPRESS,
+ SEQ_BLOCK_PADDING,
+ SEQ_BLOCK_CHECK,
+ SEQ_INDEX,
+ SEQ_INDEX_PADDING,
+ SEQ_INDEX_CRC32,
+ SEQ_STREAM_FOOTER
+ } sequence;
+
+ /* Position in variable-length integers and Check fields */
+ uint32_t pos;
+
+ /* Variable-length integer decoded by dec_vli() */
+ vli_type vli;
+
+ /* Saved in_pos and out_pos */
+ size_t in_start;
+ size_t out_start;
+
+ /* CRC32 value in Block or Index */
+ uint32_t crc32;
+
+ /* Type of the integrity check calculated from uncompressed data */
+ enum xz_check check_type;
+
+ /* Operation mode */
+ enum xz_mode mode;
+
+ /*
+ * True if the next call to xz_dec_run() is allowed to return
+ * XZ_BUF_ERROR.
+ */
+ bool allow_buf_error;
+
+ /* Information stored in Block Header */
+ struct {
+ /*
+ * Value stored in the Compressed Size field, or
+ * VLI_UNKNOWN if Compressed Size is not present.
+ */
+ vli_type compressed;
+
+ /*
+ * Value stored in the Uncompressed Size field, or
+ * VLI_UNKNOWN if Uncompressed Size is not present.
+ */
+ vli_type uncompressed;
+
+ /* Size of the Block Header field */
+ uint32_t size;
+ } block_header;
+
+ /* Information collected when decoding Blocks */
+ struct {
+ /* Observed compressed size of the current Block */
+ vli_type compressed;
+
+ /* Observed uncompressed size of the current Block */
+ vli_type uncompressed;
+
+ /* Number of Blocks decoded so far */
+ vli_type count;
+
+ /*
+ * Hash calculated from the Block sizes. This is used to
+ * validate the Index field.
+ */
+ struct xz_dec_hash hash;
+ } block;
+
+ /* Variables needed when verifying the Index field */
+ struct {
+ /* Position in dec_index() */
+ enum {
+ SEQ_INDEX_COUNT,
+ SEQ_INDEX_UNPADDED,
+ SEQ_INDEX_UNCOMPRESSED
+ } sequence;
+
+ /* Size of the Index in bytes */
+ vli_type size;
+
+ /* Number of Records (matches block.count in valid files) */
+ vli_type count;
+
+ /*
+ * Hash calculated from the Records (matches block.hash in
+ * valid files).
+ */
+ struct xz_dec_hash hash;
+ } index;
+
+ /*
+ * Temporary buffer needed to hold Stream Header, Block Header,
+ * and Stream Footer. The Block Header is the biggest (1 KiB)
+ * so we reserve space according to that. buf[] has to be aligned
+ * to a multiple of four bytes; the size_t variables before it
+ * should guarantee this.
+ */
+ struct {
+ size_t pos;
+ size_t size;
+ uint8_t buf[1024];
+ } temp;
+
+ struct xz_dec_lzma2 *lzma2;
+
+#ifdef XZ_DEC_BCJ
+ struct xz_dec_bcj *bcj;
+ bool bcj_active;
+#endif
+};
+
+#ifdef XZ_DEC_ANY_CHECK
+/* Sizes of the Check field with different Check IDs */
+static const uint8_t check_sizes[16] = {
+ 0,
+ 4, 4, 4,
+ 8, 8, 8,
+ 16, 16, 16,
+ 32, 32, 32,
+ 64, 64, 64
+};
+#endif
+
+/*
+ * Fill s->temp by copying data starting from b->in[b->in_pos]. Caller
+ * must have set s->temp.pos to indicate how much data we are supposed
+ * to copy into s->temp.buf. Return true once s->temp.pos has reached
+ * s->temp.size.
+ */
+static bool XZ_FUNC fill_temp(struct xz_dec *s, struct xz_buf *b)
+{
+ size_t copy_size = min_t(size_t,
+ b->in_size - b->in_pos, s->temp.size - s->temp.pos);
+
+ memcpy(s->temp.buf + s->temp.pos, b->in + b->in_pos, copy_size);
+ b->in_pos += copy_size;
+ s->temp.pos += copy_size;
+
+ if (s->temp.pos == s->temp.size) {
+ s->temp.pos = 0;
+ return true;
+ }
+
+ return false;
+}
+
+/* Decode a variable-length integer (little-endian base-128 encoding) */
+static enum xz_ret XZ_FUNC dec_vli(struct xz_dec *s,
+ const uint8_t *in, size_t *in_pos, size_t in_size)
+{
+ uint8_t byte;
+
+ if (s->pos == 0)
+ s->vli = 0;
+
+ while (*in_pos < in_size) {
+ byte = in[*in_pos];
+ ++*in_pos;
+
+ s->vli |= (vli_type)(byte & 0x7F) << s->pos;
+
+ if ((byte & 0x80) == 0) {
+ /* Don't allow non-minimal encodings. */
+ if (byte == 0 && s->pos != 0)
+ return XZ_DATA_ERROR;
+
+ s->pos = 0;
+ return XZ_STREAM_END;
+ }
+
+ s->pos += 7;
+ if (s->pos == 7 * VLI_BYTES_MAX)
+ return XZ_DATA_ERROR;
+ }
+
+ return XZ_OK;
+}
+
+/*
+ * Decode the Compressed Data field from a Block. Update and validate
+ * the observed compressed and uncompressed sizes of the Block so that
+ * they don't exceed the values possibly stored in the Block Header
+ * (validation assumes that no integer overflow occurs, since vli_type
+ * is normally uint64_t). Update the CRC32 if presence of the CRC32
+ * field was indicated in Stream Header.
+ *
+ * Once the decoding is finished, validate that the observed sizes match
+ * the sizes possibly stored in the Block Header. Update the hash and
+ * Block count, which are later used to validate the Index field.
+ */
+static enum xz_ret XZ_FUNC dec_block(struct xz_dec *s, struct xz_buf *b)
+{
+ enum xz_ret ret;
+
+ s->in_start = b->in_pos;
+ s->out_start = b->out_pos;
+
+#ifdef XZ_DEC_BCJ
+ if (s->bcj_active)
+ ret = xz_dec_bcj_run(s->bcj, s->lzma2, b);
+ else
+#endif
+ ret = xz_dec_lzma2_run(s->lzma2, b);
+
+ s->block.compressed += b->in_pos - s->in_start;
+ s->block.uncompressed += b->out_pos - s->out_start;
+
+ /*
+ * There is no need to separately check for VLI_UNKNOWN, since
+ * the observed sizes are always smaller than VLI_UNKNOWN.
+ */
+ if (s->block.compressed > s->block_header.compressed
+ || s->block.uncompressed
+ > s->block_header.uncompressed)
+ return XZ_DATA_ERROR;
+
+ if (s->check_type == XZ_CHECK_CRC32)
+ s->crc32 = xz_crc32(b->out + s->out_start,
+ b->out_pos - s->out_start, s->crc32);
+
+ if (ret == XZ_STREAM_END) {
+ if (s->block_header.compressed != VLI_UNKNOWN
+ && s->block_header.compressed
+ != s->block.compressed)
+ return XZ_DATA_ERROR;
+
+ if (s->block_header.uncompressed != VLI_UNKNOWN
+ && s->block_header.uncompressed
+ != s->block.uncompressed)
+ return XZ_DATA_ERROR;
+
+ s->block.hash.unpadded += s->block_header.size
+ + s->block.compressed;
+
+#ifdef XZ_DEC_ANY_CHECK
+ s->block.hash.unpadded += check_sizes[s->check_type];
+#else
+ if (s->check_type == XZ_CHECK_CRC32)
+ s->block.hash.unpadded += 4;
+#endif
+
+ s->block.hash.uncompressed += s->block.uncompressed;
+ s->block.hash.crc32 = xz_crc32(
+ (const uint8_t *)&s->block.hash,
+ sizeof(s->block.hash), s->block.hash.crc32);
+
+ ++s->block.count;
+ }
+
+ return ret;
+}
+
+/* Update the Index size and the CRC32 value. */
+static void XZ_FUNC index_update(struct xz_dec *s, const struct xz_buf *b)
+{
+ size_t in_used = b->in_pos - s->in_start;
+ s->index.size += in_used;
+ s->crc32 = xz_crc32(b->in + s->in_start, in_used, s->crc32);
+}
+
+/*
+ * Decode the Number of Records, Unpadded Size, and Uncompressed Size
+ * fields from the Index field. That is, Index Padding and CRC32 are not
+ * decoded by this function.
+ *
+ * This can return XZ_OK (more input needed), XZ_STREAM_END (everything
+ * successfully decoded), or XZ_DATA_ERROR (input is corrupt).
+ */
+static enum xz_ret XZ_FUNC dec_index(struct xz_dec *s, struct xz_buf *b)
+{
+ enum xz_ret ret;
+
+ do {
+ ret = dec_vli(s, b->in, &b->in_pos, b->in_size);
+ if (ret != XZ_STREAM_END) {
+ index_update(s, b);
+ return ret;
+ }
+
+ switch (s->index.sequence) {
+ case SEQ_INDEX_COUNT:
+ s->index.count = s->vli;
+
+ /*
+ * Validate that the Number of Records field
+ * indicates the same number of Records as
+ * there were Blocks in the Stream.
+ */
+ if (s->index.count != s->block.count)
+ return XZ_DATA_ERROR;
+
+ s->index.sequence = SEQ_INDEX_UNPADDED;
+ break;
+
+ case SEQ_INDEX_UNPADDED:
+ s->index.hash.unpadded += s->vli;
+ s->index.sequence = SEQ_INDEX_UNCOMPRESSED;
+ break;
+
+ case SEQ_INDEX_UNCOMPRESSED:
+ s->index.hash.uncompressed += s->vli;
+ s->index.hash.crc32 = xz_crc32(
+ (const uint8_t *)&s->index.hash,
+ sizeof(s->index.hash),
+ s->index.hash.crc32);
+ --s->index.count;
+ s->index.sequence = SEQ_INDEX_UNPADDED;
+ break;
+ }
+ } while (s->index.count > 0);
+
+ return XZ_STREAM_END;
+}
+
+/*
+ * Validate that the next four input bytes match the value of s->crc32.
+ * s->pos must be zero when starting to validate the first byte.
+ */
+static enum xz_ret XZ_FUNC crc32_validate(struct xz_dec *s, struct xz_buf *b)
+{
+ do {
+ if (b->in_pos == b->in_size)
+ return XZ_OK;
+
+ if (((s->crc32 >> s->pos) & 0xFF) != b->in[b->in_pos++])
+ return XZ_DATA_ERROR;
+
+ s->pos += 8;
+
+ } while (s->pos < 32);
+
+ s->crc32 = 0;
+ s->pos = 0;
+
+ return XZ_STREAM_END;
+}
+
+#ifdef XZ_DEC_ANY_CHECK
+/*
+ * Skip over the Check field when the Check ID is not supported.
+ * Returns true once the whole Check field has been skipped over.
+ */
+static bool XZ_FUNC check_skip(struct xz_dec *s, struct xz_buf *b)
+{
+ while (s->pos < check_sizes[s->check_type]) {
+ if (b->in_pos == b->in_size)
+ return false;
+
+ ++b->in_pos;
+ ++s->pos;
+ }
+
+ s->pos = 0;
+
+ return true;
+}
+#endif
+
+/* Decode the Stream Header field (the first 12 bytes of the .xz Stream). */
+static enum xz_ret XZ_FUNC dec_stream_header(struct xz_dec *s)
+{
+ if (!memeq(s->temp.buf, HEADER_MAGIC, HEADER_MAGIC_SIZE))
+ return XZ_FORMAT_ERROR;
+
+ if (xz_crc32(s->temp.buf + HEADER_MAGIC_SIZE, 2, 0)
+ != get_le32(s->temp.buf + HEADER_MAGIC_SIZE + 2))
+ return XZ_DATA_ERROR;
+
+ if (s->temp.buf[HEADER_MAGIC_SIZE] != 0)
+ return XZ_OPTIONS_ERROR;
+
+ /*
+ * Of integrity checks, we support only none (Check ID = 0) and
+ * CRC32 (Check ID = 1). However, if XZ_DEC_ANY_CHECK is defined,
+ * we will accept other check types too, but then the check won't
+ * be verified and a warning (XZ_UNSUPPORTED_CHECK) will be given.
+ */
+ s->check_type = s->temp.buf[HEADER_MAGIC_SIZE + 1];
+
+#ifdef XZ_DEC_ANY_CHECK
+ if (s->check_type > XZ_CHECK_MAX)
+ return XZ_OPTIONS_ERROR;
+
+ if (s->check_type > XZ_CHECK_CRC32)
+ return XZ_UNSUPPORTED_CHECK;
+#else
+ if (s->check_type > XZ_CHECK_CRC32)
+ return XZ_OPTIONS_ERROR;
+#endif
+
+ return XZ_OK;
+}
+
+/* Decode the Stream Footer field (the last 12 bytes of the .xz Stream) */
+static enum xz_ret XZ_FUNC dec_stream_footer(struct xz_dec *s)
+{
+ if (!memeq(s->temp.buf + 10, FOOTER_MAGIC, FOOTER_MAGIC_SIZE))
+ return XZ_DATA_ERROR;
+
+ if (xz_crc32(s->temp.buf + 4, 6, 0) != get_le32(s->temp.buf))
+ return XZ_DATA_ERROR;
+
+ /*
+ * Validate Backward Size. Note that we never added the size of the
+ * Index CRC32 field to s->index.size, thus we use s->index.size / 4
+ * instead of s->index.size / 4 - 1.
+ */
+ if ((s->index.size >> 2) != get_le32(s->temp.buf + 4))
+ return XZ_DATA_ERROR;
+
+ if (s->temp.buf[8] != 0 || s->temp.buf[9] != s->check_type)
+ return XZ_DATA_ERROR;
+
+ /*
+ * Use XZ_STREAM_END instead of XZ_OK to be more convenient
+ * for the caller.
+ */
+ return XZ_STREAM_END;
+}
+
+/* Decode the Block Header and initialize the filter chain. */
+static enum xz_ret XZ_FUNC dec_block_header(struct xz_dec *s)
+{
+ enum xz_ret ret;
+
+ /*
+ * Validate the CRC32. We know that the temp buffer is at least
+ * eight bytes so this is safe.
+ */
+ s->temp.size -= 4;
+ if (xz_crc32(s->temp.buf, s->temp.size, 0)
+ != get_le32(s->temp.buf + s->temp.size))
+ return XZ_DATA_ERROR;
+
+ s->temp.pos = 2;
+
+ /*
+ * Catch unsupported Block Flags. We support only one or two filters
+ * in the chain, so we catch that with the same test.
+ */
+#ifdef XZ_DEC_BCJ
+ if (s->temp.buf[1] & 0x3E)
+#else
+ if (s->temp.buf[1] & 0x3F)
+#endif
+ return XZ_OPTIONS_ERROR;
+
+ /* Compressed Size */
+ if (s->temp.buf[1] & 0x40) {
+ if (dec_vli(s, s->temp.buf, &s->temp.pos, s->temp.size)
+ != XZ_STREAM_END)
+ return XZ_DATA_ERROR;
+
+ s->block_header.compressed = s->vli;
+ } else {
+ s->block_header.compressed = VLI_UNKNOWN;
+ }
+
+ /* Uncompressed Size */
+ if (s->temp.buf[1] & 0x80) {
+ if (dec_vli(s, s->temp.buf, &s->temp.pos, s->temp.size)
+ != XZ_STREAM_END)
+ return XZ_DATA_ERROR;
+
+ s->block_header.uncompressed = s->vli;
+ } else {
+ s->block_header.uncompressed = VLI_UNKNOWN;
+ }
+
+#ifdef XZ_DEC_BCJ
+ /* If there are two filters, the first one must be a BCJ filter. */
+ s->bcj_active = s->temp.buf[1] & 0x01;
+ if (s->bcj_active) {
+ if (s->temp.size - s->temp.pos < 2)
+ return XZ_OPTIONS_ERROR;
+
+ ret = xz_dec_bcj_reset(s->bcj, s->temp.buf[s->temp.pos++]);
+ if (ret != XZ_OK)
+ return ret;
+
+ /*
+ * We don't support custom start offset,
+ * so Size of Properties must be zero.
+ */
+ if (s->temp.buf[s->temp.pos++] != 0x00)
+ return XZ_OPTIONS_ERROR;
+ }
+#endif
+
+ /* Valid Filter Flags always take at least two bytes. */
+ if (s->temp.size - s->temp.pos < 2)
+ return XZ_DATA_ERROR;
+
+ /* Filter ID = LZMA2 */
+ if (s->temp.buf[s->temp.pos++] != 0x21)
+ return XZ_OPTIONS_ERROR;
+
+ /* Size of Properties = 1-byte Filter Properties */
+ if (s->temp.buf[s->temp.pos++] != 0x01)
+ return XZ_OPTIONS_ERROR;
+
+ /* Filter Properties contains LZMA2 dictionary size. */
+ if (s->temp.size - s->temp.pos < 1)
+ return XZ_DATA_ERROR;
+
+ ret = xz_dec_lzma2_reset(s->lzma2, s->temp.buf[s->temp.pos++]);
+ if (ret != XZ_OK)
+ return ret;
+
+ /* The rest must be Header Padding. */
+ while (s->temp.pos < s->temp.size)
+ if (s->temp.buf[s->temp.pos++] != 0x00)
+ return XZ_OPTIONS_ERROR;
+
+ s->temp.pos = 0;
+ s->block.compressed = 0;
+ s->block.uncompressed = 0;
+
+ return XZ_OK;
+}
+
+static enum xz_ret XZ_FUNC dec_main(struct xz_dec *s, struct xz_buf *b)
+{
+ enum xz_ret ret;
+
+ /*
+ * Store the start position for the case when we are in the middle
+ * of the Index field.
+ */
+ s->in_start = b->in_pos;
+
+ while (true) {
+ switch (s->sequence) {
+ case SEQ_STREAM_HEADER:
+ /*
+ * Stream Header is copied to s->temp, and then
+ * decoded from there. This way if the caller
+ * gives us only little input at a time, we can
+ * still keep the Stream Header decoding code
+ * simple. Similar approach is used in many places
+ * in this file.
+ */
+ if (!fill_temp(s, b))
+ return XZ_OK;
+
+ /*
+ * If dec_stream_header() returns
+ * XZ_UNSUPPORTED_CHECK, it is still possible
+ * to continue decoding if working in multi-call
+ * mode. Thus, update s->sequence before calling
+ * dec_stream_header().
+ */
+ s->sequence = SEQ_BLOCK_START;
+
+ ret = dec_stream_header(s);
+ if (ret != XZ_OK)
+ return ret;
+
+ case SEQ_BLOCK_START:
+ /* We need one byte of input to continue. */
+ if (b->in_pos == b->in_size)
+ return XZ_OK;
+
+ /* See if this is the beginning of the Index field. */
+ if (b->in[b->in_pos] == 0) {
+ s->in_start = b->in_pos++;
+ s->sequence = SEQ_INDEX;
+ break;
+ }
+
+ /*
+ * Calculate the size of the Block Header and
+ * prepare to decode it.
+ */
+ s->block_header.size
+ = ((uint32_t)b->in[b->in_pos] + 1) * 4;
+
+ s->temp.size = s->block_header.size;
+ s->temp.pos = 0;
+ s->sequence = SEQ_BLOCK_HEADER;
+
+ case SEQ_BLOCK_HEADER:
+ if (!fill_temp(s, b))
+ return XZ_OK;
+
+ ret = dec_block_header(s);
+ if (ret != XZ_OK)
+ return ret;
+
+ s->sequence = SEQ_BLOCK_UNCOMPRESS;
+
+ case SEQ_BLOCK_UNCOMPRESS:
+ ret = dec_block(s, b);
+ if (ret != XZ_STREAM_END)
+ return ret;
+
+ s->sequence = SEQ_BLOCK_PADDING;
+
+ case SEQ_BLOCK_PADDING:
+ /*
+ * Size of Compressed Data + Block Padding
+ * must be a multiple of four. We don't need
+ * s->block.compressed for anything else
+ * anymore, so we use it here to test the size
+ * of the Block Padding field.
+ */
+ while (s->block.compressed & 3) {
+ if (b->in_pos == b->in_size)
+ return XZ_OK;
+
+ if (b->in[b->in_pos++] != 0)
+ return XZ_DATA_ERROR;
+
+ ++s->block.compressed;
+ }
+
+ s->sequence = SEQ_BLOCK_CHECK;
+
+ case SEQ_BLOCK_CHECK:
+ if (s->check_type == XZ_CHECK_CRC32) {
+ ret = crc32_validate(s, b);
+ if (ret != XZ_STREAM_END)
+ return ret;
+ }
+#ifdef XZ_DEC_ANY_CHECK
+ else if (!check_skip(s, b)) {
+ return XZ_OK;
+ }
+#endif
+
+ s->sequence = SEQ_BLOCK_START;
+ break;
+
+ case SEQ_INDEX:
+ ret = dec_index(s, b);
+ if (ret != XZ_STREAM_END)
+ return ret;
+
+ s->sequence = SEQ_INDEX_PADDING;
+
+ case SEQ_INDEX_PADDING:
+ while ((s->index.size + (b->in_pos - s->in_start))
+ & 3) {
+ if (b->in_pos == b->in_size) {
+ index_update(s, b);
+ return XZ_OK;
+ }
+
+ if (b->in[b->in_pos++] != 0)
+ return XZ_DATA_ERROR;
+ }
+
+ /* Finish the CRC32 value and Index size. */
+ index_update(s, b);
+
+ /* Compare the hashes to validate the Index field. */
+ if (!memeq(&s->block.hash, &s->index.hash,
+ sizeof(s->block.hash)))
+ return XZ_DATA_ERROR;
+
+ s->sequence = SEQ_INDEX_CRC32;
+
+ case SEQ_INDEX_CRC32:
+ ret = crc32_validate(s, b);
+ if (ret != XZ_STREAM_END)
+ return ret;
+
+ s->temp.size = STREAM_HEADER_SIZE;
+ s->sequence = SEQ_STREAM_FOOTER;
+
+ case SEQ_STREAM_FOOTER:
+ if (!fill_temp(s, b))
+ return XZ_OK;
+
+ return dec_stream_footer(s);
+ }
+ }
+
+ /* Never reached */
+}
+
+/*
+ * xz_dec_run() is a wrapper for dec_main() to handle some special cases in
+ * multi-call and single-call decoding.
+ *
+ * In multi-call mode, we must return XZ_BUF_ERROR when it seems clear that we
+ * are not going to make any progress anymore. This is to prevent the caller
+ * from calling us infinitely when the input file is truncated or otherwise
+ * corrupt. Since zlib-style API allows that the caller fills the input buffer
+ * only when the decoder doesn't produce any new output, we have to be careful
+ * to avoid returning XZ_BUF_ERROR too easily: XZ_BUF_ERROR is returned only
+ * after the second consecutive call to xz_dec_run() that makes no progress.
+ *
+ * In single-call mode, if we couldn't decode everything and no error
+ * occurred, either the input is truncated or the output buffer is too small.
+ * Since we know that the last input byte never produces any output, we know
+ * that if all the input was consumed and decoding wasn't finished, the file
+ * must be corrupt. Otherwise the output buffer has to be too small or the
+ * file is corrupt in a way that decoding it produces too big output.
+ *
+ * If single-call decoding fails, we reset b->in_pos and b->out_pos back to
+ * their original values. This is because with some filter chains there won't
+ * be any valid uncompressed data in the output buffer unless the decoding
+ * actually succeeds (that's the price to pay of using the output buffer as
+ * the workspace).
+ */
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_run(struct xz_dec *s, struct xz_buf *b)
+{
+ size_t in_start;
+ size_t out_start;
+ enum xz_ret ret;
+
+ if (DEC_IS_SINGLE(s->mode))
+ xz_dec_reset(s);
+
+ in_start = b->in_pos;
+ out_start = b->out_pos;
+ ret = dec_main(s, b);
+
+ if (DEC_IS_SINGLE(s->mode)) {
+ if (ret == XZ_OK)
+ ret = b->in_pos == b->in_size
+ ? XZ_DATA_ERROR : XZ_BUF_ERROR;
+
+ if (ret != XZ_STREAM_END) {
+ b->in_pos = in_start;
+ b->out_pos = out_start;
+ }
+
+ } else if (ret == XZ_OK && in_start == b->in_pos
+ && out_start == b->out_pos) {
+ if (s->allow_buf_error)
+ ret = XZ_BUF_ERROR;
+
+ s->allow_buf_error = true;
+ } else {
+ s->allow_buf_error = false;
+ }
+
+ return ret;
+}
+
+XZ_EXTERN struct xz_dec * XZ_FUNC xz_dec_init(
+ enum xz_mode mode, uint32_t dict_max)
+{
+ struct xz_dec *s = kmalloc(sizeof(*s), GFP_KERNEL);
+ if (s == NULL)
+ return NULL;
+
+ s->mode = mode;
+
+#ifdef XZ_DEC_BCJ
+ s->bcj = xz_dec_bcj_create(DEC_IS_SINGLE(mode));
+ if (s->bcj == NULL)
+ goto error_bcj;
+#endif
+
+ s->lzma2 = xz_dec_lzma2_create(mode, dict_max);
+ if (s->lzma2 == NULL)
+ goto error_lzma2;
+
+ xz_dec_reset(s);
+ return s;
+
+error_lzma2:
+#ifdef XZ_DEC_BCJ
+ xz_dec_bcj_end(s->bcj);
+error_bcj:
+#endif
+ kfree(s);
+ return NULL;
+}
+
+XZ_EXTERN void XZ_FUNC xz_dec_reset(struct xz_dec *s)
+{
+ s->sequence = SEQ_STREAM_HEADER;
+ s->allow_buf_error = false;
+ s->pos = 0;
+ s->crc32 = 0;
+ memzero(&s->block, sizeof(s->block));
+ memzero(&s->index, sizeof(s->index));
+ s->temp.pos = 0;
+ s->temp.size = STREAM_HEADER_SIZE;
+}
+
+XZ_EXTERN void XZ_FUNC xz_dec_end(struct xz_dec *s)
+{
+ if (s != NULL) {
+ xz_dec_lzma2_end(s->lzma2);
+#ifdef XZ_DEC_BCJ
+ xz_dec_bcj_end(s->bcj);
+#endif
+ kfree(s);
+ }
+}
diff --git a/lib/qt-tar-xz/xz_lzma2.h b/lib/qt-tar-xz/xz_lzma2.h
new file mode 100644
index 0000000..47f21af
--- /dev/null
+++ b/lib/qt-tar-xz/xz_lzma2.h
@@ -0,0 +1,204 @@
+/*
+ * LZMA2 definitions
+ *
+ * Authors: Lasse Collin <lasse.collin@tukaani.org>
+ * Igor Pavlov <http://7-zip.org/>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#ifndef XZ_LZMA2_H
+#define XZ_LZMA2_H
+
+/* Range coder constants */
+#define RC_SHIFT_BITS 8
+#define RC_TOP_BITS 24
+#define RC_TOP_VALUE (1 << RC_TOP_BITS)
+#define RC_BIT_MODEL_TOTAL_BITS 11
+#define RC_BIT_MODEL_TOTAL (1 << RC_BIT_MODEL_TOTAL_BITS)
+#define RC_MOVE_BITS 5
+
+/*
+ * Maximum number of position states. A position state is the lowest pb
+ * number of bits of the current uncompressed offset. In some places there
+ * are different sets of probabilities for different position states.
+ */
+#define POS_STATES_MAX (1 << 4)
+
+/*
+ * This enum is used to track which LZMA symbols have occurred most recently
+ * and in which order. This information is used to predict the next symbol.
+ *
+ * Symbols:
+ * - Literal: One 8-bit byte
+ * - Match: Repeat a chunk of data at some distance
+ * - Long repeat: Multi-byte match at a recently seen distance
+ * - Short repeat: One-byte repeat at a recently seen distance
+ *
+ * The symbol names are in from STATE_oldest_older_previous. REP means
+ * either short or long repeated match, and NONLIT means any non-literal.
+ */
+enum lzma_state {
+ STATE_LIT_LIT,
+ STATE_MATCH_LIT_LIT,
+ STATE_REP_LIT_LIT,
+ STATE_SHORTREP_LIT_LIT,
+ STATE_MATCH_LIT,
+ STATE_REP_LIT,
+ STATE_SHORTREP_LIT,
+ STATE_LIT_MATCH,
+ STATE_LIT_LONGREP,
+ STATE_LIT_SHORTREP,
+ STATE_NONLIT_MATCH,
+ STATE_NONLIT_REP
+};
+
+/* Total number of states */
+#define STATES 12
+
+/* The lowest 7 states indicate that the previous state was a literal. */
+#define LIT_STATES 7
+
+/* Indicate that the latest symbol was a literal. */
+static inline void XZ_FUNC lzma_state_literal(enum lzma_state *state)
+{
+ if (*state <= STATE_SHORTREP_LIT_LIT)
+ *state = STATE_LIT_LIT;
+ else if (*state <= STATE_LIT_SHORTREP)
+ *state -= 3;
+ else
+ *state -= 6;
+}
+
+/* Indicate that the latest symbol was a match. */
+static inline void XZ_FUNC lzma_state_match(enum lzma_state *state)
+{
+ *state = *state < LIT_STATES ? STATE_LIT_MATCH : STATE_NONLIT_MATCH;
+}
+
+/* Indicate that the latest state was a long repeated match. */
+static inline void XZ_FUNC lzma_state_long_rep(enum lzma_state *state)
+{
+ *state = *state < LIT_STATES ? STATE_LIT_LONGREP : STATE_NONLIT_REP;
+}
+
+/* Indicate that the latest symbol was a short match. */
+static inline void XZ_FUNC lzma_state_short_rep(enum lzma_state *state)
+{
+ *state = *state < LIT_STATES ? STATE_LIT_SHORTREP : STATE_NONLIT_REP;
+}
+
+/* Test if the previous symbol was a literal. */
+static inline bool XZ_FUNC lzma_state_is_literal(enum lzma_state state)
+{
+ return state < LIT_STATES;
+}
+
+/* Each literal coder is divided in three sections:
+ * - 0x001-0x0FF: Without match byte
+ * - 0x101-0x1FF: With match byte; match bit is 0
+ * - 0x201-0x2FF: With match byte; match bit is 1
+ *
+ * Match byte is used when the previous LZMA symbol was something else than
+ * a literal (that is, it was some kind of match).
+ */
+#define LITERAL_CODER_SIZE 0x300
+
+/* Maximum number of literal coders */
+#define LITERAL_CODERS_MAX (1 << 4)
+
+/* Minimum length of a match is two bytes. */
+#define MATCH_LEN_MIN 2
+
+/* Match length is encoded with 4, 5, or 10 bits.
+ *
+ * Length Bits
+ * 2-9 4 = Choice=0 + 3 bits
+ * 10-17 5 = Choice=1 + Choice2=0 + 3 bits
+ * 18-273 10 = Choice=1 + Choice2=1 + 8 bits
+ */
+#define LEN_LOW_BITS 3
+#define LEN_LOW_SYMBOLS (1 << LEN_LOW_BITS)
+#define LEN_MID_BITS 3
+#define LEN_MID_SYMBOLS (1 << LEN_MID_BITS)
+#define LEN_HIGH_BITS 8
+#define LEN_HIGH_SYMBOLS (1 << LEN_HIGH_BITS)
+#define LEN_SYMBOLS (LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS + LEN_HIGH_SYMBOLS)
+
+/*
+ * Maximum length of a match is 273 which is a result of the encoding
+ * described above.
+ */
+#define MATCH_LEN_MAX (MATCH_LEN_MIN + LEN_SYMBOLS - 1)
+
+/*
+ * Different sets of probabilities are used for match distances that have
+ * very short match length: Lengths of 2, 3, and 4 bytes have a separate
+ * set of probabilities for each length. The matches with longer length
+ * use a shared set of probabilities.
+ */
+#define DIST_STATES 4
+
+/*
+ * Get the index of the appropriate probability array for decoding
+ * the distance slot.
+ */
+static inline uint32_t XZ_FUNC lzma_get_dist_state(uint32_t len)
+{
+ return len < DIST_STATES + MATCH_LEN_MIN
+ ? len - MATCH_LEN_MIN : DIST_STATES - 1;
+}
+
+/*
+ * The highest two bits of a 32-bit match distance are encoded using six bits.
+ * This six-bit value is called a distance slot. This way encoding a 32-bit
+ * value takes 6-36 bits, larger values taking more bits.
+ */
+#define DIST_SLOT_BITS 6
+#define DIST_SLOTS (1 << DIST_SLOT_BITS)
+
+/* Match distances up to 127 are fully encoded using probabilities. Since
+ * the highest two bits (distance slot) are always encoded using six bits,
+ * the distances 0-3 don't need any additional bits to encode, since the
+ * distance slot itself is the same as the actual distance. DIST_MODEL_START
+ * indicates the first distance slot where at least one additional bit is
+ * needed.
+ */
+#define DIST_MODEL_START 4
+
+/*
+ * Match distances greater than 127 are encoded in three pieces:
+ * - distance slot: the highest two bits
+ * - direct bits: 2-26 bits below the highest two bits
+ * - alignment bits: four lowest bits
+ *
+ * Direct bits don't use any probabilities.
+ *
+ * The distance slot value of 14 is for distances 128-191.
+ */
+#define DIST_MODEL_END 14
+
+/* Distance slots that indicate a distance <= 127. */
+#define FULL_DISTANCES_BITS (DIST_MODEL_END / 2)
+#define FULL_DISTANCES (1 << FULL_DISTANCES_BITS)
+
+/*
+ * For match distances greater than 127, only the highest two bits and the
+ * lowest four bits (alignment) is encoded using probabilities.
+ */
+#define ALIGN_BITS 4
+#define ALIGN_SIZE (1 << ALIGN_BITS)
+#define ALIGN_MASK (ALIGN_SIZE - 1)
+
+/* Total number of all probability variables */
+#define PROBS_TOTAL (1846 + LITERAL_CODERS_MAX * LITERAL_CODER_SIZE)
+
+/*
+ * LZMA remembers the four most recent match distances. Reusing these
+ * distances tends to take less space than re-encoding the actual
+ * distance value.
+ */
+#define REPS 4
+
+#endif
diff --git a/lib/qt-tar-xz/xz_private.h b/lib/qt-tar-xz/xz_private.h
new file mode 100644
index 0000000..145649a
--- /dev/null
+++ b/lib/qt-tar-xz/xz_private.h
@@ -0,0 +1,159 @@
+/*
+ * Private includes and definitions
+ *
+ * Author: Lasse Collin <lasse.collin@tukaani.org>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#ifndef XZ_PRIVATE_H
+#define XZ_PRIVATE_H
+
+#ifdef __KERNEL__
+ /* XZ_PREBOOT may be defined only via decompress_unxz.c. */
+# ifndef XZ_PREBOOT
+# include <linux/slab.h>
+# include <linux/vmalloc.h>
+# include <linux/string.h>
+# define memeq(a, b, size) (memcmp(a, b, size) == 0)
+# define memzero(buf, size) memset(buf, 0, size)
+# endif
+# include <asm/byteorder.h>
+# include <asm/unaligned.h>
+# define get_le32(p) le32_to_cpup((const uint32_t *)(p))
+ /* XZ_IGNORE_KCONFIG may be defined only via decompress_unxz.c. */
+# ifndef XZ_IGNORE_KCONFIG
+# ifdef CONFIG_XZ_DEC_X86
+# define XZ_DEC_X86
+# endif
+# ifdef CONFIG_XZ_DEC_POWERPC
+# define XZ_DEC_POWERPC
+# endif
+# ifdef CONFIG_XZ_DEC_IA64
+# define XZ_DEC_IA64
+# endif
+# ifdef CONFIG_XZ_DEC_ARM
+# define XZ_DEC_ARM
+# endif
+# ifdef CONFIG_XZ_DEC_ARMTHUMB
+# define XZ_DEC_ARMTHUMB
+# endif
+# ifdef CONFIG_XZ_DEC_SPARC
+# define XZ_DEC_SPARC
+# endif
+# endif
+# include <linux/xz.h>
+#else
+ /*
+ * For userspace builds, use a separate header to define the required
+ * macros and functions. This makes it easier to adapt the code into
+ * different environments and avoids clutter in the Linux kernel tree.
+ */
+# include "xz_config.h"
+#endif
+
+/* If no specific decoding mode is requested, enable support for all modes. */
+#if !defined(XZ_DEC_SINGLE) && !defined(XZ_DEC_PREALLOC) \
+ && !defined(XZ_DEC_DYNALLOC)
+# define XZ_DEC_SINGLE
+# define XZ_DEC_PREALLOC
+# define XZ_DEC_DYNALLOC
+#endif
+
+/*
+ * The DEC_IS_foo(mode) macros are used in "if" statements. If only some
+ * of the supported modes are enabled, these macros will evaluate to true or
+ * false at compile time and thus allow the compiler to omit unneeded code.
+ */
+#ifdef XZ_DEC_SINGLE
+# define DEC_IS_SINGLE(mode) ((mode) == XZ_SINGLE)
+#else
+# define DEC_IS_SINGLE(mode) (false)
+#endif
+
+#ifdef XZ_DEC_PREALLOC
+# define DEC_IS_PREALLOC(mode) ((mode) == XZ_PREALLOC)
+#else
+# define DEC_IS_PREALLOC(mode) (false)
+#endif
+
+#ifdef XZ_DEC_DYNALLOC
+# define DEC_IS_DYNALLOC(mode) ((mode) == XZ_DYNALLOC)
+#else
+# define DEC_IS_DYNALLOC(mode) (false)
+#endif
+
+#if !defined(XZ_DEC_SINGLE)
+# define DEC_IS_MULTI(mode) (true)
+#elif defined(XZ_DEC_PREALLOC) || defined(XZ_DEC_DYNALLOC)
+# define DEC_IS_MULTI(mode) ((mode) != XZ_SINGLE)
+#else
+# define DEC_IS_MULTI(mode) (false)
+#endif
+
+/*
+ * If any of the BCJ filter decoders are wanted, define XZ_DEC_BCJ.
+ * XZ_DEC_BCJ is used to enable generic support for BCJ decoders.
+ */
+#ifndef XZ_DEC_BCJ
+# if defined(XZ_DEC_X86) || defined(XZ_DEC_POWERPC) \
+ || defined(XZ_DEC_IA64) || defined(XZ_DEC_ARM) \
+ || defined(XZ_DEC_ARM) || defined(XZ_DEC_ARMTHUMB) \
+ || defined(XZ_DEC_SPARC)
+# define XZ_DEC_BCJ
+# endif
+#endif
+
+/*
+ * Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used
+ * before calling xz_dec_lzma2_run().
+ */
+XZ_EXTERN struct xz_dec_lzma2 * XZ_FUNC xz_dec_lzma2_create(
+ enum xz_mode mode, uint32_t dict_max);
+
+/*
+ * Decode the LZMA2 properties (one byte) and reset the decoder. Return
+ * XZ_OK on success, XZ_MEMLIMIT_ERROR if the preallocated dictionary is not
+ * big enough, and XZ_OPTIONS_ERROR if props indicates something that this
+ * decoder doesn't support.
+ */
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_lzma2_reset(
+ struct xz_dec_lzma2 *s, uint8_t props);
+
+/* Decode raw LZMA2 stream from b->in to b->out. */
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_lzma2_run(
+ struct xz_dec_lzma2 *s, struct xz_buf *b);
+
+/* Free the memory allocated for the LZMA2 decoder. */
+XZ_EXTERN void XZ_FUNC xz_dec_lzma2_end(struct xz_dec_lzma2 *s);
+
+#ifdef XZ_DEC_BCJ
+/*
+ * Allocate memory for BCJ decoders. xz_dec_bcj_reset() must be used before
+ * calling xz_dec_bcj_run().
+ */
+XZ_EXTERN struct xz_dec_bcj * XZ_FUNC xz_dec_bcj_create(bool single_call);
+
+/*
+ * Decode the Filter ID of a BCJ filter. This implementation doesn't
+ * support custom start offsets, so no decoding of Filter Properties
+ * is needed. Returns XZ_OK if the given Filter ID is supported.
+ * Otherwise XZ_OPTIONS_ERROR is returned.
+ */
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_bcj_reset(
+ struct xz_dec_bcj *s, uint8_t id);
+
+/*
+ * Decode raw BCJ + LZMA2 stream. This must be used only if there actually is
+ * a BCJ filter in the chain. If the chain has only LZMA2, xz_dec_lzma2_run()
+ * must be called directly.
+ */
+XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_bcj_run(struct xz_dec_bcj *s,
+ struct xz_dec_lzma2 *lzma2, struct xz_buf *b);
+
+/* Free the memory allocated for the BCJ filters. */
+#define xz_dec_bcj_end(s) kfree(s)
+#endif
+
+#endif
diff --git a/lib/qt-tar-xz/xz_stream.h b/lib/qt-tar-xz/xz_stream.h
new file mode 100644
index 0000000..2ffaa34
--- /dev/null
+++ b/lib/qt-tar-xz/xz_stream.h
@@ -0,0 +1,57 @@
+/*
+ * Definitions for handling the .xz file format
+ *
+ * Author: Lasse Collin <lasse.collin@tukaani.org>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#ifndef XZ_STREAM_H
+#define XZ_STREAM_H
+
+#if defined(__KERNEL__) && !XZ_INTERNAL_CRC32
+# include <linux/crc32.h>
+# undef crc32
+# define xz_crc32(buf, size, crc) \
+ (~crc32_le(~(uint32_t)(crc), buf, size))
+#endif
+
+/*
+ * See the .xz file format specification at
+ * http://tukaani.org/xz/xz-file-format.txt
+ * to understand the container format.
+ */
+
+#define STREAM_HEADER_SIZE 12
+
+#define HEADER_MAGIC "\3757zXZ"
+#define HEADER_MAGIC_SIZE 6
+
+#define FOOTER_MAGIC "YZ"
+#define FOOTER_MAGIC_SIZE 2
+
+/*
+ * Variable-length integer can hold a 63-bit unsigned integer, or a special
+ * value to indicate that the value is unknown.
+ */
+typedef uint64_t vli_type;
+
+#define VLI_MAX ((vli_type)-1 / 2)
+#define VLI_UNKNOWN ((vli_type)-1)
+
+/* Maximum encoded size of a VLI */
+#define VLI_BYTES_MAX (sizeof(vli_type) * 8 / 7)
+
+/* Integrity Check types */
+enum xz_check {
+ XZ_CHECK_NONE = 0,
+ XZ_CHECK_CRC32 = 1,
+ XZ_CHECK_CRC64 = 4,
+ XZ_CHECK_SHA256 = 10
+};
+
+/* Maximum possible Check ID */
+#define XZ_CHECK_MAX 15
+
+#endif
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..0a702b6
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,149 @@
+/** \file main.cpp
+\brief Define the main() for the point entry
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QApplication>
+#include <QtPlugin>
+
+#include "Environment.h"
+#include "EventDispatcher.h"
+#include "LanguagesManager.h"
+#include "ThemesManager.h"
+#include "DebugEngine.h"
+#include "ResourcesManager.h"
+#include "OptionEngine.h"
+#include "PluginsManager.h"
+
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ Q_IMPORT_PLUGIN(CopyEngineFactory)
+ Q_IMPORT_PLUGIN(ThemesFactory)
+ Q_IMPORT_PLUGIN(Listener)
+ #ifdef Q_OS_WIN32
+ Q_IMPORT_PLUGIN(WindowsExplorerLoader)
+ #if !defined(ULTRACOPIER_VERSION_PORTABLE)
+ Q_IMPORT_PLUGIN(WindowsSessionLoader)
+ #endif
+ #endif
+#endif
+#endif
+
+#ifdef ULTRACOPIER_DEBUG
+DebugModel *DebugModel::debugModel=NULL;
+DebugEngine *DebugEngine::debugEngine=NULL;
+#endif
+ResourcesManager *ResourcesManager::resourcesManager=NULL;
+OptionEngine *OptionEngine::optionEngine=NULL;
+PluginsManager *PluginsManager::pluginsManager=NULL;
+LanguagesManager *LanguagesManager::languagesManager=NULL;
+ThemesManager *ThemesManager::themesManager=NULL;
+
+void registerTheOptions()
+{
+ OptionEngine::optionEngine=new OptionEngine();
+
+ //register the var
+ //add the options to use
+ std::vector<std::pair<std::string, std::string> > KeysList;
+ //add the options hidden, will not show in options pannel
+ KeysList.clear();
+ KeysList.push_back(std::pair<std::string, std::string>("Last_version_used","na"));
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ KeysList.push_back(std::pair<std::string, std::string>("key",""));
+ #endif
+ KeysList.push_back(std::pair<std::string, std::string>("ActionOnManualOpen","1"));
+ KeysList.push_back(std::pair<std::string, std::string>("GroupWindowWhen","0"));
+ KeysList.push_back(std::pair<std::string, std::string>("displayOSSpecific","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("confirmToGroupWindows","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("remainingTimeAlgorithm","0"));
+ #ifdef ULTRACOPIER_INTERNET_SUPPORT
+ #if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
+ KeysList.push_back(std::pair<std::string, std::string>("checkTheUpdate","true"));
+ #else
+ KeysList.push_back(std::pair<std::string, std::string>("checkTheUpdate","false"));
+ #endif
+ #endif
+ OptionEngine::optionEngine->addOptionGroup("Ultracopier",KeysList);
+
+ KeysList.clear();
+ KeysList.push_back(std::pair<std::string, std::string>("List","Ultracopier"));
+ OptionEngine::optionEngine->addOptionGroup("CopyEngine",KeysList);
+
+ //load the GUI option
+ std::string defaultLogFile;
+ if(ResourcesManager::resourcesManager->getWritablePath()!="")
+ defaultLogFile=ResourcesManager::resourcesManager->getWritablePath()+"ultracopier-files.log";
+ KeysList.clear();
+ KeysList.push_back(std::pair<std::string, std::string>("enabled","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("file",defaultLogFile));
+ KeysList.push_back(std::pair<std::string, std::string>("transfer","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("error","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("folder","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("sync","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("transfer_format","[%time%] %source% (%size%) %destination%"));
+ KeysList.push_back(std::pair<std::string, std::string>("error_format","[%time%] %path%, %error%"));
+ KeysList.push_back(std::pair<std::string, std::string>("folder_format","[%time%] %operation% %path%"));
+ OptionEngine::optionEngine->addOptionGroup("Write_log",KeysList);
+
+ KeysList.clear();
+ KeysList.push_back(std::pair<std::string, std::string>("CatchCopyAsDefault","true"));
+ OptionEngine::optionEngine->addOptionGroup("CopyListener",KeysList);
+
+ KeysList.clear();
+ KeysList.push_back(std::pair<std::string, std::string>("LoadAtSessionStarting","true"));
+ OptionEngine::optionEngine->addOptionGroup("SessionLoader",KeysList);
+}
+
+/// \brief Define the main() for the point entry
+int main(int argc, char *argv[])
+{
+ int returnCode;
+ QApplication ultracopierApplication(argc, argv);
+ ultracopierApplication.setApplicationVersion(ULTRACOPIER_VERSION);
+ ultracopierApplication.setQuitOnLastWindowClosed(false);
+ qRegisterMetaType<PluginsAvailable>("PluginsAvailable");
+ qRegisterMetaType<Ultracopier::DebugLevel>("Ultracopier::DebugLevel");
+ qRegisterMetaType<Ultracopier::CopyMode>("Ultracopier::CopyMode");
+ qRegisterMetaType<Ultracopier::ItemOfCopyList>("Ultracopier::ItemOfCopyList");
+
+ #ifdef ULTRACOPIER_DEBUG
+ DebugModel::debugModel=new DebugModel();
+ DebugEngine::debugEngine=new DebugEngine();
+ #endif
+ ResourcesManager::resourcesManager=new ResourcesManager();
+ registerTheOptions();
+
+ PluginsManager::pluginsManager=new PluginsManager();
+ LanguagesManager::languagesManager=new LanguagesManager();
+ ThemesManager::themesManager=new ThemesManager();
+
+ //the main code, event loop of Qt and event dispatcher of ultracopier
+ {
+ EventDispatcher backgroundRunningInstance;
+ if(backgroundRunningInstance.shouldBeClosed())
+ returnCode=0;
+ else
+ returnCode=ultracopierApplication.exec();
+ }
+
+ delete ThemesManager::themesManager;
+ ThemesManager::themesManager=NULL;
+ delete LanguagesManager::languagesManager;
+ LanguagesManager::languagesManager=NULL;
+ delete PluginsManager::pluginsManager;
+ PluginsManager::pluginsManager=NULL;
+ delete OptionEngine::optionEngine;
+ OptionEngine::optionEngine=NULL;
+ delete ResourcesManager::resourcesManager;
+ ResourcesManager::resourcesManager=NULL;
+ #ifdef ULTRACOPIER_DEBUG
+ delete DebugEngine::debugEngine;
+ DebugEngine::debugEngine=NULL;
+ delete DebugModel::debugModel;
+ DebugModel::debugModel=NULL;
+ #endif
+
+ return returnCode;
+}
+
diff --git a/other-pro/static.pro b/other-pro/static.pro
new file mode 100644
index 0000000..318df94
--- /dev/null
+++ b/other-pro/static.pro
@@ -0,0 +1,33 @@
+DEFINES += ULTRACOPIER_PLUGIN_ALL_IN_ONE
+
+include(ultracopier-core.pro)
+
+RESOURCES += $$PWD/../plugins/static-plugins.qrc \
+ $$PWD/../plugins/CopyEngine/Ultracopier/copyEngineResources.qrc
+
+win32:RESOURCES += $$PWD/../plugins/static-plugins-windows.qrc
+
+LIBS = -Lplugins -lcopyEngine -linterface -llistener
+win32:LIBS += -lpluginLoader -lsessionLoader
+
+build_pass:CONFIG(debug, debug|release) {
+LIBS = -Lplugins -lcopyEngined -linterfaced -llistenerd
+win32:LIBS += -lpluginLoaderd -lsessionLoaderd
+}
+
+HEADERS -= $$PWD/../lib/qt-tar-xz/xz.h \
+ $$PWD/../lib/qt-tar-xz/QXzDecodeThread.h \
+ $$PWD/../lib/qt-tar-xz/QXzDecode.h \
+ $$PWD/../lib/qt-tar-xz/QTarDecode.h \
+ $$PWD/../AuthPlugin.h
+SOURCES -= $$PWD/../lib/qt-tar-xz/QXzDecodeThread.cpp \
+ $$PWD/../lib/qt-tar-xz/QXzDecode.cpp \
+ $$PWD/../lib/qt-tar-xz/QTarDecode.cpp \
+ $$PWD/../lib/qt-tar-xz/xz_crc32.c \
+ $$PWD/../lib/qt-tar-xz/xz_dec_stream.c \
+ $$PWD/../lib/qt-tar-xz/xz_dec_lzma2.c \
+ $$PWD/../lib/qt-tar-xz/xz_dec_bcj.c \
+ $$PWD/../AuthPlugin.cpp
+INCLUDEPATH -= $$PWD/../lib/qt-tar-xz/
+
+RESOURCES -= $$PWD/../resources/resources-windows-qt-plugin.qrc
diff --git a/other-pro/supercopier-core.pro b/other-pro/supercopier-core.pro
new file mode 100644
index 0000000..eb6d143
--- /dev/null
+++ b/other-pro/supercopier-core.pro
@@ -0,0 +1,3 @@
+#DEFINES += ULTRACOPIER_MODE_SUPERCOPIER done via .sh and Variable.h
+
+include(ultracopier-core.pro)
diff --git a/other-pro/ultracopier-core.pro b/other-pro/ultracopier-core.pro
new file mode 100644
index 0000000..24931f0
--- /dev/null
+++ b/other-pro/ultracopier-core.pro
@@ -0,0 +1,131 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+#QMAKE_CXXFLAGS+="-Wall -Wextra -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-unused-macros -Wno-newline-eof -Wno-exit-time-destructors -Wno-global-constructors -Wno-gnu-zero-variadic-macro-arguments -Wno-documentation -Wno-shadow -Wno-missing-prototypes -Wno-padded -Wno-covered-switch-default -Wno-old-style-cast -Wno-documentation-unknown-command -Wno-switch-enum -Wno-undefined-reinterpret-cast -Wno-unreachable-code-break -Wno-sign-conversion -Wno-float-conversion"
+
+TEMPLATE = app
+QT += network xml widgets
+TRANSLATIONS += $$PWD/../plugins/Languages/ar/translation.ts \
+ $$PWD/../plugins/Languages/de/translation.ts \
+ $$PWD/../plugins/Languages/el/translation.ts \
+ $$PWD/../resources/Languages/en/translation.ts \
+ $$PWD/../plugins/Languages/es/translation.ts \
+ $$PWD/../plugins/Languages/fr/translation.ts \
+ $$PWD/../plugins/Languages/hi/translation.ts \
+ $$PWD/../plugins/Languages/hu/translation.ts \
+ $$PWD/../plugins/Languages/id/translation.ts \
+ $$PWD/../plugins/Languages/it/translation.ts \
+ $$PWD/../plugins/Languages/ja/translation.ts \
+ $$PWD/../plugins/Languages/ko/translation.ts \
+ $$PWD/../plugins/Languages/nl/translation.ts \
+ $$PWD/../plugins/Languages/no/translation.ts \
+ $$PWD/../plugins/Languages/pl/translation.ts \
+ $$PWD/../plugins/Languages/pt/translation.ts \
+ $$PWD/../plugins/Languages/ru/translation.ts \
+ $$PWD/../plugins/Languages/th/translation.ts \
+ $$PWD/../plugins/Languages/tr/translation.ts \
+ $$PWD/../plugins/Languages/zh/translation.ts \
+ $$PWD/../plugins/Languages/zh_TW/translation.ts
+
+TARGET = ultracopier
+macx {
+ ICON = $$PWD/../resources/ultracopier.icns
+ #QT += macextras
+}
+FORMS += $$PWD/../HelpDialog.ui \
+ $$PWD/../PluginInformation.ui \
+ $$PWD/../OptionDialog.ui \
+ $$PWD/../OSSpecific.ui
+RESOURCES += \
+ $$PWD/../resources/ultracopier-resources.qrc \
+ $$PWD/../resources/ultracopier-resources_unix.qrc \
+ $$PWD/../resources/ultracopier-resources_windows.qrc
+win32 {
+ RESOURCES += $$PWD/../resources/resources-windows-qt-plugin.qrc
+ RC_FILE += $$PWD/../resources/resources-windows.rc
+ #LIBS += -lpdh
+ LIBS += -ladvapi32
+}
+
+HEADERS += $$PWD/../ResourcesManager.h \
+ $$PWD/../ThemesManager.h \
+ $$PWD/../SystrayIcon.h \
+ $$PWD/../StructEnumDefinition.h \
+ $$PWD/../EventDispatcher.h \
+ $$PWD/../Environment.h \
+ $$PWD/../DebugEngine.h \
+ $$PWD/../Core.h \
+ $$PWD/../OptionEngine.h \
+ $$PWD/../HelpDialog.h \
+ $$PWD/../PluginsManager.h \
+ $$PWD/../LanguagesManager.h \
+ $$PWD/../DebugEngineMacro.h \
+ $$PWD/../PluginInformation.h \
+ $$PWD/../lib/qt-tar-xz/xz.h \
+ $$PWD/../lib/qt-tar-xz/QXzDecodeThread.h \
+ $$PWD/../lib/qt-tar-xz/QXzDecode.h \
+ $$PWD/../lib/qt-tar-xz/QTarDecode.h \
+ $$PWD/../SessionLoader.h \
+ $$PWD/../ExtraSocket.h \
+ $$PWD/../CopyListener.h \
+ $$PWD/../CopyEngineManager.h \
+ $$PWD/../PlatformMacro.h \
+ $$PWD/../interface/PluginInterface_Themes.h \
+ $$PWD/../interface/PluginInterface_SessionLoader.h \
+ $$PWD/../interface/PluginInterface_Listener.h \
+ $$PWD/../interface/PluginInterface_CopyEngine.h \
+ $$PWD/../interface/OptionInterface.h \
+ $$PWD/../Variable.h \
+ $$PWD/../PluginLoader.h \
+ $$PWD/../interface/PluginInterface_PluginLoader.h \
+ $$PWD/../OptionDialog.h \
+ $$PWD/../LocalPluginOptions.h \
+ $$PWD/../LocalListener.h \
+ $$PWD/../CliParser.h \
+ $$PWD/../interface/FacilityInterface.h \
+ $$PWD/../FacilityEngine.h \
+ $$PWD/../LogThread.h \
+ $$PWD/../CompilerInfo.h \
+ $$PWD/../StructEnumDefinition_UltracopierSpecific.h \
+ $$PWD/../OSSpecific.h \
+ $$PWD/../cpp11addition.h \
+ $$PWD/../InternetUpdater.h
+SOURCES += $$PWD/../ThemesManager.cpp \
+ $$PWD/../ResourcesManager.cpp \
+ $$PWD/../main.cpp \
+ $$PWD/../EventDispatcher.cpp \
+ $$PWD/../SystrayIcon.cpp \
+ $$PWD/../DebugEngine.cpp \
+ $$PWD/../OptionEngine.cpp \
+ $$PWD/../HelpDialog.cpp \
+ $$PWD/../PluginsManager.cpp \
+ $$PWD/../LanguagesManager.cpp \
+ $$PWD/../PluginInformation.cpp \
+ $$PWD/../lib/qt-tar-xz/QXzDecodeThread.cpp \
+ $$PWD/../lib/qt-tar-xz/QXzDecode.cpp \
+ $$PWD/../lib/qt-tar-xz/QTarDecode.cpp \
+ $$PWD/../lib/qt-tar-xz/xz_crc32.c \
+ $$PWD/../lib/qt-tar-xz/xz_dec_stream.c \
+ $$PWD/../lib/qt-tar-xz/xz_dec_lzma2.c \
+ $$PWD/../lib/qt-tar-xz/xz_dec_bcj.c \
+ $$PWD/../SessionLoader.cpp \
+ $$PWD/../ExtraSocket.cpp \
+ $$PWD/../CopyListener.cpp \
+ $$PWD/../CopyEngineManager.cpp \
+ $$PWD/../Core.cpp \
+ $$PWD/../PluginLoader.cpp \
+ $$PWD/../OptionDialog.cpp \
+ $$PWD/../LocalPluginOptions.cpp \
+ $$PWD/../LocalListener.cpp \
+ $$PWD/../CliParser.cpp \
+ $$PWD/../FacilityEngine.cpp \
+ $$PWD/../LogThread.cpp \
+ $$PWD/../OSSpecific.cpp \
+ $$PWD/../cpp11addition.cpp \
+ $$PWD/../DebugModel.cpp \
+ $$PWD/../InternetUpdater.cpp \
+ $$PWD/../cpp11additionstringtointcpp.cpp
+INCLUDEPATH += \
+ $$PWD/../lib/qt-tar-xz/
+
+OTHER_FILES += $$PWD/../resources/resources-windows.rc
diff --git a/other-pro/ultracopier-static.pro b/other-pro/ultracopier-static.pro
new file mode 100644
index 0000000..48a5cad
--- /dev/null
+++ b/other-pro/ultracopier-static.pro
@@ -0,0 +1,6 @@
+include(static.pro)
+
+RESOURCES += $$PWD/../plugins/static-plugins-oxygen.qrc \
+ $$PWD/../plugins/Themes/Oxygen/interfaceResources_windows.qrc \
+ $$PWD/../plugins/Themes/Oxygen/interfaceResources_unix.qrc \
+ $$PWD/../plugins/Themes/Oxygen/interfaceResources.qrc
diff --git a/plugins-alternative/Listener/dbus/Catchcopy.cpp b/plugins-alternative/Listener/dbus/Catchcopy.cpp
new file mode 100644
index 0000000..6c46af2
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/Catchcopy.cpp
@@ -0,0 +1,17 @@
+#include "Catchcopy.h"
+
+#include <QCoreApplication>
+
+Catchcopy::Catchcopy()
+{
+}
+
+void Catchcopy::copy(const QStringList &sources,const QString &destination)
+{
+ emit newCopy(0,sources,destination);
+}
+
+void Catchcopy::move(const QStringList &sources,const QString &destination)
+{
+ emit newMove(0,sources,destination);
+}
diff --git a/plugins-alternative/Listener/dbus/Catchcopy.h b/plugins-alternative/Listener/dbus/Catchcopy.h
new file mode 100644
index 0000000..d28a253
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/Catchcopy.h
@@ -0,0 +1,20 @@
+#ifndef CATCHCOPY_H
+#define CATCHCOPY_H
+
+#include <QObject>
+#include <QStringList>
+
+class Catchcopy : public QObject
+{
+ Q_OBJECT
+public:
+ explicit Catchcopy();
+signals:
+ void newCopy(const quint32 &id,const QStringList &sources,const QString &destination);
+ void newMove(const quint32 &id,const QStringList &sources,const QString &destination);
+public slots:
+ Q_SCRIPTABLE void copy(const QStringList &sources,const QString &destination);
+ Q_SCRIPTABLE void move(const QStringList &sources,const QString &destination);
+};
+
+#endif // CATCHCOPY_H
diff --git a/plugins-alternative/Listener/dbus/DebugEngineMacro.h b/plugins-alternative/Listener/dbus/DebugEngineMacro.h
new file mode 100644
index 0000000..4582010
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins-alternative/Listener/dbus/Environment.h b/plugins-alternative/Listener/dbus/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins-alternative/Listener/dbus/StructEnumDefinition.h b/plugins-alternative/Listener/dbus/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins-alternative/Listener/dbus/Variable.h b/plugins-alternative/Listener/dbus/Variable.h
new file mode 100644
index 0000000..963d0c8
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/Variable.h
@@ -0,0 +1,15 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins-alternative/Listener/dbus/documentation.dox b/plugins-alternative/Listener/dbus/documentation.dox
new file mode 100644
index 0000000..2eb3c87
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/documentation.dox
@@ -0,0 +1,36 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage dbus
+
+ \section mainpage_overview Overview
+
+ It's alternative listener for linux, it's very more simpler. You send just your copy/move, no more. No return.\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section mainpage_algorithm Dbus method
+
+ you have this method exported to dbus:
+ <ul>
+ <li>void copy(const QStringList &sources,const QString &destination)</li>
+ <li>void move(const QStringList &sources,const QString &destination)</li>
+ </ul>
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.
+
+*/
diff --git a/plugins-alternative/Listener/dbus/informations.xml b/plugins-alternative/Listener/dbus/informations.xml
new file mode 100644
index 0000000..6ecae52
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Listener for catchcopy in dbus]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Écouteur pour catchcopy en dbus]]></title>
+ <!-- What kind of plugin this is -->
+ <category>Listener</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Listener for catchcopy in dbus. Allow to receive copy list from plugin/explorer compatible with catchcopy.]]></description>
+ <description xml:lang="fr"><![CDATA[Écouteur pour catchcopy en dbus. Permet de recevoir un liste de copie venant d'un plugin/explorateur avec catchcopy.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>dbus</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins-alternative/Listener/dbus/listener.cpp b/plugins-alternative/Listener/dbus/listener.cpp
new file mode 100644
index 0000000..50ed196
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/listener.cpp
@@ -0,0 +1,85 @@
+#include "listener.h"
+
+Listener::Listener()
+{
+ connect(&catchcopy,&Catchcopy::newCopy, this,&Listener::newCopy);
+ connect(&catchcopy,&Catchcopy::newMove, this,&Listener::newMove);
+}
+
+void Listener::listen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if (!QDBusConnection::sessionBus().isConnected())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit newState(Ultracopier::NotListening);
+ return;
+ }
+ if (!QDBusConnection::sessionBus().registerService("info.first-world.catchcopy"))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QDBusConnection::sessionBus().lastError().message());
+ emit newState(Ultracopier::NotListening);
+ return;
+ }
+ if(!QDBusConnection::sessionBus().registerObject("/", &catchcopy, QDBusConnection::ExportAllSlots))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QDBusConnection::sessionBus().lastError().message());
+ emit newState(Ultracopier::NotListening);
+ return;
+ }
+ emit newState(Ultracopier::FullListening);
+}
+
+void Listener::close()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QDBusConnection::sessionBus().unregisterObject("/");
+ QDBusConnection::sessionBus().unregisterService("info.first-world.catchcopy");
+ emit newState(Ultracopier::NotListening);
+}
+
+const QString Listener::errorString() const
+{
+ return "Unknow error";
+}
+
+void Listener::setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,const bool &portableVersion)
+{
+ Q_UNUSED(options);
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ Q_UNUSED(portableVersion);
+}
+
+/// \brief to get the options widget, NULL if not have
+QWidget * Listener::options()
+{
+ return NULL;
+}
+
+void Listener::transferFinished(const quint32 &orderId,const bool &withError)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, orderId: "+QString::number(orderId)+", withError: "+QString::number(withError));
+}
+
+void Listener::transferCanceled(const quint32 &orderId)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, orderId: "+QString::number(orderId));
+}
+
+/// \brief to reload the translation, because the new language have been loaded
+void Listener::newLanguageLoaded()
+{
+}
+
+void Listener::error(QString error)
+{
+ Q_UNUSED(error);
+}
+
+void Listener::clientName(quint32 client,QString name)
+{
+ Q_UNUSED(client);
+ Q_UNUSED(name);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("clientName: %1, for the id: %2").arg(name).arg(client));
+}
diff --git a/plugins-alternative/Listener/dbus/listener.h b/plugins-alternative/Listener/dbus/listener.h
new file mode 100644
index 0000000..fcb95cd
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/listener.h
@@ -0,0 +1,49 @@
+/** \file listener.h
+\brief Define the server compatible with Ultracopier interface
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef SERVER_H
+#define SERVER_H
+
+#include <QObject>
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+
+#include "Catchcopy.h"
+#include "Environment.h"
+#include "../../../interface/PluginInterface_Listener.h"
+
+/// \brief Define the server compatible with Ultracopier interface
+class Listener : public PluginInterface_Listener
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.Listener/1.0.0.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_Listener)
+public:
+ Listener();
+ /// \brief try listen the copy/move
+ void listen();
+ /// \brief stop listen to copy/move
+ void close();
+ /// \brief return the error strong
+ const QString errorString() const;
+ /// \brief set resources for this plugins
+ void setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,const bool &portableVersion);
+ /// \brief to get the options widget, NULL if not have
+ QWidget * options();
+public slots:
+ /// \brief say to the client that's the copy/move is finished
+ void transferFinished(const quint32 &orderId,const bool &withError);
+ /// \brief say to the client that's the copy/move is finished
+ void transferCanceled(const quint32 &orderId);
+ /// \brief to reload the translation, because the new language have been loaded
+ void newLanguageLoaded();
+private:
+ Catchcopy catchcopy;
+private slots:
+ void error(QString error);
+ void clientName(quint32 client,QString name);
+};
+
+#endif // SERVER_H
diff --git a/plugins-alternative/Listener/dbus/listener.pro b/plugins-alternative/Listener/dbus/listener.pro
new file mode 100644
index 0000000..16cd3d3
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/listener.pro
@@ -0,0 +1,19 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+TEMPLATE = lib
+CONFIG += plugin
+QT += network dbus
+HEADERS = \
+ $$PWD/listener.h \
+ $$PWD/Environment.h \
+ $$PWD/Variable.h \
+ $$PWD/DebugEngineMacro.h \
+ $$PWD/StructEnumDefinition.h \
+ $$PWD/../../../interface/PluginInterface_Listener.h \
+ $$PWD/Catchcopy.h
+SOURCES = \
+ $$PWD/listener.cpp \
+ $$PWD/Catchcopy.cpp
+TARGET = $$qtLibraryTarget(listener)
diff --git a/plugins-alternative/Listener/dbus/plugin.json b/plugins-alternative/Listener/dbus/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins-alternative/Listener/dbus/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins-alternative/PluginLoader/keybinding/DebugEngineMacro.h b/plugins-alternative/PluginLoader/keybinding/DebugEngineMacro.h
new file mode 100644
index 0000000..f9b5349
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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/PluginLoader/keybinding/Environment.h b/plugins-alternative/PluginLoader/keybinding/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins-alternative/PluginLoader/keybinding/KeyBind.cpp b/plugins-alternative/PluginLoader/keybinding/KeyBind.cpp
new file mode 100644
index 0000000..0fd5287
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/KeyBind.cpp
@@ -0,0 +1,11 @@
+#include "KeyBind.h"
+
+KeyBind::KeyBind(QWidget *parent) :
+ QLineEdit(parent)
+{
+}
+
+void KeyBind::keyPressEvent(QKeyEvent * event)
+{
+ emit newKey(event);
+}
diff --git a/plugins-alternative/PluginLoader/keybinding/KeyBind.h b/plugins-alternative/PluginLoader/keybinding/KeyBind.h
new file mode 100644
index 0000000..f4abf68
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/KeyBind.h
@@ -0,0 +1,18 @@
+#ifndef KEYBIND_H
+#define KEYBIND_H
+
+#include <QLineEdit>
+
+class KeyBind : public QLineEdit
+{
+ Q_OBJECT
+public:
+ explicit KeyBind(QWidget *parent = 0);
+
+signals:
+ void newKey(QKeyEvent * event);
+public slots:
+ void keyPressEvent(QKeyEvent * event);
+};
+
+#endif // KEYBIND_H
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/ar/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/ar/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/ar/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/de/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/de/translation.ts
new file mode 100644
index 0000000..fe80b91
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/de/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de" sourcelanguage="en">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/el/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/el/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/el/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/en/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/en/translation.ts
new file mode 100644
index 0000000..f92b6b5
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/en/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/es/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/es/translation.ts
new file mode 100644
index 0000000..c72ba56
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/es/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es" sourcelanguage="en">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/fr/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/fr/translation.ts
new file mode 100644
index 0000000..513e265
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/fr/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/hi/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/hi/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/hi/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/hu/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/hu/translation.ts
new file mode 100644
index 0000000..cb3bde6
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/hu/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="hu">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/id/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/id/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/id/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/it/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/it/translation.ts
new file mode 100644
index 0000000..a2257e5
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/it/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="it_IT">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/ja/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/ja/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/ja/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/ko/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/ko/translation.ts
new file mode 100644
index 0000000..18f47bb
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/ko/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ko_KR">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/nl/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/nl/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/nl/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/no/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/no/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/no/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/pl/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/pl/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/pl/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/pt/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/pt/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/pt/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/ru/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/ru/translation.ts
new file mode 100644
index 0000000..38a6bfd
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/ru/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru" sourcelanguage="en">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/th/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/th/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/th/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/tr/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/tr/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/tr/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/Languages/zh/translation.ts b/plugins-alternative/PluginLoader/keybinding/Languages/zh/translation.ts
new file mode 100644
index 0000000..07a7469
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Languages/zh/translation.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+</TS>
diff --git a/plugins-alternative/PluginLoader/keybinding/OptionsWidget.cpp b/plugins-alternative/PluginLoader/keybinding/OptionsWidget.cpp
new file mode 100644
index 0000000..a48e61f
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/OptionsWidget.cpp
@@ -0,0 +1,55 @@
+#include "OptionsWidget.h"
+#include "KeyBind.h"
+#include "ui_OptionsWidget.h"
+
+#include <QKeyEvent>
+
+OptionsWidget::OptionsWidget(QWidget *parent) :
+ QWidget(parent),
+ modifier(QList<int>() << Qt::Key_Control << Qt::Key_Shift << Qt::Key_Super_R << Qt::Key_Super_L << Qt::Key_Meta << Qt::Key_Alt << Qt::Key_AltGr),
+ ui(new Ui::OptionsWidget)
+{
+ ui->setupUi(this);
+
+ keyBind=new KeyBind(this);
+ ui->vboxLayout->addWidget(keyBind);
+ connect(keyBind,&KeyBind::newKey,this,&OptionsWidget::newKeyBind);
+}
+
+OptionsWidget::~OptionsWidget()
+{
+ delete ui;
+}
+
+void OptionsWidget::retranslate()
+{
+ ui->retranslateUi(this);
+}
+
+void OptionsWidget::setKeyBind(const QKeySequence &keySequence)
+{
+ keyBind->setText(keySequence.toString());
+}
+
+void OptionsWidget::newKey(QKeyEvent * event)
+{
+ int keyInt = event->key();
+ if(!modifier.contains(keyInt))
+ {
+ const Qt::KeyboardModifiers &modifiers = event->modifiers();
+ if(modifiers & Qt::ShiftModifier)
+ keyInt += Qt::SHIFT;
+ if(modifiers & Qt::ControlModifier)
+ keyInt += Qt::CTRL;
+ if(modifiers & Qt::AltModifier)
+ keyInt += Qt::ALT;
+ if(modifiers & Qt::MetaModifier)
+ keyInt += Qt::META;
+
+ const QKeySequence &keySeq = QKeySequence(keyInt);
+ keyBind->setText(keySeq.toString());
+
+ sendKeyBind(keySeq);
+ }
+}
+
diff --git a/plugins-alternative/PluginLoader/keybinding/OptionsWidget.h b/plugins-alternative/PluginLoader/keybinding/OptionsWidget.h
new file mode 100644
index 0000000..e0d8e4b
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/OptionsWidget.h
@@ -0,0 +1,31 @@
+#ifndef OptionsWidget_H
+#define OptionsWidget_H
+
+#include <QWidget>
+#include "KeyBind.h"
+
+namespace Ui {
+class OptionsWidget;
+}
+
+class OptionsWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit OptionsWidget(QWidget *parent = 0);
+ ~OptionsWidget();
+ void setKeyBind(const QKeySequence &keySequence);
+ void retranslate();
+private:
+ const QList<int> modifier;
+ Ui::OptionsWidget *ui;
+ KeyBind *keyBind;
+private slots:
+ void newKey(QKeyEvent * event);
+signals:
+ void sendKeyBind(const QKeySequence &keySequence);
+ void newKeyBind(QKeyEvent * event);
+};
+
+#endif // OptionsWidget_H
diff --git a/plugins-alternative/PluginLoader/keybinding/OptionsWidget.ui b/plugins-alternative/PluginLoader/keybinding/OptionsWidget.ui
new file mode 100644
index 0000000..2bc3cbe
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/OptionsWidget.ui
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OptionsWidget</class>
+ <widget class="QWidget" name="OptionsWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>195</width>
+ <height>58</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout">
+ <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>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/plugins-alternative/PluginLoader/keybinding/PlatformMacro.h b/plugins-alternative/PluginLoader/keybinding/PlatformMacro.h
new file mode 100644
index 0000000..f7586b0
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/PlatformMacro.h
@@ -0,0 +1 @@
+#include "../../../PlatformMacro.h"
diff --git a/plugins-alternative/PluginLoader/keybinding/StructEnumDefinition.h b/plugins-alternative/PluginLoader/keybinding/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins-alternative/PluginLoader/keybinding/Variable.h b/plugins-alternative/PluginLoader/keybinding/Variable.h
new file mode 100644
index 0000000..90e1557
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/Variable.h
@@ -0,0 +1,16 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+//#define ULTRACOPIER_PLUGIN_ALL_IN_ONE
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins-alternative/PluginLoader/keybinding/documentation.dox b/plugins-alternative/PluginLoader/keybinding/documentation.dox
new file mode 100644
index 0000000..b9c9d13
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/documentation.dox
@@ -0,0 +1,33 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage catchcopy-v0002
+
+ \section mainpage_overview Overview
+
+ Is the plugin to load the catchcopy plugin into the windows file manager. Mostly it use the command: regsvr32 /s catchcopy32.dll/catchcopy64.dll\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section mainpage_algorithm Requirements
+
+ You can see the documentation on <a href="http://catchcopy.first-world.info/">Catchcopy web site</a>. It use catchcopy32.dll/catchcopy64.dll as explorer plugin for the windows's file manager. Need it into the plugins.\n
+ In function if Ultracopier is compiled by portable version, try load the dll by other way.
+
+ \section license GPL Version 3
+ The code source is under GPL3.
+
+*/
diff --git a/plugins-alternative/PluginLoader/keybinding/informations.xml b/plugins-alternative/PluginLoader/keybinding/informations.xml
new file mode 100644
index 0000000..213c7bd
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/informations.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Plugin loader for catchcopy v0002]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Chargeur de plugin pour catchcopy v0002]]></title>
+ <!-- What kind of plugin this is -->
+ <category>PluginLoader</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Plugin loader for catchcopy v0002. Allow to receive copy list from plugin/explorer compatible with catchcopy.]]></description>
+ <description xml:lang="fr"><![CDATA[Chargeur de plugin pour catchcopy v0002. Permet de recevoir un liste de copie venant d'un plugin/explorateur avec catchcopy.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>keybinding</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-1.0
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins-alternative/PluginLoader/keybinding/plugin.json b/plugins-alternative/PluginLoader/keybinding/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins-alternative/PluginLoader/keybinding/pluginLoader.cpp b/plugins-alternative/PluginLoader/keybinding/pluginLoader.cpp
new file mode 100644
index 0000000..387b09e
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/pluginLoader.cpp
@@ -0,0 +1,61 @@
+/** \file pluginLoader.cpp
+\brief Define the session plugin loader test
+\author alpha_one_x86 */
+
+#include "pluginLoader.h"
+#include "PlatformMacro.h"
+
+#include <QFile>
+#include <QDir>
+
+#ifndef Q_OS_UNIX
+#error "Only for unix"
+#endif
+
+KeyBindPlugin::KeyBindPlugin()
+{
+ connect(&optionsWidget,&OptionsWidget::sendKeyBind,this,&KeyBindPlugin::setKeyBind);
+}
+
+KeyBindPlugin::~KeyBindPlugin()
+{
+}
+
+void KeyBindPlugin::setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,const bool &portableVersion)
+{
+ Q_UNUSED(options);
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ Q_UNUSED(portableVersion);
+ this->optionsEngine=options;
+ if(optionsEngine!=NULL)
+ {
+ QList<QPair<QString, QVariant> > KeysList;
+ KeysList.append(qMakePair(QStringLiteral("keySequence"),QString()));
+ optionsEngine->addOptionGroup(KeysList);
+ optionsWidget.setKeyBind(QKeySequence::fromString(optionsEngine->getOptionValue("keySequence").toString()));
+ }
+}
+
+/// \brief to get the options widget, NULL if not have
+QWidget * KeyBindPlugin::options()
+{
+ return &optionsWidget;
+}
+
+void KeyBindPlugin::newLanguageLoaded()
+{
+ optionsWidget.retranslate();
+}
+
+/// \brief try enable/disable the catching
+void KeyBindPlugin::setEnabled(const bool &needBeRegistred)
+{
+ Q_UNUSED(needBeRegistred);
+}
+
+void KeyBindPlugin::setKeyBind(const QKeySequence &keySequence)
+{
+ optionsEngine->setOptionValue("keySequence",keySequence);
+}
+
diff --git a/plugins-alternative/PluginLoader/keybinding/pluginLoader.h b/plugins-alternative/PluginLoader/keybinding/pluginLoader.h
new file mode 100644
index 0000000..1361c0d
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/pluginLoader.h
@@ -0,0 +1,47 @@
+/** \file pluginLoader.h
+\brief Define the plugin loader
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGIN_LOADER_TEST_H
+#define PLUGIN_LOADER_TEST_H
+
+#include <QObject>
+#include <QMessageBox>
+
+#include <QString>
+#include <QStringList>
+#include <QProcess>
+#include <QSet>
+#include <QKeySequence>
+
+#include "../../../interface/PluginInterface_PluginLoader.h"
+#include "Environment.h"
+#include "OptionsWidget.h"
+
+/// \brief \brief Define the plugin loader
+class KeyBindPlugin : public PluginInterface_PluginLoader
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.PluginLoader/1.0.0.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_PluginLoader)
+public:
+ KeyBindPlugin();
+ ~KeyBindPlugin();
+ /// \brief try enable/disable the catching
+ void setEnabled(const bool &needBeRegistred);
+ /// \brief to set resources, writePath can be empty if read only mode
+ void setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,const bool &portableVersion);
+ /// \brief to get the options widget, NULL if not have
+ QWidget * options();
+public slots:
+ /// \brief to reload the translation, because the new language have been loaded
+ void newLanguageLoaded();
+private:
+ OptionInterface * optionsEngine;
+ OptionsWidget optionsWidget;
+private slots:
+ void setKeyBind(const QKeySequence &keySequence);
+};
+
+#endif // PLUGIN_LOADER_TEST_H
diff --git a/plugins-alternative/PluginLoader/keybinding/pluginLoader.pro b/plugins-alternative/PluginLoader/keybinding/pluginLoader.pro
new file mode 100644
index 0000000..ad5404b
--- /dev/null
+++ b/plugins-alternative/PluginLoader/keybinding/pluginLoader.pro
@@ -0,0 +1,50 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+QT += widgets
+TEMPLATE = lib
+CONFIG += plugin
+HEADERS = \
+ StructEnumDefinition.h \
+ pluginLoader.h \
+ DebugEngineMacro.h \
+ Environment.h \
+ Variable.h \
+ PlatformMacro.h \
+ ../../../interface/PluginInterface_PluginLoader.h \
+ OptionsWidget.h \
+ KeyBind.h
+SOURCES = \
+ pluginLoader.cpp \
+ OptionsWidget.cpp \
+ KeyBind.cpp
+TARGET = $$qtLibraryTarget(pluginLoader)
+TRANSLATIONS += Languages/ar/translation.ts \
+ Languages/de/translation.ts \
+ Languages/el/translation.ts \
+ Languages/en/translation.ts \
+ Languages/es/translation.ts \
+ Languages/fr/translation.ts \
+ Languages/hi/translation.ts \
+ Languages/hu/translation.ts \
+ Languages/id/translation.ts \
+ Languages/it/translation.ts \
+ Languages/ja/translation.ts \
+ Languages/ko/translation.ts \
+ Languages/nl/translation.ts \
+ Languages/no/translation.ts \
+ Languages/pl/translation.ts \
+ Languages/pt/translation.ts \
+ Languages/ru/translation.ts \
+ Languages/th/translation.ts \
+ Languages/tr/translation.ts \
+ Languages/zh/translation.ts
+
+FORMS += \
+ OptionsWidget.ui
+
+CONFIG(static, static|shared) {
+DEFINES += ULTRACOPIER_PLUGIN_ALL_IN_ONE
+}
+
diff --git a/plugins-alternative/SessionLoader/KDE4/DebugEngineMacro.h b/plugins-alternative/SessionLoader/KDE4/DebugEngineMacro.h
new file mode 100644
index 0000000..4582010
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins-alternative/SessionLoader/KDE4/Environment.h b/plugins-alternative/SessionLoader/KDE4/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins-alternative/SessionLoader/KDE4/StructEnumDefinition.h b/plugins-alternative/SessionLoader/KDE4/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins-alternative/SessionLoader/KDE4/Variable.h b/plugins-alternative/SessionLoader/KDE4/Variable.h
new file mode 100644
index 0000000..963d0c8
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/Variable.h
@@ -0,0 +1,15 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins-alternative/SessionLoader/KDE4/documentation.dox b/plugins-alternative/SessionLoader/KDE4/documentation.dox
new file mode 100644
index 0000000..cf5f3e4
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/documentation.dox
@@ -0,0 +1,32 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage KDE4
+
+ \section mainpage_overview Overview
+
+ It control if it loaded with the session.\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section mainpage_algorithm Method
+
+ It pass by ~/.kde4/Autostart/ultracopier.sh to set/get it.
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.
+
+*/
diff --git a/plugins-alternative/SessionLoader/KDE4/informations.xml b/plugins-alternative/SessionLoader/KDE4/informations.xml
new file mode 100644
index 0000000..14f8bea
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Session loader for test]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Chargeur de session pour des testes]]></title>
+ <!-- What kind of plugin this is -->
+ <category>SessionLoader</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Test plugin to show how create SessionLoader plugin]]></description>
+ <description xml:lang="fr"><![CDATA[Plugin de test pour monter comment créer un plugin SessionLoader]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>KDE4</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins-alternative/SessionLoader/KDE4/plugin.json b/plugins-alternative/SessionLoader/KDE4/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins-alternative/SessionLoader/KDE4/sessionLoader.cpp b/plugins-alternative/SessionLoader/KDE4/sessionLoader.cpp
new file mode 100644
index 0000000..8024264
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/sessionLoader.cpp
@@ -0,0 +1,58 @@
+/** \file session-loader.cpp
+\brief Define the session plugin loader test
+\author alpha_one_x86
+*/
+
+#include <QFile>
+#include <QDir>
+#include <QCoreApplication>
+
+#include "sessionLoader.h"
+void KDESessionLoader::setEnabled(const bool &enabled)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, enabled: "+QString::number(enabled));
+ QFile link(QDir::homePath()+"/.kde4/Autostart/ultracopier.sh");
+ if(!enabled)
+ {
+ if(link.exists() && !link.remove())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to remove from the startup: "+link.errorString());
+ }
+ else
+ {
+ if(link.open(QIODevice::WriteOnly))
+ {
+ link.write(QStringLiteral("#!/bin/bash\n").toLocal8Bit());
+ link.write(QString(QCoreApplication::applicationFilePath()).toLocal8Bit());
+ link.close();
+ if(!link.setPermissions(QFile::ExeOwner|QFile::WriteOwner|QFile::ReadOwner))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to set permissions: "+link.errorString());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to open in writing the file: "+link.errorString());
+ }
+}
+
+bool KDESessionLoader::getEnabled() const
+{
+ //return the value into the variable
+ return QFile::exists(QDir::homePath()+"/.kde4/Autostart/ultracopier.sh");
+}
+
+void KDESessionLoader::setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,const bool &portableVersion)
+{
+ Q_UNUSED(options);
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ Q_UNUSED(portableVersion);
+}
+
+/// \brief to get the options widget, NULL if not have
+QWidget * KDESessionLoader::options()
+{
+ return NULL;
+}
+
+/// \brief to reload the translation, because the new language have been loaded
+void KDESessionLoader::newLanguageLoaded()
+{
+}
diff --git a/plugins-alternative/SessionLoader/KDE4/sessionLoader.h b/plugins-alternative/SessionLoader/KDE4/sessionLoader.h
new file mode 100644
index 0000000..b037da7
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/sessionLoader.h
@@ -0,0 +1,33 @@
+/** \file sessionLoader.h
+\brief Define the session loader
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef SESSION_LOADER_PLUGIN_H
+#define SESSION_LOADER_PLUGIN_H
+
+#include <QObject>
+#include "Environment.h"
+#include "../../../interface/PluginInterface_SessionLoader.h"
+
+/// \brief Define the session loader
+class KDESessionLoader : public PluginInterface_SessionLoader
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.SessionLoader/1.0.0.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_SessionLoader)
+public:
+ /// \brief to set if it's enabled or not
+ void setEnabled(const bool &enabled);
+ /// \brief to get if is enabled
+ bool getEnabled() const;
+ /// \brief set the resources for the plugins
+ void setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,const bool &portableVersion);
+ /// \brief to get the options widget, NULL if not have
+ QWidget * options();
+public slots:
+ /// \brief to reload the translation, because the new language have been loaded
+ void newLanguageLoaded();
+};
+
+#endif // SESSION_LOADER_PLUGIN_H
diff --git a/plugins-alternative/SessionLoader/KDE4/sessionLoader.pro b/plugins-alternative/SessionLoader/KDE4/sessionLoader.pro
new file mode 100644
index 0000000..4ac69b4
--- /dev/null
+++ b/plugins-alternative/SessionLoader/KDE4/sessionLoader.pro
@@ -0,0 +1,15 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+TEMPLATE = lib
+CONFIG += plugin
+HEADERS = \
+ $$PWD/sessionLoader.h \
+ $$PWD/StructEnumDefinition.h \
+ $$PWD/Variable.h \
+ $$PWD/Environment.h \
+ $$PWD/DebugEngineMacro.h \
+ $$PWD/../../../interface/PluginInterface_SessionLoader.h
+SOURCES = sessionLoader.cpp
+TARGET = $$qtLibraryTarget(sessionLoader)
diff --git a/plugins-alternative/Themes/Clean/Languages/ar/translation.ts b/plugins-alternative/Themes/Clean/Languages/ar/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/ar/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/de/translation.ts b/plugins-alternative/Themes/Clean/Languages/de/translation.ts
new file mode 100644
index 0000000..0a833ee
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/de/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de" sourcelanguage="en">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation>%1/%2 Dateien, %3/%4</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation>Aktion:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation>Warten</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation>Datei hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation>Ordner hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation>Datei (en) verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation>Ordner verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation>Datei (en) kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation>Ordner kopieren</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/el/translation.ts b/plugins-alternative/Themes/Clean/Languages/el/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/el/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/en/translation.ts b/plugins-alternative/Themes/Clean/Languages/en/translation.ts
new file mode 100644
index 0000000..d13892c
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/en/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/es/translation.ts b/plugins-alternative/Themes/Clean/Languages/es/translation.ts
new file mode 100644
index 0000000..87f57c8
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/es/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es" sourcelanguage="en">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation>%1/%2 archivos, %3/%4</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation>Acción:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation>Añadir archivo</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation>Añadir carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation>Mover archivo(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation>Mueva la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation>Copia el archivo(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation>Copia la carpeta</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/fr/translation.ts b/plugins-alternative/Themes/Clean/Languages/fr/translation.ts
new file mode 100644
index 0000000..79f32d5
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/fr/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation>%1/%2 fichiers, %3/%4</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation>Action:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation>Déplacer des fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation>Déplacer un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation>Copier des fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation>Copier un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation>Ajouter un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation>Ajout de fichier</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/hi/translation.ts b/plugins-alternative/Themes/Clean/Languages/hi/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/hi/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/hu/translation.ts b/plugins-alternative/Themes/Clean/Languages/hu/translation.ts
new file mode 100644
index 0000000..e5a3bcc
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/hu/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="hu">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation>%1/%2 fájl, %3/%4</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation>Művelet:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation>Várakozás</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation>Fájl hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation>Mappa hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation>Fájl(ok) mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation>Mappa mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation>Fájl(ok) másolása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation>Mappa másolása</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/id/translation.ts b/plugins-alternative/Themes/Clean/Languages/id/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/id/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/it/translation.ts b/plugins-alternative/Themes/Clean/Languages/it/translation.ts
new file mode 100644
index 0000000..3237bd6
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/it/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="it" sourcelanguage="en">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation>%1/%2 file, %3/%4</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation>Azione:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation>Aggiungi file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation>Aggiungi cartella</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation>Sposta file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation>Sposta la cartella</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation>Copia file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation>Copia cartella</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/ja/translation.ts b/plugins-alternative/Themes/Clean/Languages/ja/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/ja/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/ko/translation.ts b/plugins-alternative/Themes/Clean/Languages/ko/translation.ts
new file mode 100644
index 0000000..9e05f0f
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/ko/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ko_KR">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="+142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished">%1/%2 파일, %3/%4</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="+32"/>
+ <source>Action:</source>
+ <translation type="unfinished">실행:</translation>
+ </message>
+ <message>
+ <location line="+12"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+34"/>
+ <source>Add file</source>
+ <translation type="unfinished">파일 추가</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Add folder</source>
+ <translation type="unfinished">폴더 추가</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished">파일 이동</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move folder</source>
+ <translation type="unfinished">폴더 이동</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished">파일 복사</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy folder</source>
+ <translation type="unfinished">폴더 복사</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/nl/translation.ts b/plugins-alternative/Themes/Clean/Languages/nl/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/nl/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/no/translation.ts b/plugins-alternative/Themes/Clean/Languages/no/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/no/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/pl/translation.ts b/plugins-alternative/Themes/Clean/Languages/pl/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/pl/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/ru/translation.ts b/plugins-alternative/Themes/Clean/Languages/ru/translation.ts
new file mode 100644
index 0000000..ece0e7b
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/ru/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru" sourcelanguage="en">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation>%1/%2 файлы, %3/%4</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation>Действие:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation>Добавить файл</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation>Добавить папку</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation>Перемещение файла (ов)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation>Перемещение папки</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation>Копировать файл (ы)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation>Копировать папку</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/th/translation.ts b/plugins-alternative/Themes/Clean/Languages/th/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/th/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/tr/translation.ts b/plugins-alternative/Themes/Clean/Languages/tr/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/tr/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/Languages/zh/translation.ts b/plugins-alternative/Themes/Clean/Languages/zh/translation.ts
new file mode 100644
index 0000000..54104e3
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/Languages/zh/translation.ts
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>InterfacePlugin</name>
+ <message>
+ <location filename="../../interface.cpp" line="142"/>
+ <source>%1/%2 files, %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="32"/>
+ <source>Action:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="44"/>
+ <source>Waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="78"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="87"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="96"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="105"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="114"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="123"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Clean/StructEnumDefinition.h b/plugins-alternative/Themes/Clean/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins-alternative/Themes/Clean/documentation.dox b/plugins-alternative/Themes/Clean/documentation.dox
new file mode 100644
index 0000000..589d9c7
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/documentation.dox
@@ -0,0 +1,28 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage Clean
+
+ \section mainpage_overview Overview
+
+ It's interface to have minimal interface for Ultracopier.\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>. Is part of Ultracopier project as alternative plugin.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.
+
+*/
diff --git a/plugins-alternative/Themes/Clean/factory.cpp b/plugins-alternative/Themes/Clean/factory.cpp
new file mode 100644
index 0000000..6acbe3a
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/factory.cpp
@@ -0,0 +1,65 @@
+/** \file factory.cpp
+\brief Define the factory core
+\author alpha_one_x86
+*/
+
+#include "factory.h"
+
+PluginInterface_Themes * ThemesFactory::getInstance()
+{
+ InterfacePlugin * newInterface=new InterfacePlugin(facilityEngine);
+ connect(this,&ThemesFactory::reloadLanguage,newInterface,&InterfacePlugin::newLanguageLoaded);
+ return newInterface;
+}
+
+void ThemesFactory::setResources(OptionInterface * options, const QString &writePath, const QString &pluginPath, FacilityInterface * facilityInterface, const bool &portableVersion)
+{
+ Q_UNUSED(options)
+ Q_UNUSED(writePath)
+ Q_UNUSED(pluginPath)
+ this->facilityEngine=facilityInterface;
+ Q_UNUSED(portableVersion)
+}
+
+QWidget * ThemesFactory::options()
+{
+ return NULL;
+}
+
+QIcon ThemesFactory::getIcon(const QString &fileName) const
+{
+ if(fileName=="SystemTrayIcon/exit.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("application-exit");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/add.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("list-add");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/informations.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("help-about");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/options.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("applications-system");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ return QIcon(":/Themes/Clean/resources/"+fileName);
+}
+
+void ThemesFactory::resetOptions()
+{
+}
+
+void ThemesFactory::newLanguageLoaded()
+{
+ emit reloadLanguage();
+}
diff --git a/plugins-alternative/Themes/Clean/factory.h b/plugins-alternative/Themes/Clean/factory.h
new file mode 100644
index 0000000..f9b1ee2
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/factory.h
@@ -0,0 +1,39 @@
+/** \file factory.h
+\brief Define the factory, to create instance of the interface
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef FACTORY_H
+#define FACTORY_H
+
+#include <QObject>
+#include <QWidget>
+
+#include "interface.h"
+#include "../../../interface/PluginInterface_Themes.h"
+
+/// \brief Define the factory, to create instance of the interface
+class ThemesFactory : public PluginInterface_ThemesFactory
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.ThemesFactory/1.0.1.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_ThemesFactory)
+ public:
+ /// \brief to return the instance of the copy engine
+ PluginInterface_Themes * getInstance();
+ /// \brief set the resources, to store options, to have facilityInterface
+ void setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion);
+ /// \brief to get the default options widget
+ QWidget * options();
+ /// \brief to get a resource icon
+ QIcon getIcon(const QString &fileName) const;
+ signals:
+ void reloadLanguage();
+ public slots:
+ void resetOptions();
+ void newLanguageLoaded();
+ private:
+ FacilityInterface * facilityEngine;
+};
+
+#endif // FACTORY_H
diff --git a/plugins-alternative/Themes/Clean/informations.xml b/plugins-alternative/Themes/Clean/informations.xml
new file mode 100644
index 0000000..4a2f826
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Clean style for Ultracopier]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Style Clean pour Ultracopier]]></title>
+ <!-- What kind of plugin this is -->
+ <category>Themes</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in RFC822 format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Clean style for Ultracopier]]></description>
+ <description xml:lang="fr"><![CDATA[Style Clean pour Ultracopier]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Clean</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins-alternative/Themes/Clean/interface.cpp b/plugins-alternative/Themes/Clean/interface.cpp
new file mode 100644
index 0000000..3f2cd2a
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/interface.cpp
@@ -0,0 +1,426 @@
+/** \file interface.cpp
+\brief Define the interface core
+\author alpha_one_x86
+*/
+
+#include "interface.h"
+#include "ui_interface.h"
+
+InterfacePlugin::InterfacePlugin(FacilityInterface * facilityEngine) :
+ ui(new Ui::interface())
+{
+ ui->setupUi(this);
+ currentFile = 0;
+ totalFile = 0;
+ currentSize = 0;
+ totalSize = 0;
+ modeIsForced = false;
+ haveStarted = false;
+ this->facilityEngine = facilityEngine;
+ menu=new QMenu(this);
+ ui->toolButton->setMenu(menu);
+ updateModeAndType();
+
+ connect(ui->actionAddFile,&QAction::triggered,this,&InterfacePlugin::forcedModeAddFile);
+ connect(ui->actionAddFileToCopy,&QAction::triggered,this,&InterfacePlugin::forcedModeAddFileToCopy);
+ connect(ui->actionAddFileToMove,&QAction::triggered,this,&InterfacePlugin::forcedModeAddFileToMove);
+ connect(ui->actionAddFolderToCopy,&QAction::triggered,this,&InterfacePlugin::forcedModeAddFolderToCopy);
+ connect(ui->actionAddFolderToMove,&QAction::triggered,this,&InterfacePlugin::forcedModeAddFolderToMove);
+ connect(ui->actionAddFolder,&QAction::triggered,this,&InterfacePlugin::forcedModeAddFolder);
+ show();
+}
+
+InterfacePlugin::~InterfacePlugin()
+{
+ delete menu;
+}
+
+void InterfacePlugin::forcedModeAddFile()
+{
+ emit userAddFile(mode);
+}
+
+void InterfacePlugin::forcedModeAddFolder()
+{
+ emit userAddFolder(mode);
+}
+
+void InterfacePlugin::forcedModeAddFileToCopy()
+{
+ emit userAddFile(Ultracopier::Copy);
+}
+
+void InterfacePlugin::forcedModeAddFolderToCopy()
+{
+ emit userAddFolder(Ultracopier::Copy);
+}
+
+void InterfacePlugin::forcedModeAddFileToMove()
+{
+ emit userAddFile(Ultracopier::Move);
+}
+
+void InterfacePlugin::forcedModeAddFolderToMove()
+{
+ emit userAddFolder(Ultracopier::Move);
+}
+
+void InterfacePlugin::updateModeAndType()
+{
+ menu->clear();
+ if(modeIsForced)
+ {
+ menu->addAction(ui->actionAddFile);
+ if(type==Ultracopier::FileAndFolder)
+ menu->addAction(ui->actionAddFolder);
+ }
+ else
+ {
+ menu->addAction(ui->actionAddFileToCopy);
+ menu->addAction(ui->actionAddFileToMove);
+ if(type==Ultracopier::FileAndFolder)
+ {
+ menu->addAction(ui->actionAddFolderToCopy);
+ menu->addAction(ui->actionAddFolderToMove);
+ }
+ }
+}
+
+void InterfacePlugin::closeEvent(QCloseEvent *event)
+{
+ event->ignore();
+ this->hide();
+ emit cancel();
+}
+
+void InterfacePlugin::detectedSpeed(const quint64 &speed)
+{
+ Q_UNUSED(speed)
+}
+
+QWidget * InterfacePlugin::getOptionsEngineWidget()
+{
+ return NULL;
+}
+
+void InterfacePlugin::getOptionsEngineEnabled(const bool &isEnabled)
+{
+ Q_UNUSED(isEnabled)
+}
+
+void InterfacePlugin::setCopyType(const Ultracopier::CopyType &type)
+{
+ this->type=type;
+ updateModeAndType();
+}
+
+void InterfacePlugin::forceCopyMode(const Ultracopier::CopyMode &mode)
+{
+ modeIsForced=true;
+ this->mode=mode;
+ updateModeAndType();
+}
+
+void InterfacePlugin::updateTitle()
+{
+ QString actionString;
+ switch(action)
+ {
+ case Ultracopier::Listing:
+ actionString=facilityEngine->translateText("Listing");
+ break;
+ case Ultracopier::Copying:
+ actionString=facilityEngine->translateText("Copying");
+ break;
+ case Ultracopier::CopyingAndListing:
+ actionString=facilityEngine->translateText("Listing and copying");
+ break;
+ case Ultracopier::Idle:
+ actionString="Ultracopier";
+ break;
+ }
+ this->setWindowTitle(actionString+" - "+tr("%1/%2 files, %3/%4").arg(currentFile).arg(totalFile).arg(currentSize).arg(totalSize));
+}
+
+void InterfacePlugin::actionInProgess(const Ultracopier::EngineActionInProgress &action)
+{
+ this->action=action;
+ switch(action)
+ {
+ case Ultracopier::Copying:
+ case Ultracopier::CopyingAndListing:
+ ui->progressBar->setMaximum(65535);
+ ui->progressBar->setMinimum(0);
+ break;
+ case Ultracopier::Listing:
+ ui->progressBar->setMaximum(0);
+ ui->progressBar->setMinimum(0);
+ break;
+ case Ultracopier::Idle:
+ if(haveStarted)
+ emit cancel();
+ break;
+ default:
+ break;
+ }
+ switch(action)
+ {
+ case Ultracopier::Copying:
+ case Ultracopier::CopyingAndListing:
+ haveStarted=true;
+ break;
+ default:
+ break;
+ }
+}
+
+void InterfacePlugin::newTransferStart(const Ultracopier::ItemOfCopyList &item)
+{
+ ui->text->setText(item.sourceFullPath);
+}
+
+void InterfacePlugin::newTransferStop(const quint64 &id)
+{
+ Q_UNUSED(id)
+}
+
+void InterfacePlugin::newFolderListing(const QString &path)
+{
+ if(action==Ultracopier::Listing)
+ ui->text->setText(path);
+}
+
+void InterfacePlugin::remainingTime(const int &remainingSeconds)
+{
+ Q_UNUSED(remainingSeconds)
+}
+
+void InterfacePlugin::newCollisionAction(const QString &action)
+{
+ Q_UNUSED(action)
+}
+
+void InterfacePlugin::newErrorAction(const QString &action)
+{
+ Q_UNUSED(action)
+}
+
+void InterfacePlugin::errorDetected()
+{
+}
+
+/// \brief new error
+void InterfacePlugin::errorToRetry(const QString &source,const QString &destination,const QString &error)
+{
+ Q_UNUSED(source);
+ Q_UNUSED(destination);
+ Q_UNUSED(error);
+}
+
+void InterfacePlugin::setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation)
+{
+ Q_UNUSED(transferListOperation)
+}
+
+//speed limitation
+bool InterfacePlugin::setSpeedLimitation(const qint64 &speedLimitation)
+{
+ Q_UNUSED(speedLimitation)
+ return false;
+}
+
+//get information about the copy
+void InterfacePlugin::setGeneralProgression(const quint64 &current,const quint64 &total)
+{
+ ui->progressBar->setValue(((double)current/total)*65535);
+}
+
+void InterfacePlugin::setCollisionAction(const QList<QPair<QString,QString> > &list)
+{
+ Q_UNUSED(list)
+}
+
+void InterfacePlugin::setErrorAction(const QList<QPair<QString,QString> > &list)
+{
+ Q_UNUSED(list)
+}
+
+//edit the transfer list
+void InterfacePlugin::getActionOnList(const QList<Ultracopier::ReturnActionOnCopyList> &returnActions)
+{
+ Q_UNUSED(returnActions)
+}
+
+void InterfacePlugin::haveExternalOrder()
+{
+ ui->toolButton->hide();
+}
+
+void InterfacePlugin::isInPause(const bool &isInPause)
+{
+ //resume in auto the pause
+ if(isInPause)
+ emit resume();
+}
+
+void InterfacePlugin::newLanguageLoaded()
+{
+ ui->retranslateUi(this);
+ updateTitle();
+}
+
+/*
+ Return[0]: totalFile
+ Return[1]: totalSize
+ Return[2]: currentFile
+ */
+void InterfacePlugin::synchronizeItems(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions)
+{
+ loop_size=returnActions.size();
+ index_for_loop=0;
+ while(index_for_loop<loop_size)
+ {
+ const Ultracopier::ReturnActionOnCopyList& action=returnActions.at(index_for_loop);
+ switch(action.type)
+ {
+ case Ultracopier::AddingItem:
+ {
+ totalFile++;
+ totalSize+=action.addAction.size;
+ }
+ break;
+ case Ultracopier::RemoveItem:
+ currentFile++;
+ break;
+ case Ultracopier::PreOperation:
+ {
+ ItemOfCopyListWithMoreInformations tempItem;
+ tempItem.currentProgression=0;
+ tempItem.generalData=action.addAction;
+ currentSize+=action.addAction.size;
+ InternalRunningOperation << tempItem;
+ }
+ break;
+ case Ultracopier::Transfer:
+ {
+ sub_index_for_loop=0;
+ sub_loop_size=InternalRunningOperation.size();
+ while(sub_index_for_loop<sub_loop_size)
+ {
+ if(InternalRunningOperation.at(sub_index_for_loop).generalData.id==action.addAction.id)
+ {
+ InternalRunningOperation[sub_index_for_loop].actionType=action.type;
+ break;
+ }
+ sub_index_for_loop++;
+ }
+ }
+ break;
+ case Ultracopier::PostOperation:
+ {
+ sub_index_for_loop=0;
+ sub_loop_size=InternalRunningOperation.size();
+ while(sub_index_for_loop<sub_loop_size)
+ {
+ if(InternalRunningOperation.at(sub_index_for_loop).generalData.id==action.addAction.id)
+ {
+ InternalRunningOperation.removeAt(sub_index_for_loop);
+ break;
+ }
+ sub_index_for_loop++;
+ }
+ }
+ break;
+ case Ultracopier::CustomOperation:
+ {
+ bool custom_with_progression=(action.addAction.size==1);
+ sub_index_for_loop=0;
+ sub_loop_size=InternalRunningOperation.size();
+ while(sub_index_for_loop<sub_loop_size)
+ {
+ if(InternalRunningOperation.at(sub_index_for_loop).generalData.id==action.addAction.id)
+ {
+ InternalRunningOperation[sub_index_for_loop].actionType=action.type;
+ InternalRunningOperation[sub_index_for_loop].custom_with_progression=custom_with_progression;
+ InternalRunningOperation[sub_index_for_loop].currentProgression=0;
+ break;
+ }
+ sub_index_for_loop++;
+ }
+ }
+ break;
+ default:
+ //unknow code, ignore it
+ break;
+ }
+ index_for_loop++;
+ }
+}
+
+/** \brief support speed limitation */
+void InterfacePlugin::setSupportSpeedLimitation(const bool &supportSpeedLimitationBool)
+{
+ Q_UNUSED(supportSpeedLimitationBool);
+}
+
+void InterfacePlugin::setFileProgression(const QList<Ultracopier::ProgressionItem> &progressionList)
+{
+ loop_size=InternalRunningOperation.size();
+ sub_loop_size=progressionList.size();
+ index_for_loop=0;
+ while(index_for_loop<loop_size)
+ {
+ sub_index_for_loop=0;
+ while(sub_index_for_loop<sub_loop_size)
+ {
+ if(progressionList.at(sub_index_for_loop).id==InternalRunningOperation.at(index_for_loop).generalData.id)
+ {
+ InternalRunningOperation[index_for_loop].generalData.size=progressionList.at(sub_index_for_loop).total;
+ InternalRunningOperation[index_for_loop].currentProgression=(progressionList.at(sub_index_for_loop).currentRead+progressionList.at(sub_index_for_loop).currentWrite)/2;
+ break;
+ }
+ sub_index_for_loop++;
+ }
+ index_for_loop++;
+ }
+}
+
+InterfacePlugin::currentTransfertItem InterfacePlugin::getCurrentTransfertItem()
+{
+ currentTransfertItem returnItem;
+ returnItem.haveItem=InternalRunningOperation.size()>0;
+ if(returnItem.haveItem)
+ {
+ const ItemOfCopyListWithMoreInformations &itemTransfer=InternalRunningOperation.first();
+ returnItem.from=itemTransfer.generalData.sourceFullPath;
+ returnItem.to=itemTransfer.generalData.destinationFullPath;
+ returnItem.current_file=itemTransfer.generalData.destinationFileName+", "+facilityEngine->sizeToString(itemTransfer.generalData.size);
+ switch(itemTransfer.actionType)
+ {
+ case Ultracopier::CustomOperation:
+ if(!itemTransfer.custom_with_progression)
+ returnItem.progressBar_file=0;
+ else
+ {
+ if(itemTransfer.generalData.size>0)
+ returnItem.progressBar_file=((double)itemTransfer.currentProgression/itemTransfer.generalData.size)*65535;
+ else
+ returnItem.progressBar_file=0;
+ }
+ break;
+ case Ultracopier::Transfer:
+ if(itemTransfer.generalData.size>0)
+ returnItem.progressBar_file=((double)itemTransfer.currentProgression/itemTransfer.generalData.size)*65535;
+ else
+ returnItem.progressBar_file=0;
+ break;
+ case Ultracopier::PostOperation:
+ returnItem.progressBar_file=65535;
+ break;
+ default:
+ returnItem.progressBar_file=0;
+ }
+ }
+ return returnItem;
+}
+
diff --git a/plugins-alternative/Themes/Clean/interface.h b/plugins-alternative/Themes/Clean/interface.h
new file mode 100644
index 0000000..e5b5c36
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/interface.h
@@ -0,0 +1,141 @@
+/** \file interface.h
+\brief Define the interface
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef INTERFACE_TEST_H
+#define INTERFACE_TEST_H
+
+#include <QObject>
+#include <QWidget>
+#include <QMenu>
+#include <QCloseEvent>
+
+#include "../../../interface/PluginInterface_Themes.h"
+
+namespace Ui {
+ class interface;
+}
+
+/// \brief Define the interface
+class InterfacePlugin : public PluginInterface_Themes
+{
+ Q_OBJECT
+public slots:
+ //send information about the copy
+ /// \brief to set the action in progress
+ void actionInProgess(const Ultracopier::EngineActionInProgress&);
+ /// \brief new transfer have started
+ void newTransferStart(const Ultracopier::ItemOfCopyList &item);
+ /** \brief one transfer have been stopped
+ * is stopped, example: because error have occurred, and try later, don't remove the item! */
+ void newTransferStop(const quint64 &id);
+ /// \brief the new folder is listing
+ void newFolderListing(const QString &path);
+ /** \brief show the detected speed
+ * in byte per seconds */
+ void detectedSpeed(const quint64 &speed);
+ /** \brief show the remaining time
+ * time in seconds */
+ void remainingTime(const int &remainingSeconds);
+ /// \brief set the current collision action
+ void newCollisionAction(const QString &action);
+ /// \brief set the current error action
+ void newErrorAction(const QString &action);
+ /// \brief set one error is detected
+ void errorDetected();
+ /// \brief new error
+ void errorToRetry(const QString &source,const QString &destination,const QString &error);
+ //speed limitation
+ /** \brief the max speed used
+ * in byte per seconds, -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const qint64 &speedLimitation);
+ //set the translate
+ void newLanguageLoaded();
+ void synchronizeItems(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions);
+ /** \brief support speed limitation */
+ void setSupportSpeedLimitation(const bool &supportSpeedLimitationBool);
+public:
+ /// \brief the transfer item with progression
+ struct ItemOfCopyListWithMoreInformations
+ {
+ quint64 currentProgression;
+ Ultracopier::ItemOfCopyList generalData;
+ Ultracopier::ActionTypeCopyList actionType;
+ bool custom_with_progression;
+ };
+ /// \brief returned first transfer item
+ struct currentTransfertItem
+ {
+ quint64 id;
+ bool haveItem;
+ QString from;
+ QString to;
+ QString current_file;
+ int progressBar_file;
+ };
+ /// \brief get the widget for the copy engine
+ QWidget * getOptionsEngineWidget();
+ /// \brief to set if the copy engine is found
+ void getOptionsEngineEnabled(const bool &isEnabled);
+ /// \brief get action on the transfer list (add/move/remove)
+ void getActionOnList(const QList<Ultracopier::ReturnActionOnCopyList> &returnActions);
+ //get information about the copy
+ /// \brief show the general progression
+ void setGeneralProgression(const quint64 &current,const quint64 &total);
+ /// \brief show the file progression
+ void setFileProgression(const QList<Ultracopier::ProgressionItem> &progressionList);
+ /// \brief set collision action
+ void setCollisionAction(const QList<QPair<QString,QString> > &);
+ /// \brief set error action
+ void setErrorAction(const QList<QPair<QString,QString> > &);
+ /// \brief set the copyType -> file or folder
+ void setCopyType(const Ultracopier::CopyType&);
+ /// \brief set the copyMove -> copy or move, to force in copy or move, else support both
+ void forceCopyMode(const Ultracopier::CopyMode &);
+ /// \brief set if transfer list is exportable/importable
+ void setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation);
+ /** \brief set if the order is external (like file manager copy)
+ * to notify the interface, which can hide add folder/filer button */
+ void haveExternalOrder();
+ /// \brief set if is in pause
+ void isInPause(const bool &);
+signals:
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(const DebugLevel &level,const QString &fonction,const QString &text,const QString &file,const int &ligne);
+ #endif
+public:
+ //constructor and destructor
+ InterfacePlugin(FacilityInterface * facilityEngine);
+ ~InterfacePlugin();
+private:
+ Ui::interface *ui;
+ quint64 currentFile;
+ quint64 totalFile;
+ quint64 currentSize;
+ quint64 totalSize;
+ void updateTitle();
+ QMenu *menu;
+ Ultracopier::EngineActionInProgress action;
+ void closeEvent(QCloseEvent *event);
+ void updateModeAndType();
+ bool modeIsForced;
+ Ultracopier::CopyType type;
+ Ultracopier::CopyMode mode;
+ bool haveStarted;
+ QList<ItemOfCopyListWithMoreInformations> InternalRunningOperation;
+ int loop_size,index_for_loop;
+ int sub_loop_size,sub_index_for_loop;
+ currentTransfertItem getCurrentTransfertItem();
+ FacilityInterface * facilityEngine;
+private slots:
+ void forcedModeAddFile();
+ void forcedModeAddFolder();
+ void forcedModeAddFileToCopy();
+ void forcedModeAddFolderToCopy();
+ void forcedModeAddFileToMove();
+ void forcedModeAddFolderToMove();
+};
+
+#endif // INTERFACE_TEST_H
diff --git a/plugins-alternative/Themes/Clean/interface.pro b/plugins-alternative/Themes/Clean/interface.pro
new file mode 100644
index 0000000..eb124c9
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/interface.pro
@@ -0,0 +1,46 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+QT += widgets
+TEMPLATE = lib
+CONFIG += plugin
+HEADERS = interface.h \
+ StructEnumDefinition.h \
+ factory.h \
+ ../../../interface/PluginInterface_Themes.h
+SOURCES = interface.cpp \
+ factory.cpp
+TARGET = $$qtLibraryTarget(interface)
+TRANSLATIONS += Languages/ar/translation.ts \
+ Languages/de/translation.ts \
+ Languages/el/translation.ts \
+ Languages/en/translation.ts \
+ Languages/es/translation.ts \
+ Languages/fr/translation.ts \
+ Languages/hi/translation.ts \
+ Languages/hu/translation.ts \
+ Languages/id/translation.ts \
+ Languages/it/translation.ts \
+ Languages/ja/translation.ts \
+ Languages/ko/translation.ts \
+ Languages/nl/translation.ts \
+ Languages/no/translation.ts \
+ Languages/pl/translation.ts \
+ Languages/ru/translation.ts \
+ Languages/th/translation.ts \
+ Languages/tr/translation.ts \
+ Languages/zh/translation.ts
+
+FORMS += \
+ interface.ui
+
+RESOURCES += \
+ resources.qrc
+
+win32 {
+ RESOURCES += resources_windows.qrc
+}
+!win32 {
+ RESOURCES += resources_unix.qrc
+}
diff --git a/plugins-alternative/Themes/Clean/interface.ui b/plugins-alternative/Themes/Clean/interface.ui
new file mode 100644
index 0000000..f178af7
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/interface.ui
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>interface</class>
+ <widget class="QWidget" name="interface">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>139</width>
+ <height>55</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Ultracopier</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>:/systray_Caught_Unix.png</normaloff>:/systray_Caught_Unix.png</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="text">
+ <property name="text">
+ <string>Action:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="action">
+ <property name="font">
+ <font>
+ <italic>true</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>Waiting</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QProgressBar" name="progressBar">
+ <property name="maximum">
+ <number>65535</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolButton">
+ <property name="text">
+ <string notr="true">...</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ <action name="actionAddFile">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Clean/resources/add.png</normaloff>:/Themes/Clean/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add file</string>
+ </property>
+ </action>
+ <action name="actionAddFolder">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Clean/resources/add.png</normaloff>:/Themes/Clean/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add folder</string>
+ </property>
+ </action>
+ <action name="actionAddFileToMove">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Clean/resources/add.png</normaloff>:/Themes/Clean/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Move file(s)</string>
+ </property>
+ </action>
+ <action name="actionAddFolderToMove">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Clean/resources/add.png</normaloff>:/Themes/Clean/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Move folder</string>
+ </property>
+ </action>
+ <action name="actionAddFileToCopy">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Clean/resources/add.png</normaloff>:/Themes/Clean/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy file(s)</string>
+ </property>
+ </action>
+ <action name="actionAddFolderToCopy">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Clean/resources/add.png</normaloff>:/Themes/Clean/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy folder</string>
+ </property>
+ </action>
+ </widget>
+ <resources>
+ <include location="resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/plugins-alternative/Themes/Clean/plugin.json b/plugins-alternative/Themes/Clean/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins-alternative/Themes/Clean/resources.qrc b/plugins-alternative/Themes/Clean/resources.qrc
new file mode 100644
index 0000000..40533c4
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/Themes/Clean">
+ <file>resources/SystemTrayIcon/informations.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/informations.png b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/informations.png
new file mode 100644
index 0000000..5b7b255
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/informations.png
Binary files differ
diff --git a/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Caught_Unix.png b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Caught_Unix.png
new file mode 100644
index 0000000..6f5d1cf
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Caught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Caught_Windows.png b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Caught_Windows.png
new file mode 100644
index 0000000..5464856
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Caught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
new file mode 100644
index 0000000..3961215
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
new file mode 100644
index 0000000..45d6315
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Uncaught_Unix.png b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Uncaught_Unix.png
new file mode 100644
index 0000000..ac4299a
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Uncaught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Uncaught_Windows.png b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Uncaught_Windows.png
new file mode 100644
index 0000000..6e6bae7
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources/SystemTrayIcon/systray_Uncaught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Clean/resources_unix.qrc b/plugins-alternative/Themes/Clean/resources_unix.qrc
new file mode 100644
index 0000000..847cc1c
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources_unix.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Clean">
+ <file>resources/SystemTrayIcon/systray_Caught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Unix.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins-alternative/Themes/Clean/resources_windows.qrc b/plugins-alternative/Themes/Clean/resources_windows.qrc
new file mode 100644
index 0000000..7d8bbe1
--- /dev/null
+++ b/plugins-alternative/Themes/Clean/resources_windows.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Clean">
+ <file>resources/SystemTrayIcon/systray_Caught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Windows.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins-alternative/Themes/Teracopy/DebugEngineMacro.h b/plugins-alternative/Themes/Teracopy/DebugEngineMacro.h
new file mode 100644
index 0000000..4582010
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins-alternative/Themes/Teracopy/Environment.h b/plugins-alternative/Themes/Teracopy/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins-alternative/Themes/Teracopy/Languages/ar/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/ar/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/ar/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/de/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/de/translation.ts
new file mode 100644
index 0000000..a2da10c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/de/translation.ts
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation>Total: %1 von %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation>%1 von %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation>%1% erledigt</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation>&amp;Mehr</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Pause</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation>überspringen (&amp;S)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation>Abbrechen (&amp;C)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;unterstützen Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation>Datei hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation>Ordner hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation>Datei (en) verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation>Ordner verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation>Datei (en) kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation>Verzeichnis kopieren</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/el/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/el/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/el/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/en/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/en/translation.ts
new file mode 100644
index 0000000..d9fb1d6
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/en/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/es/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/es/translation.ts
new file mode 100644
index 0000000..5081c0f
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/es/translation.ts
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished">Total: %1 de %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished">%1 de %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished">%1% hecho</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation>Más</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation>Pausa</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Apoyar Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation>Añadir archivo</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation>Añadir carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation>Mover archivo(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation>Mueva la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation>Copia el archivo(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation>Copia la carpeta</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/fr/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/fr/translation.ts
new file mode 100644
index 0000000..fd6eaa1
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/fr/translation.ts
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation>Total: %1 sur %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation>%1 sur %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translatorcomment>Exemple: 90% fait</translatorcomment>
+ <translation>%1% fait</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation>&amp;Plus</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Pause</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Anuler</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Supporter Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation>Ajouter un fichier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation>Ajouter un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation>Déplacer des fichier(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation>Déplacer un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation>Copier des fichier(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation>Copier un dossier</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/hi/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/hi/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/hi/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/hu/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/hu/translation.ts
new file mode 100644
index 0000000..3d940b4
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/hu/translation.ts
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="hu">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation>Összesen: %1 / %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation>%1 / %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation>%1% kész</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation>&amp;Több</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Szünet</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Kihagy</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Mégse</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Támogasd az Ultracopier-t&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation>Fájl hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation>Mappa hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation>Fájl(ok) mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation>Mappa mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation>Fájl(ok) másolása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation>Mappa másolása</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/id/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/id/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/id/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/it/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/it/translation.ts
new file mode 100644
index 0000000..31d775e
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/it/translation.ts
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="it" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation>Totale: %1 di %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation>%1 di %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation>%1% fatto</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation>Alt&amp;o</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Pausa</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Salta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Supporto Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation>Aggiungi file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation>Aggiungi cartella</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation>Sposta file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation>Sposta la cartella</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation>Copia file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation>Copia la cartella</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/ja/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/ja/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/ja/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/ko/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/ko/translation.ts
new file mode 100644
index 0000000..06946e9
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/ko/translation.ts
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ko_KR">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="+95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished">전체: %3 / %2 {1 ?}</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished">%1 / %2</translation>
+ </message>
+ <message>
+ <location line="+154"/>
+ <source>%1% done</source>
+ <translation type="unfinished">%1% 완료</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="+159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished">&amp;자세히</translation>
+ </message>
+ <message>
+ <location line="+13"/>
+ <source>...</source>
+ <translation type="unfinished">...</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished">&amp;일시 중지</translation>
+ </message>
+ <message>
+ <location line="+22"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished">&amp;건너뛰기</translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;취소</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Ultracopier 지원&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location line="+27"/>
+ <source>Add file</source>
+ <translation type="unfinished">파일 추가</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Add folder</source>
+ <translation type="unfinished">폴더 추가</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished">파일 이동</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move folder</source>
+ <translation type="unfinished">폴더 이동</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished">파일 복사</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy folder</source>
+ <translation type="unfinished">폴더 복사</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/nl/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/nl/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/nl/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/no/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/no/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/no/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/pl/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/pl/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/pl/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/ru/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/ru/translation.ts
new file mode 100644
index 0000000..db1059e
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/ru/translation.ts
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru" sourcelanguage="et">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished">Всего: %1 из %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished">%1 из %2</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished">%1% сделанный</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation>больше</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation>пауза</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation>пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation>отменить</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;поддержка Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation>Добавить файл</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation>Добавить папку</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation>Перемещение файла(ов)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation>Перемещение папки</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation>Копировать файл(ы)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation>Копировать папку</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/th/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/th/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/th/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/tr/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/tr/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/tr/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/Languages/zh/translation.ts b/plugins-alternative/Themes/Teracopy/Languages/zh/translation.ts
new file mode 100644
index 0000000..b76694c
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Languages/zh/translation.ts
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="95"/>
+ <source>Total: %1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="96"/>
+ <source>%1 of %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="250"/>
+ <source>%1% done</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="159"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="172"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="210"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="232"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="251"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="281"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="308"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="317"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="326"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="335"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="344"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="353"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Teracopy/StructEnumDefinition.h b/plugins-alternative/Themes/Teracopy/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins-alternative/Themes/Teracopy/TransferModel.cpp b/plugins-alternative/Themes/Teracopy/TransferModel.cpp
new file mode 100644
index 0000000..24812a0
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/TransferModel.cpp
@@ -0,0 +1,528 @@
+#include "TransferModel.h"
+
+#define COLUMN_COUNT 3
+
+// Model
+
+TransferModel::TransferModel()
+{
+ iconStart=QIcon(":/Themes/Teracopy/resources/player_play.png");
+ iconPause=QIcon(":/Themes/Teracopy/resources/player_pause.png");
+ iconStop=QIcon(":/Themes/Teracopy/resources/checkbox.png");
+ currentIndexSearch=0;
+ haveSearchItem=false;
+ facilityEngine=NULL;
+}
+
+int TransferModel::columnCount( const QModelIndex& parent ) const
+{
+ return parent == QModelIndex() ? COLUMN_COUNT : 0;
+}
+
+QVariant TransferModel::data( const QModelIndex& index, int role ) const
+{
+ int row,column;
+ row=index.row();
+ column=index.column();
+ if(index.parent()!=QModelIndex() || row < 0 || row >= transfertItemList.count() || column < 0 || column >= COLUMN_COUNT)
+ return QVariant();
+
+ const transfertItem& item = transfertItemList[row];
+ if(role==Qt::UserRole)
+ return item.id;
+ else if(role==Qt::DisplayRole)
+ {
+ switch(column)
+ {
+ case 0:
+ return item.source;
+ break;
+ case 1:
+ return item.size;
+ break;
+ case 2:
+ return item.destination;
+ break;
+ default:
+ return QVariant();
+ }
+ }
+ else if(role==Qt::DecorationRole)
+ {
+ switch(column)
+ {
+ case 0:
+ /*if(item.done)
+ return iconStop;
+ else */if(stopId.contains(item.id))
+ return iconPause;
+ else if(startId.contains(item.id))
+ return iconStart;
+ else
+ return QVariant();
+ break;
+ default:
+ return QVariant();
+ }
+ }
+ else if(role==Qt::BackgroundRole)
+ {
+ if(!search_text.isEmpty() && (item.source.indexOf(search_text,0,Qt::CaseInsensitive)!=-1 || item.destination.indexOf(search_text,0,Qt::CaseInsensitive)!=-1))
+ {
+ if(haveSearchItem && searchId==item.id)
+ return QColor(255,150,150,100);
+ else
+ return QColor(255,255,0,100);
+ }
+ else
+ return QVariant();
+ }
+ return QVariant();
+}
+
+int TransferModel::rowCount( const QModelIndex& parent ) const
+{
+ return parent == QModelIndex() ? transfertItemList.count() : 0;
+}
+
+quint64 TransferModel::firstId()
+{
+ if(transfertItemList.count()>0)
+ return transfertItemList[0].id;
+ else
+ return 0;
+}
+
+QVariant TransferModel::headerData( int section, Qt::Orientation orientation, int role ) const
+{
+ if ( role == Qt::DisplayRole && orientation == Qt::Horizontal && section >= 0 && section < COLUMN_COUNT ) {
+ switch ( section ) {
+ case 0:
+ return facilityEngine->translateText("Source");
+ case 1:
+ return facilityEngine->translateText("Size");
+ case 2:
+ return facilityEngine->translateText("Destination");
+ }
+ }
+
+ return QAbstractTableModel::headerData( section, orientation, role );
+}
+
+bool TransferModel::setData( const QModelIndex& index, const QVariant& value, int role )
+{
+ row=index.row();
+ column=index.column();
+ if(index.parent()!=QModelIndex() || row < 0 || row >= transfertItemList.count() || column < 0 || column >= COLUMN_COUNT)
+ return false;
+
+ transfertItem& item = transfertItemList[row];
+ if(role==Qt::UserRole)
+ {
+ item.id=value.toULongLong();
+ return true;
+ }
+ else if(role==Qt::DisplayRole)
+ {
+ switch(column)
+ {
+ case 0:
+ item.source=value.toString();
+ emit dataChanged(index,index);
+ return true;
+ break;
+ case 1:
+ item.size=value.toString();
+ emit dataChanged(index,index);
+ return true;
+ break;
+ case 2:
+ item.destination=value.toString();
+ emit dataChanged(index,index);
+ return true;
+ break;
+ default:
+ return false;
+ }
+ }
+ return false;
+}
+
+/*
+ Return[0]: totalFile
+ Return[1]: totalSize
+ Return[2]: currentFile
+ */
+QList<quint64> TransferModel::synchronizeItems(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions)
+{
+ loop_size=returnActions.size();
+ index_for_loop=0;
+ totalFile=0;
+ totalSize=0;
+ currentFile=0;
+ emit layoutAboutToBeChanged();
+ while(index_for_loop<loop_size)
+ {
+ const Ultracopier::ReturnActionOnCopyList& action=returnActions.at(index_for_loop);
+ switch(action.type)
+ {
+ case Ultracopier::AddingItem:
+ {
+ transfertItem newItem;
+ newItem.id=action.addAction.id;
+ newItem.source=action.addAction.sourceFullPath;
+ newItem.size=facilityEngine->sizeToString(action.addAction.size);
+ newItem.destination=action.addAction.destinationFullPath;
+// newItem.done=false;
+ transfertItemList<<newItem;
+ totalFile++;
+ totalSize+=action.addAction.size;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, size: %2, name: %3").arg(action.addAction.id).arg(action.addAction.size).arg(action.addAction.sourceFullPath));
+ }
+ break;
+ case Ultracopier::MoveItem:
+ {
+ //bool current_entry=
+ if(action.userAction.position<0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position));
+ break;
+ }
+ if(action.userAction.position>(transfertItemList.size()-1))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position));
+ break;
+ }
+ if(action.userAction.moveAt<0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position));
+ break;
+ }
+ if(action.userAction.moveAt>(transfertItemList.size()-1))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position));
+ break;
+ }
+ transfertItemList.move(action.userAction.position,action.userAction.moveAt);
+ }
+ break;
+ case Ultracopier::RemoveItem:
+ {
+ if(currentIndexSearch>0 && action.userAction.position<=currentIndexSearch)
+ currentIndexSearch--;
+ if(action.userAction.position<0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position));
+ break;
+ }
+ if(action.userAction.position>(transfertItemList.size()-1))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position));
+ break;
+ }
+ transfertItemList.removeAt(action.userAction.position);
+ currentFile++;
+ startId.remove(action.addAction.id);
+ stopId.remove(action.addAction.id);
+ internalRunningOperation.remove(action.addAction.id);
+ }
+ break;
+ case Ultracopier::PreOperation:
+ {
+ ItemOfCopyListWithMoreInformations tempItem;
+ tempItem.currentReadProgression=0;
+ tempItem.currentWriteProgression=0;
+ tempItem.generalData=action.addAction;
+ tempItem.actionType=action.type;
+ internalRunningOperation[action.addAction.id]=tempItem;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("set for file %1: actionType: PreOperation").arg(action.addAction.id));
+ }
+ break;
+ case Ultracopier::Transfer:
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("found entry for file %1: actionType: Transfer").arg(action.addAction.id));
+ if(!startId.contains(action.addAction.id))
+ startId << action.addAction.id;
+ stopId.remove(action.addAction.id);
+ if(internalRunningOperation.contains(action.addAction.id))
+ internalRunningOperation[action.addAction.id].actionType=action.type;
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unable to found entry for file %1: actionType: Transfer").arg(action.addAction.id));
+ }
+ break;
+ case Ultracopier::PostOperation:
+ {
+ if(!stopId.contains(action.addAction.id))
+ stopId << action.addAction.id;
+ startId.remove(action.addAction.id);
+ }
+ break;
+ case Ultracopier::CustomOperation:
+ {
+ bool custom_with_progression=(action.addAction.size==1);
+ //without progression
+ if(custom_with_progression)
+ {
+ if(startId.remove(action.addAction.id))
+ if(!stopId.contains(action.addAction.id))
+ stopId << action.addAction.id;
+ }
+ //with progression
+ else
+ {
+ stopId.remove(action.addAction.id);
+ if(!startId.contains(action.addAction.id))
+ startId << action.addAction.id;
+ }
+ if(internalRunningOperation.contains(action.addAction.id))
+ {
+ ItemOfCopyListWithMoreInformations &item=internalRunningOperation[action.addAction.id];
+ item.actionType=action.type;
+ item.custom_with_progression=custom_with_progression;
+ item.currentReadProgression=0;
+ item.currentWriteProgression=0;
+ }
+ }
+ break;
+ default:
+ //unknow code, ignore it
+ break;
+ }
+ index_for_loop++;
+ }
+ emit layoutChanged();
+ return QList<quint64>() << totalFile << totalSize << currentFile;
+}
+
+void TransferModel::setFacilityEngine(FacilityInterface * facilityEngine)
+{
+ this->facilityEngine=facilityEngine;
+}
+
+int TransferModel::search(const QString &text,bool searchNext)
+{
+ emit layoutAboutToBeChanged();
+ search_text=text;
+ emit layoutChanged();
+ if(transfertItemList.size()==0)
+ return -1;
+ if(text.isEmpty())
+ return -1;
+ if(searchNext)
+ {
+ currentIndexSearch++;
+ if(currentIndexSearch>=loop_size)
+ currentIndexSearch=0;
+ }
+ index_for_loop=0;
+ loop_size=transfertItemList.size();
+ while(index_for_loop<loop_size)
+ {
+ if(transfertItemList.at(currentIndexSearch).source.indexOf(search_text,0,Qt::CaseInsensitive)!=-1 || transfertItemList.at(currentIndexSearch).destination.indexOf(search_text,0,Qt::CaseInsensitive)!=-1)
+ {
+ haveSearchItem=true;
+ searchId=transfertItemList.at(currentIndexSearch).id;
+ return currentIndexSearch;
+ }
+ currentIndexSearch++;
+ if(currentIndexSearch>=loop_size)
+ currentIndexSearch=0;
+ index_for_loop++;
+ }
+ haveSearchItem=false;
+ return -1;
+}
+
+int TransferModel::searchPrev(const QString &text)
+{
+ emit layoutAboutToBeChanged();
+ search_text=text;
+ emit layoutChanged();
+ if(transfertItemList.size()==0)
+ return -1;
+ if(text.isEmpty())
+ return -1;
+ if(currentIndexSearch==0)
+ currentIndexSearch=loop_size-1;
+ else
+ currentIndexSearch--;
+ index_for_loop=0;
+ loop_size=transfertItemList.size();
+ while(index_for_loop<loop_size)
+ {
+ if(transfertItemList.at(currentIndexSearch).source.indexOf(search_text,0,Qt::CaseInsensitive)!=-1 || transfertItemList.at(currentIndexSearch).destination.indexOf(search_text,0,Qt::CaseInsensitive)!=-1)
+ {
+ haveSearchItem=true;
+ searchId=transfertItemList.at(currentIndexSearch).id;
+ return currentIndexSearch;
+ }
+ if(currentIndexSearch==0)
+ currentIndexSearch=loop_size-1;
+ else
+ currentIndexSearch--;
+ index_for_loop++;
+ }
+ haveSearchItem=false;
+ return -1;
+}
+
+void TransferModel::setFileProgression(QList<Ultracopier::ProgressionItem> &progressionList)
+{
+ loop_size=progressionList.size();
+ index_for_loop=0;
+ while(index_for_loop<loop_size)
+ {
+ if(internalRunningOperation.contains(progressionList.at(index_for_loop).id))
+ {
+ internalRunningOperation[progressionList.at(index_for_loop).id].generalData.size=progressionList.at(index_for_loop).total;
+ internalRunningOperation[progressionList.at(index_for_loop).id].currentReadProgression=progressionList.at(index_for_loop).currentRead;
+ internalRunningOperation[progressionList.at(index_for_loop).id].currentWriteProgression=progressionList.at(index_for_loop).currentWrite;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ progressionList.removeAt(index_for_loop);
+ index_for_loop--;
+ loop_size--;
+ #endif
+ }
+ index_for_loop++;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(progressionList.size()>0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"progression remaning items");
+ #endif
+}
+
+TransferModel::currentTransfertItem TransferModel::getCurrentTransfertItem()
+{
+ currentTransfertItem returnItem;
+ returnItem.progressBar_read=-1;
+ returnItem.progressBar_write=0;
+ returnItem.haveItem=startId.size()>0;
+ if(returnItem.haveItem)
+ {
+ if(!internalRunningOperation.contains(*startId.constBegin()))
+ {
+ returnItem.haveItem=false;
+ return returnItem;
+ }
+ const ItemOfCopyListWithMoreInformations &itemTransfer=internalRunningOperation[*startId.constBegin()];
+ returnItem.from=itemTransfer.generalData.sourceFullPath;
+ returnItem.to=itemTransfer.generalData.destinationFullPath;
+ returnItem.current_file=itemTransfer.generalData.destinationFileName+", "+facilityEngine->sizeToString(itemTransfer.generalData.size);
+ returnItem.id=itemTransfer.generalData.id;
+ switch(itemTransfer.actionType)
+ {
+ case Ultracopier::CustomOperation:
+ if(!itemTransfer.custom_with_progression)
+ returnItem.progressBar_read=-1;
+ else
+ {
+ if(itemTransfer.generalData.size>0)
+ {
+ returnItem.progressBar_read=((double)itemTransfer.currentReadProgression/itemTransfer.generalData.size)*65535;
+ returnItem.progressBar_write=((double)itemTransfer.currentWriteProgression/itemTransfer.generalData.size)*65535;
+ }
+ else
+ returnItem.progressBar_read=-1;
+ }
+ break;
+ case Ultracopier::Transfer:
+ if(itemTransfer.generalData.size>0)
+ {
+ returnItem.progressBar_read=((double)itemTransfer.currentReadProgression/itemTransfer.generalData.size)*65535;
+ returnItem.progressBar_write=((double)itemTransfer.currentWriteProgression/itemTransfer.generalData.size)*65535;
+ }
+ else
+ {
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ }
+ break;
+ //should never pass here
+ case Ultracopier::PostOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ returnItem.progressBar_read=65535;
+ returnItem.progressBar_write=65535;
+ break;
+ //should never pass here
+ case Ultracopier::PreOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ break;
+ default:
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unknow action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ break;
+ }
+ }
+ else
+ {
+ returnItem.haveItem=stopId.size()>0;
+ if(returnItem.haveItem)
+ {
+ if(!internalRunningOperation.contains(*stopId.constBegin()))
+ {
+ returnItem.haveItem=false;
+ return returnItem;
+ }
+ const ItemOfCopyListWithMoreInformations &itemTransfer=internalRunningOperation[*stopId.constBegin()];
+ returnItem.from=itemTransfer.generalData.sourceFullPath;
+ returnItem.to=itemTransfer.generalData.destinationFullPath;
+ returnItem.current_file=itemTransfer.generalData.destinationFileName+", "+facilityEngine->sizeToString(itemTransfer.generalData.size);
+ returnItem.id=itemTransfer.generalData.id;
+ switch(itemTransfer.actionType)
+ {
+ case Ultracopier::CustomOperation:
+ if(!itemTransfer.custom_with_progression)
+ returnItem.progressBar_read=-1;
+ else
+ {
+ if(itemTransfer.generalData.size>0)
+ {
+ returnItem.progressBar_read=((double)itemTransfer.currentReadProgression/itemTransfer.generalData.size)*65535;
+ returnItem.progressBar_write=((double)itemTransfer.currentWriteProgression/itemTransfer.generalData.size)*65535;
+ }
+ else
+ returnItem.progressBar_read=-1;
+ }
+ break;
+ case Ultracopier::Transfer:
+ if(itemTransfer.generalData.size>0)
+ {
+ returnItem.progressBar_read=((double)itemTransfer.currentReadProgression/itemTransfer.generalData.size)*65535;
+ returnItem.progressBar_write=((double)itemTransfer.currentWriteProgression/itemTransfer.generalData.size)*65535;
+ }
+ else
+ {
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ }
+ break;
+ case Ultracopier::PostOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ returnItem.progressBar_read=65535;
+ returnItem.progressBar_write=65535;
+ break;
+ //should never pass here
+ case Ultracopier::PreOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ break;
+ default:
+ returnItem.progressBar_read=65535;
+ returnItem.progressBar_write=65535;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unknow action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ break;
+ }
+ }
+ }
+ if(returnItem.haveItem && returnItem.progressBar_read!=-1 && returnItem.progressBar_write>returnItem.progressBar_read)
+ {
+ int tempVar=returnItem.progressBar_write;
+ returnItem.progressBar_write=returnItem.progressBar_read;
+ returnItem.progressBar_read=tempVar;
+ }
+ return returnItem;
+}
diff --git a/plugins-alternative/Themes/Teracopy/TransferModel.h b/plugins-alternative/Themes/Teracopy/TransferModel.h
new file mode 100644
index 0000000..977c986
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/TransferModel.h
@@ -0,0 +1,92 @@
+#ifndef TRANSFERMODEL_H
+#define TRANSFERMODEL_H
+
+#include <QAbstractTableModel>
+#include <QModelIndex>
+#include <QVariant>
+#include <QList>
+#include <QSet>
+#include <QIcon>
+#include <QString>
+
+#include "StructEnumDefinition.h"
+#include "Environment.h"
+
+#include "../../../interface/FacilityInterface.h"
+
+/// \brief model to store the transfer list
+class TransferModel : public QAbstractTableModel
+{
+ Q_OBJECT
+public:
+ /// \brief the transfer item displayed
+ struct transfertItem
+ {
+ quint64 id;
+ QString source;
+ QString size;
+ QString destination;
+ };
+ /// \brief the transfer item with progression
+ struct ItemOfCopyListWithMoreInformations
+ {
+ quint64 currentReadProgression,currentWriteProgression;
+ Ultracopier::ItemOfCopyList generalData;
+ Ultracopier::ActionTypeCopyList actionType;
+ bool custom_with_progression;
+ };
+ /// \brief returned first transfer item
+ struct currentTransfertItem
+ {
+ quint64 id;
+ bool haveItem;
+ QString from;
+ QString to;
+ QString current_file;
+ int progressBar_read,progressBar_write;
+ };
+
+ TransferModel();
+
+ virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
+ virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+ virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
+
+ QList<quint64> synchronizeItems(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions);
+ void setFacilityEngine(FacilityInterface * facilityEngine);
+
+ int search(const QString &text,bool searchNext);
+ int searchPrev(const QString &text);
+
+ void setFileProgression(QList<Ultracopier::ProgressionItem> &progressionList);
+
+ currentTransfertItem getCurrentTransfertItem();
+
+ quint64 firstId();
+protected:
+ QList<transfertItem> transfertItemList;///< To have a transfer list for the user
+ QList<transfertItem> transfertItemListDone;///< To have a transfer list for the user
+ QSet<quint64> startId,stopId;///< To show what is started, what is stopped
+ QHash<quint64,ItemOfCopyListWithMoreInformations> internalRunningOperation;///< to have progression and stat
+ QIcon iconStart,iconPause,iconStop;
+private:
+ int loop_size,index_for_loop;
+ int sub_loop_size,sub_index_for_loop;
+ int row,column;
+ quint64 totalFile,totalSize,currentFile;
+ FacilityInterface * facilityEngine;
+ QString search_text;
+ /// \brief index from start the search, decresed by remove before it
+ int currentIndexSearch;
+ bool haveSearchItem;
+ quint64 searchId;
+signals:
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const QString &fonction,const QString &text,const QString &file,const int &ligne);
+ #endif
+};
+
+#endif // TRANSFERMODEL_H
diff --git a/plugins-alternative/Themes/Teracopy/Variable.h b/plugins-alternative/Themes/Teracopy/Variable.h
new file mode 100644
index 0000000..963d0c8
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/Variable.h
@@ -0,0 +1,15 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins-alternative/Themes/Teracopy/documentation.dox b/plugins-alternative/Themes/Teracopy/documentation.dox
new file mode 100644
index 0000000..ee76e20
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/documentation.dox
@@ -0,0 +1,28 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage Teracopy
+
+ \section mainpage_overview Overview
+
+ It's Teracopy interface, to come from Teracopy to Ultracopier.\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>. Is part of Ultracopier project as alternative plugin.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.
+
+*/
diff --git a/plugins-alternative/Themes/Teracopy/factory.cpp b/plugins-alternative/Themes/Teracopy/factory.cpp
new file mode 100644
index 0000000..2b176bf
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/factory.cpp
@@ -0,0 +1,70 @@
+/** \file factory.cpp
+\brief Define the factory core
+\author alpha_one_x86
+*/
+
+#include "factory.h"
+
+PluginInterface_Themes * ThemesFactory::getInstance()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ Themes * newInterface=new Themes(facilityEngine);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(newInterface,&Themes::debugInformation,this,&PluginInterface_ThemesFactory::debugInformation);
+ #endif
+ connect(this,&ThemesFactory::reloadLanguage,newInterface,&Themes::newLanguageLoaded);
+ return newInterface;
+}
+
+void ThemesFactory::setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion)
+{
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ this->facilityEngine=facilityInterface;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, writePath: "+writePath+", pluginPath: "+pluginPath);
+ Q_UNUSED(portableVersion);
+ Q_UNUSED(options);
+}
+
+QWidget * ThemesFactory::options()
+{
+ return NULL;
+}
+
+void ThemesFactory::resetOptions()
+{
+}
+
+QIcon ThemesFactory::getIcon(const QString &fileName) const
+{
+ if(fileName=="SystemTrayIcon/exit.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("application-exit");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/add.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("list-add");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/informations.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("help-about");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/options.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("applications-system");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ return QIcon(":/Themes/Teracopy/resources/"+fileName);
+}
+
+void ThemesFactory::newLanguageLoaded()
+{
+ emit reloadLanguage();
+}
diff --git a/plugins-alternative/Themes/Teracopy/factory.h b/plugins-alternative/Themes/Teracopy/factory.h
new file mode 100644
index 0000000..0b3bb3f
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/factory.h
@@ -0,0 +1,42 @@
+/** \file factory.h
+\brief Define the factory
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef FACTORY_H
+#define FACTORY_H
+
+#include <QObject>
+#include <QWidget>
+#include <QMenu>
+#include <QCloseEvent>
+
+#include "../../../interface/PluginInterface_Themes.h"
+#include "interface.h"
+#include "Environment.h"
+
+/// \brief Define the factory, to create instance of the interface
+class ThemesFactory : public PluginInterface_ThemesFactory
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.ThemesFactory/1.0.1.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_ThemesFactory)
+public:
+ /// \brief to return the instance of the copy engine
+ PluginInterface_Themes * getInstance();
+ /// \brief set the resources, to store options, to have facilityInterface
+ void setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion);
+ /// \brief to get the default options widget
+ QWidget * options();
+ /// \brief to get a resource icon
+ QIcon getIcon(const QString &fileName) const;
+public slots:
+ void resetOptions();
+ void newLanguageLoaded();
+signals:
+ void reloadLanguage();
+private:
+ FacilityInterface * facilityEngine;
+};
+
+#endif // FACTORY_H
diff --git a/plugins-alternative/Themes/Teracopy/informations.xml b/plugins-alternative/Themes/Teracopy/informations.xml
new file mode 100644
index 0000000..a28e08d
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Teracopy style for Ultracopier]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Style Teracopy pour Ultracopier]]></title>
+ <!-- What kind of plugin this is -->
+ <category>Themes</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Teracopy style for Ultracopier, reproduct with screenshot on internet]]></description>
+ <description xml:lang="fr"><![CDATA[Style Teracopy pour Ultracopier, reproduit avec les screenshots vu sur internet]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Teracopy</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins-alternative/Themes/Teracopy/interface.cpp b/plugins-alternative/Themes/Teracopy/interface.cpp
new file mode 100644
index 0000000..64220d0
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/interface.cpp
@@ -0,0 +1,500 @@
+/** \file interface.cpp
+\brief Define the interface core
+\author alpha_one_x86
+*/
+
+#include <QMessageBox>
+#include <cmath>
+
+#include "interface.h"
+#include "ui_interface.h"
+
+// The cmath header from MSVC does not contain round()
+#if (defined(_WIN64) || defined(_WIN32)) && defined(_MSC_VER)
+inline double round(double d) {
+ return floor( d + 0.5 );
+}
+#endif
+
+Themes::Themes(FacilityInterface * facilityEngine) :
+ ui(new Ui::interfaceCopy())
+{
+ this->facilityEngine=facilityEngine;
+ ui->setupUi(this);
+ transferModel.setFacilityEngine(facilityEngine);
+ ui->TransferList->setModel(&transferModel);
+
+ currentFile = 0;
+ totalFile = 0;
+ currentSize = 0;
+ totalSize = 0;
+ storeIsInPause = false;
+ modeIsForced = false;
+ haveStarted = false;
+ speedString = facilityEngine->speedToString(0);
+ ui->toolButtonMenu->setMenu(&menu);
+
+ connect(ui->actionAddFile,&QAction::triggered,this,&Themes::forcedModeAddFile);
+ connect(ui->actionAddFileToCopy,&QAction::triggered,this,&Themes::forcedModeAddFileToCopy);
+ connect(ui->actionAddFileToMove,&QAction::triggered,this,&Themes::forcedModeAddFileToMove);
+ connect(ui->actionAddFolderToCopy,&QAction::triggered,this,&Themes::forcedModeAddFolderToCopy);
+ connect(ui->actionAddFolderToMove,&QAction::triggered,this,&Themes::forcedModeAddFolderToMove);
+ connect(ui->actionAddFolder,&QAction::triggered,this,&Themes::forcedModeAddFolder);
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(&transferModel,&TransferModel::debugInformation,this,&Themes::debugInformation);
+ #endif
+
+ progressColorWrite=QApplication::palette().color(QPalette::Highlight);
+ progressColorRead=QApplication::palette().color(QPalette::AlternateBase);
+ progressColorRemaining=QApplication::palette().color(QPalette::Base);
+
+ ui->progressBar_all->setStyleSheet(QStringLiteral("QProgressBar{border:1px solid grey;text-align:center;background-color:%1;}QProgressBar::chunk{background-color:%2;}")
+ .arg(progressColorRemaining.name())
+ .arg(progressColorWrite.name())
+ );
+ ui->progressBar_file->setStyleSheet(QStringLiteral("QProgressBar{border:1px solid grey;text-align:center;background-color:%1;}QProgressBar::chunk{background-color:%2;}")
+ .arg(progressColorRemaining.name())
+ .arg(progressColorWrite.name())
+ );
+ show();
+ isInPause(false);
+}
+
+Themes::~Themes()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+}
+
+QWidget * Themes::getOptionsEngineWidget()
+{
+ return &optionEngineWidget;
+}
+
+void Themes::getOptionsEngineEnabled(const bool &isEnabled)
+{
+ Q_UNUSED(isEnabled);
+}
+
+/// \brief set if transfer list is exportable/importable
+void Themes::setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation)
+{
+ Q_UNUSED(transferListOperation);
+}
+
+void Themes::closeEvent(QCloseEvent *event)
+{
+ event->ignore();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->hide();
+ emit cancel();
+}
+
+void Themes::updateOverallInformation()
+{
+ ui->overall->setText(tr("Total: %1 of %2").arg(facilityEngine->sizeToString(currentSize)).arg(facilityEngine->sizeToString(totalSize)));
+ ui->labelNumberFile->setText(tr("%1 of %2").arg(currentFile).arg(totalFile));
+}
+
+void Themes::actionInProgess(const Ultracopier::EngineActionInProgress &action)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"start: "+QString::number(action));
+ this->action=action;
+ ui->pauseButton->setEnabled(action!=Ultracopier::Idle);
+ switch(action)
+ {
+ case Ultracopier::Copying:
+ case Ultracopier::CopyingAndListing:
+ ui->progressBar_all->setMaximum(65535);
+ ui->progressBar_all->setMinimum(0);
+ break;
+ case Ultracopier::Listing:
+ ui->progressBar_all->setMaximum(0);
+ ui->progressBar_all->setMinimum(0);
+ break;
+ case Ultracopier::Idle:
+ if(haveStarted)
+ emit cancel();
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Very wrong switch case!");
+ break;
+ }
+ switch(action)
+ {
+ case Ultracopier::Copying:
+ case Ultracopier::CopyingAndListing:
+ haveStarted=true;
+ ui->cancelButton->setText(facilityEngine->translateText("Quit"));
+ if(storeIsInPause)
+ ui->pauseButton->setText(facilityEngine->translateText("Start"));
+ else
+ ui->pauseButton->setText(facilityEngine->translateText("Pause"));
+ break;
+ case Ultracopier::Idle:
+ ui->cancelButton->setText(facilityEngine->translateText("Quit"));
+ break;
+ default:
+ break;
+ }
+}
+
+void Themes::newFolderListing(const QString &path)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(action==Ultracopier::Listing)
+ ui->from->setText(path);
+}
+
+void Themes::detectedSpeed(const quint64 &speed)//in byte per seconds
+{
+ speedString=facilityEngine->speedToString(speed);
+}
+
+/** \brief support speed limitation */
+void Themes::setSupportSpeedLimitation(const bool &supportSpeedLimitationBool)
+{
+ Q_UNUSED(supportSpeedLimitationBool);
+}
+
+void Themes::remainingTime(const int &remainingSeconds)
+{
+ if(remainingSeconds==-1)
+ ui->labelTimeRemaining->setText("<html><body>&#8734;</body></html>");
+ else
+ {
+ Ultracopier::TimeDecomposition time=facilityEngine->secondsToTimeDecomposition(remainingSeconds);
+ ui->labelTimeRemaining->setText(QString::number(time.hour)+":"+QString::number(time.minute)+":"+QString::number(time.second));
+ }
+}
+
+void Themes::newCollisionAction(const QString &action)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ Q_UNUSED(action);
+}
+
+void Themes::newErrorAction(const QString &action)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ Q_UNUSED(action);
+}
+
+void Themes::errorDetected()
+{
+}
+
+/// \brief new error
+void Themes::errorToRetry(const QString &source,const QString &destination,const QString &error)
+{
+ Q_UNUSED(source);
+ Q_UNUSED(destination);
+ Q_UNUSED(error);
+}
+
+//speed limitation
+bool Themes::setSpeedLimitation(const qint64 &speedLimitation)
+{
+ if(speedLimitation>0)
+ emit newSpeedLimitation(0);
+ return true;
+}
+
+//get information about the copy
+void Themes::setGeneralProgression(const quint64 &current,const quint64 &total)
+{
+ currentSize=current;
+ totalSize=total;
+ if(total>0)
+ {
+ int newIndicator=((double)current/total)*65535;
+ ui->progressBar_all->setValue(newIndicator);
+ }
+ else
+ ui->progressBar_all->setValue(0);
+}
+
+void Themes::setCollisionAction(const QList<QPair<QString,QString> > &list)
+{
+ Q_UNUSED(list);
+}
+
+void Themes::setErrorAction(const QList<QPair<QString,QString> > &list)
+{
+ Q_UNUSED(list);
+}
+
+void Themes::setCopyType(const Ultracopier::CopyType &type)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->type=type;
+ updateModeAndType();
+}
+
+void Themes::forceCopyMode(const Ultracopier::CopyMode &mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ modeIsForced=true;
+ this->mode=mode;
+ if(mode==Ultracopier::Copy)
+ this->setWindowTitle("Ultracopier - "+facilityEngine->translateText("Copy"));
+ else
+ this->setWindowTitle("Ultracopier - "+facilityEngine->translateText("Move"));
+ updateModeAndType();
+}
+
+void Themes::updateTitle()
+{
+ QString startString;
+ if(action==Ultracopier::Copying || action==Ultracopier::CopyingAndListing)
+ startString=tr("%1% done").arg(((double)currentSize/totalSize)*100);
+ else
+ startString="Ultracopier";
+ startString+=" - ";
+ if(mode==Ultracopier::Copy)
+ this->setWindowTitle(startString+facilityEngine->translateText("Copy")+" ("+speedString+")");
+ else
+ this->setWindowTitle(startString+facilityEngine->translateText("Move")+" ("+speedString+")");
+}
+
+void Themes::haveExternalOrder()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+// ui->moreButton->toggle();
+}
+
+void Themes::isInPause(const bool &isInPause)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"isInPause: "+QString::number(isInPause));
+ //resume in auto the pause
+ storeIsInPause=isInPause;
+ if(isInPause)
+ ui->pauseButton->setText(facilityEngine->translateText("Resume"));
+ else
+ ui->pauseButton->setText(facilityEngine->translateText("Pause"));
+}
+
+void Themes::updateCurrentFileInformation()
+{
+ TransferModel::currentTransfertItem transfertItem=transferModel.getCurrentTransfertItem();
+ if(transfertItem.haveItem)
+ {
+ ui->from->setText(transfertItem.from);
+ //commented because not displayed on this interface
+ //ui->to->setText(transfertItem.to);
+ //ui->current_file->setText(transfertItem.current_file);
+ if(transfertItem.progressBar_read!=-1)
+ {
+ ui->progressBar_file->setRange(0,65535);
+ if(transfertItem.progressBar_read!=transfertItem.progressBar_write)
+ {
+ float permilleread=round((float)transfertItem.progressBar_read/65535*1000)/1000;
+ float permillewrite=permilleread-0.001;
+ ui->progressBar_file->setStyleSheet(QStringLiteral("QProgressBar{border: 1px solid grey;text-align: center;background-color: qlineargradient(spread:pad, x1:%1, y1:0, x2:%2, y2:0, stop:0 %3, stop:1 %4);}QProgressBar::chunk{background-color:%5;}")
+ .arg(permilleread)
+ .arg(permillewrite)
+ .arg(progressColorRemaining.name())
+ .arg(progressColorRead.name())
+ .arg(progressColorWrite.name())
+ );
+ }
+ else
+ ui->progressBar_file->setStyleSheet(QStringLiteral("QProgressBar{border:1px solid grey;text-align:center;background-color:%1;}QProgressBar::chunk{background-color:%2;}")
+ .arg(progressColorRemaining.name())
+ .arg(progressColorWrite.name())
+ );
+ ui->progressBar_file->setValue(transfertItem.progressBar_write);
+ }
+ else
+ ui->progressBar_file->setRange(0,0);
+ }
+ else
+ {
+ ui->from->setText("");
+ //commented because not displayed on this interface
+ //ui->to->setText("");
+ //ui->current_file->setText("-");
+ if(haveStarted && transferModel.rowCount()==0)
+ ui->progressBar_file->setValue(65535);
+ else if(!haveStarted)
+ ui->progressBar_file->setValue(0);
+ }
+}
+
+
+void Themes::on_cancelButton_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->hide();
+ emit cancel();
+}
+
+
+void Themes::on_pauseButton_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(storeIsInPause)
+ emit resume();
+ else
+ emit pause();
+}
+
+void Themes::on_skipButton_clicked()
+{
+ TransferModel::currentTransfertItem transfertItem=transferModel.getCurrentTransfertItem();
+ if(transfertItem.haveItem)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("skip at running: %1").arg(transfertItem.id));
+ emit skip(transfertItem.id);
+ }
+ else
+ {
+ if(transferModel.rowCount()>1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("skip at idle: %1").arg(transferModel.firstId()));
+ emit skip(transferModel.firstId());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to skip the transfer, because no transfer running");
+ }
+}
+
+void Themes::updateModeAndType()
+{
+ menu.clear();
+ if(modeIsForced)
+ {
+ menu.addAction(ui->actionAddFile);
+ if(type==Ultracopier::FileAndFolder)
+ menu.addAction(ui->actionAddFolder);
+ }
+ else
+ {
+ menu.addAction(ui->actionAddFileToCopy);
+ menu.addAction(ui->actionAddFileToMove);
+ if(type==Ultracopier::FileAndFolder)
+ {
+ menu.addAction(ui->actionAddFolderToCopy);
+ menu.addAction(ui->actionAddFolderToMove);
+ }
+ }
+}
+
+void Themes::forcedModeAddFile()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFile(mode);
+}
+
+void Themes::forcedModeAddFolder()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFolder(mode);
+}
+
+void Themes::forcedModeAddFileToCopy()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFile(Ultracopier::Copy);
+}
+
+void Themes::forcedModeAddFolderToCopy()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFolder(Ultracopier::Copy);
+}
+
+void Themes::forcedModeAddFileToMove()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFile(Ultracopier::Move);
+}
+
+void Themes::forcedModeAddFolderToMove()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFolder(Ultracopier::Move);
+}
+
+//set the translate
+void Themes::newLanguageLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(modeIsForced)
+ forceCopyMode(mode);
+ ui->retranslateUi(this);
+ if(haveStarted)
+ updateCurrentFileInformation();
+ updateOverallInformation();
+}
+
+/*
+ Return[0]: totalFile
+ Return[1]: totalSize
+ Return[2]: currentFile
+ */
+void Themes::getActionOnList(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, returnActions.size(): "+QString::number(returnActions.size()));
+ QList<quint64> returnValue=transferModel.synchronizeItems(returnActions);
+ totalFile+=returnValue[0];
+ totalSize+=returnValue[1];
+ currentFile+=returnValue[2];
+ if(transferModel.rowCount()==0)
+ {
+ ui->skipButton->setEnabled(false);
+ ui->progressBar_all->setValue(65535);
+ ui->progressBar_file->setValue(65535);
+ currentSize=totalSize;
+ }
+ else
+ ui->skipButton->setEnabled(true);
+ updateOverallInformation();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferModel.rowCount(): "+QString::number(transferModel.rowCount()));
+}
+
+void Themes::setFileProgression(const QList<Ultracopier::ProgressionItem> &progressionList)
+{
+ QList<Ultracopier::ProgressionItem> progressionListBis=progressionList;
+ transferModel.setFileProgression(progressionListBis);
+ updateCurrentFileInformation();
+}
+
+Themes::currentTransfertItem Themes::getCurrentTransfertItem()
+{
+ currentTransfertItem returnItem;
+ returnItem.haveItem=InternalRunningOperation.size()>0;
+ if(returnItem.haveItem)
+ {
+ const ItemOfCopyListWithMoreInformations &itemTransfer=InternalRunningOperation.first();
+ returnItem.from=itemTransfer.generalData.sourceFullPath;
+ returnItem.to=itemTransfer.generalData.destinationFullPath;
+ returnItem.current_file=itemTransfer.generalData.destinationFileName+", "+facilityEngine->sizeToString(itemTransfer.generalData.size);
+ switch(itemTransfer.actionType)
+ {
+ case Ultracopier::CustomOperation:
+ if(!itemTransfer.custom_with_progression)
+ returnItem.progressBar_file=0;
+ else
+ {
+ if(itemTransfer.generalData.size>0)
+ returnItem.progressBar_file=((double)itemTransfer.currentProgression/itemTransfer.generalData.size)*65535;
+ else
+ returnItem.progressBar_file=0;
+ }
+ break;
+ case Ultracopier::Transfer:
+ if(itemTransfer.generalData.size>0)
+ returnItem.progressBar_file=((double)itemTransfer.currentProgression/itemTransfer.generalData.size)*65535;
+ else
+ returnItem.progressBar_file=0;
+ break;
+ case Ultracopier::PostOperation:
+ returnItem.progressBar_file=65535;
+ break;
+ default:
+ returnItem.progressBar_file=0;
+ }
+ }
+ return returnItem;
+}
diff --git a/plugins-alternative/Themes/Teracopy/interface.h b/plugins-alternative/Themes/Teracopy/interface.h
new file mode 100644
index 0000000..b2f6a70
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/interface.h
@@ -0,0 +1,176 @@
+/** \file interface.h
+\brief Define the interface test
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef INTERFACE_H
+#define INTERFACE_H
+
+#include <QObject>
+#include <QWidget>
+#include <QCloseEvent>
+#include <QMenu>
+#include <QColor>
+
+#include "../../../interface/PluginInterface_Themes.h"
+
+#include "ui_interface.h"
+#include "Environment.h"
+#include "TransferModel.h"
+
+namespace Ui {
+ class interfaceCopy;
+}
+
+/// \brief Define the interface
+class Themes : public PluginInterface_Themes
+{
+ Q_OBJECT
+private:
+ struct ItemOfCopyListWithMoreInformations
+ {
+ quint64 currentProgression;
+ Ultracopier::ItemOfCopyList generalData;
+ Ultracopier::ActionTypeCopyList actionType;
+ bool custom_with_progression;
+ };
+ struct currentTransfertItem
+ {
+ quint64 id;
+ bool haveItem;
+ QString from;
+ QString to;
+ QString current_file;
+ int progressBar_file;
+ };
+ Ui::interfaceCopy *ui;
+ quint64 currentFile;
+ quint64 totalFile;
+ quint64 currentSize;
+ quint64 totalSize;
+ void updateOverallInformation();
+ void updateCurrentFileInformation();
+ Ultracopier::EngineActionInProgress action;
+ void closeEvent(QCloseEvent *event);
+ QList<ItemOfCopyListWithMoreInformations> currentProgressList;
+ QString speedString;
+ bool storeIsInPause;
+ bool modeIsForced;
+ Ultracopier::CopyType type;
+ Ultracopier::CopyMode mode;
+ void updateModeAndType();
+ bool haveStarted;
+ QWidget optionEngineWidget;
+ void updateTitle();
+ QMenu menu;
+ FacilityInterface * facilityEngine;
+ int loop_size,loop_sub_size,indexAction,index;
+ int index_for_loop,sub_loop_size,sub_index_for_loop;
+ currentTransfertItem getCurrentTransfertItem();
+ QList<quint64> startId,stopId;///< To show what is started, what is stopped
+ QList<ItemOfCopyListWithMoreInformations> InternalRunningOperation;///< to have progression and stat
+ /// \brief the custom transfer model
+ TransferModel transferModel;
+ QColor progressColorWrite;
+ QColor progressColorRead;
+ QColor progressColorRemaining;
+public:
+ //send information about the copy
+ /// \brief to set the action in progress
+ void actionInProgess(const Ultracopier::EngineActionInProgress &);
+ /// \brief new transfer have started
+ void newTransferStart(const Ultracopier::ItemOfCopyList &item);
+ /** \brief one transfer have been stopped
+ * is stopped, example: because error have occurred, and try later, don't remove the item! */
+ void newTransferStop(const quint64 &id);
+ /// \brief the new folder is listing
+ void newFolderListing(const QString &path);
+ /** \brief show the detected speed
+ * in byte per seconds */
+ void detectedSpeed(const quint64 &speed);
+ /** \brief support speed limitation */
+ void setSupportSpeedLimitation(const bool &supportSpeedLimitationBool);
+ /** \brief show the remaining time
+ * time in seconds */
+ void remainingTime(const int &remainingSeconds);
+ /// \brief set the current collision action
+ void newCollisionAction(const QString &action);
+ /// \brief set the current error action
+ void newErrorAction(const QString &action);
+ /// \brief set one error is detected
+ void errorDetected();
+ /// \brief new error
+ void errorToRetry(const QString &source,const QString &destination,const QString &error);
+ //speed limitation
+ /** \brief the max speed used
+ * in byte per seconds, -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const qint64 &speedLimitation);
+ Themes(FacilityInterface * facilityEngine);
+ ~Themes();
+ //get information about the copy
+ /// \brief show the general progression
+ void setGeneralProgression(const quint64 &current,const quint64 &total);
+ /// \brief show the file progression
+ void setFileProgression(const QList<Ultracopier::ProgressionItem> &progressionList);
+ /// \brief set collision action
+ void setCollisionAction(const QList<QPair<QString,QString> > &);
+ /// \brief set error action
+ void setErrorAction(const QList<QPair<QString,QString> > &);
+ /// \brief set the copyType -> file or folder
+ void setCopyType(const Ultracopier::CopyType &);
+ /// \brief set the copyMove -> copy or move, to force in copy or move, else support both
+ void forceCopyMode(const Ultracopier::CopyMode &);
+ /// \brief set if transfer list is exportable/importable
+ void setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation);
+ /** \brief set if the order is external (like file manager copy)
+ * to notify the interface, which can hide add folder/filer button */
+ void haveExternalOrder();
+ /// \brief set if is in pause
+ void isInPause(const bool &);
+ /// \brief get the widget for the copy engine
+ QWidget * getOptionsEngineWidget();
+ /// \brief to set if the copy engine is found
+ void getOptionsEngineEnabled(const bool &isEnabled);
+private slots:
+ void on_cancelButton_clicked();
+ void on_pauseButton_clicked();
+ void on_skipButton_clicked();
+ void forcedModeAddFile();
+ void forcedModeAddFolder();
+ void forcedModeAddFileToCopy();
+ void forcedModeAddFolderToCopy();
+ void forcedModeAddFileToMove();
+ void forcedModeAddFolderToMove();
+signals:
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const QString &fonction,const QString &text,const QString &file,const int &ligne);
+ #endif
+ //set the transfer list
+ /*void removeItems(QList<int> ids);
+ void moveItemsOnTop(QList<int> ids);
+ void moveItemsUp(QList<int> ids);
+ void moveItemsDown(QList<int> ids);
+ void moveItemsOnBottom(QList<int> ids);
+ void exportTransferList();
+ void importTransferList();
+ //user ask ask to add folder (add it with interface ask source/destination)
+ void userAddFolder(Ultracopier::CopyMode);
+ void userAddFile(Ultracopier::CopyMode);
+ void urlDropped(QList<QUrl> urls);
+ //action on the copy
+ void pause();
+ void resume();
+ void skip(quint64 id);
+ void cancel();
+ //edit the action
+ void sendCollisionAction(QString action);
+ void sendErrorAction(QString action);
+ void newSpeedLimitation(qint64);*/
+public slots:
+ //set the translate
+ void newLanguageLoaded();
+ void getActionOnList(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions);
+};
+
+#endif // INTERFACE_H
diff --git a/plugins-alternative/Themes/Teracopy/interface.pro b/plugins-alternative/Themes/Teracopy/interface.pro
new file mode 100644
index 0000000..5049e19
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/interface.pro
@@ -0,0 +1,50 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+QT += widgets
+TEMPLATE = lib
+CONFIG += plugin
+HEADERS = interface.h \
+ StructEnumDefinition.h \
+ factory.h \
+ DebugEngineMacro.h \
+ Environment.h \
+ Variable.h \
+ ../../../interface/PluginInterface_Themes.h \
+ TransferModel.h
+SOURCES = interface.cpp \
+ factory.cpp \
+ TransferModel.cpp
+TARGET = $$qtLibraryTarget(interface)
+TRANSLATIONS += Languages/ar/translation.ts \
+ Languages/de/translation.ts \
+ Languages/el/translation.ts \
+ Languages/en/translation.ts \
+ Languages/es/translation.ts \
+ Languages/fr/translation.ts \
+ Languages/hi/translation.ts \
+ Languages/hu/translation.ts \
+ Languages/id/translation.ts \
+ Languages/it/translation.ts \
+ Languages/ja/translation.ts \
+ Languages/ko/translation.ts \
+ Languages/nl/translation.ts \
+ Languages/no/translation.ts \
+ Languages/pl/translation.ts \
+ Languages/ru/translation.ts \
+ Languages/th/translation.ts \
+ Languages/tr/translation.ts \
+ Languages/zh/translation.ts
+
+RESOURCES += resources.qrc
+
+FORMS += \
+ interface.ui
+
+win32 {
+ RESOURCES += resources_windows.qrc
+}
+!win32 {
+ RESOURCES += resources_unix.qrc
+}
diff --git a/plugins-alternative/Themes/Teracopy/interface.ui b/plugins-alternative/Themes/Teracopy/interface.ui
new file mode 100644
index 0000000..a5274b3
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/interface.ui
@@ -0,0 +1,394 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>interfaceCopy</class>
+ <widget class="QWidget" name="interfaceCopy">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>476</width>
+ <height>364</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>430</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">94% done (42BK/s)</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/Themes/Teracopy/resources/main.png</normaloff>:/Themes/Teracopy/resources/main.png</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="from">
+ <property name="text">
+ <string notr="true">-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_5">
+ <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="QLabel" name="labelNumberFile"/>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar_file">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>65535</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QLabel" name="overall">
+ <property name="text">
+ <string notr="true">Total: -</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelTimeRemaining">
+ <property name="text">
+ <string notr="true">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar_all">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>65535</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="moreButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;More</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolButtonMenu">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pauseButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;Pause</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="skipButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0057ae;&quot;&gt;Support Ultracopier&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTreeView" name="TransferList">
+ <property name="selectionMode">
+ <enum>QAbstractItemView::NoSelection</enum>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ <action name="actionAddFile">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Teracopy/resources/add.png</normaloff>:/Themes/Teracopy/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add file</string>
+ </property>
+ </action>
+ <action name="actionAddFolder">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Teracopy/resources/add.png</normaloff>:/Themes/Teracopy/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add folder</string>
+ </property>
+ </action>
+ <action name="actionAddFileToMove">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Teracopy/resources/add.png</normaloff>:/Themes/Teracopy/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Move file(s)</string>
+ </property>
+ </action>
+ <action name="actionAddFolderToMove">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Teracopy/resources/add.png</normaloff>:/Themes/Teracopy/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Move folder</string>
+ </property>
+ </action>
+ <action name="actionAddFileToCopy">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Teracopy/resources/add.png</normaloff>:/Themes/Teracopy/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy file(s)</string>
+ </property>
+ </action>
+ <action name="actionAddFolderToCopy">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Teracopy/resources/add.png</normaloff>:/Themes/Teracopy/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy folder</string>
+ </property>
+ </action>
+ </widget>
+ <resources>
+ <include location="resources.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>moreButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>label_2</receiver>
+ <slot>setVisible(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>72</x>
+ <y>106</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>353</x>
+ <y>144</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>interfaceCopy</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>465</x>
+ <y>114</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>475</x>
+ <y>112</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins-alternative/Themes/Teracopy/plugin.json b/plugins-alternative/Themes/Teracopy/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins-alternative/Themes/Teracopy/resources.qrc b/plugins-alternative/Themes/Teracopy/resources.qrc
new file mode 100644
index 0000000..39105a8
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources.qrc
@@ -0,0 +1,12 @@
+<RCC>
+ <qresource prefix="/Themes/Teracopy">
+ <file>resources/SystemTrayIcon/add.png</file>
+ <file>resources/SystemTrayIcon/exit.png</file>
+ <file>resources/SystemTrayIcon/informations.png</file>
+ <file>resources/SystemTrayIcon/options.png</file>
+ <file>resources/checkbox.png</file>
+ <file>resources/main.png</file>
+ <file>resources/player_play.png</file>
+ <file>resources/player_pause.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/add.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/add.png
new file mode 100644
index 0000000..7932127
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/add.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/exit.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/exit.png
new file mode 100644
index 0000000..ae3c4e8
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/exit.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/informations.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/informations.png
new file mode 100644
index 0000000..5b7b255
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/informations.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/options.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/options.png
new file mode 100644
index 0000000..23ec531
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/options.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Caught_Unix.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Caught_Unix.png
new file mode 100644
index 0000000..6f5d1cf
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Caught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Caught_Windows.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Caught_Windows.png
new file mode 100644
index 0000000..5464856
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Caught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
new file mode 100644
index 0000000..3961215
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
new file mode 100644
index 0000000..45d6315
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Uncaught_Unix.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Uncaught_Unix.png
new file mode 100644
index 0000000..ac4299a
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Uncaught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Uncaught_Windows.png b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Uncaught_Windows.png
new file mode 100644
index 0000000..6e6bae7
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/SystemTrayIcon/systray_Uncaught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/checkbox.png b/plugins-alternative/Themes/Teracopy/resources/checkbox.png
new file mode 100644
index 0000000..f7f4388
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/checkbox.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/main.png b/plugins-alternative/Themes/Teracopy/resources/main.png
new file mode 100644
index 0000000..5464856
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/main.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/player_pause.png b/plugins-alternative/Themes/Teracopy/resources/player_pause.png
new file mode 100644
index 0000000..68ee21f
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/player_pause.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources/player_play.png b/plugins-alternative/Themes/Teracopy/resources/player_play.png
new file mode 100644
index 0000000..a1c5b83
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources/player_play.png
Binary files differ
diff --git a/plugins-alternative/Themes/Teracopy/resources_unix.qrc b/plugins-alternative/Themes/Teracopy/resources_unix.qrc
new file mode 100644
index 0000000..46e3020
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources_unix.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Teracopy">
+ <file>resources/SystemTrayIcon/systray_Caught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Unix.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins-alternative/Themes/Teracopy/resources_windows.qrc b/plugins-alternative/Themes/Teracopy/resources_windows.qrc
new file mode 100644
index 0000000..165123a
--- /dev/null
+++ b/plugins-alternative/Themes/Teracopy/resources_windows.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Teracopy">
+ <file>resources/SystemTrayIcon/systray_Caught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Windows.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins-alternative/Themes/Windows/DebugEngineMacro.h b/plugins-alternative/Themes/Windows/DebugEngineMacro.h
new file mode 100644
index 0000000..4582010
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins-alternative/Themes/Windows/Environment.h b/plugins-alternative/Themes/Windows/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins-alternative/Themes/Windows/Languages/ar/translation.ts b/plugins-alternative/Themes/Windows/Languages/ar/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/ar/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/de/translation.ts b/plugins-alternative/Themes/Windows/Languages/de/translation.ts
new file mode 100644
index 0000000..7657f03
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/de/translation.ts
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation>Verbleibende Zeit unbekannt</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Übertrage %n Element (%2)</numerusform>
+ <numerusform>Übertrage %n Elemente (%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Kopiere %n Element (%2)</numerusform>
+ <numerusform>Kopiere %n Elemente (%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Verschiebe %n Element (%2)</numerusform>
+ <numerusform>Verschiebe %n Elemente (%2)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation>von &lt;b&gt;%1&lt;/b&gt; (%2) bis &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation>Warten...</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation>Name:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation>Von:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation>Nach:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation>verbleibende Zeit:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation>verbleibende Elemente:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation>Geschwindigkeit:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation>Mehr Informationen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation>Datei hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation>Ordner hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation>Datei (en) verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation>Ordner verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation>Datei (en) kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation>Ordner kopieren</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/el/translation.ts b/plugins-alternative/Themes/Windows/Languages/el/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/el/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/en/translation.ts b/plugins-alternative/Themes/Windows/Languages/en/translation.ts
new file mode 100644
index 0000000..27cfd09
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/en/translation.ts
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Transferring %n item (%2)</numerusform>
+ <numerusform>Transferring %n items (%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Copying %n item (%2)</numerusform>
+ <numerusform>Copying %n items (%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Moving %n item (%2)</numerusform>
+ <numerusform>Moving %n items (%2)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/es/translation.ts b/plugins-alternative/Themes/Windows/Languages/es/translation.ts
new file mode 100644
index 0000000..cc4de8a
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/es/translation.ts
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished">desde &lt;b&gt;%1&lt;/b&gt; (%2) hasta &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished">En espera</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation>Nombre:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation>Desde:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation>Hasta:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation>Tiempo restante:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation>Items restantes:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation>Velocidad:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation>Más información</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation>Añadir archivo</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation>Añadir carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation>Mover archivo(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation>Mueva la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation>Copia el archivo(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation>Copia la carpeta</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/fr/translation.ts b/plugins-alternative/Themes/Windows/Languages/fr/translation.ts
new file mode 100644
index 0000000..7f99e83
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/fr/translation.ts
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation>Temps restant inconnu</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Transfert de %n élément (%2)</numerusform>
+ <numerusform>Transfert de %n éléments (%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Copie de %n élément (%2)</numerusform>
+ <numerusform>Copie de %n éléments (%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Déplacement de %n élément (%2)</numerusform>
+ <numerusform>Déplacement de %n éléments (%2)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation>depuis &lt;b&gt;%1&lt;/b&gt; (%2) vers &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation>En attente</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation>Déplacer des fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation>Déplacer un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation>Copier des fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation>Copier un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation>Ajouter un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation>Nom:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation>Depuis:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation>Vers:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation>Temps restant:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation>Éléments restants:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation>Vitesse:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation>Plus d&apos;information</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation>Ajout de fichier</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/hi/translation.ts b/plugins-alternative/Themes/Windows/Languages/hi/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/hi/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/hu/translation.ts b/plugins-alternative/Themes/Windows/Languages/hu/translation.ts
new file mode 100644
index 0000000..ef4bf6d
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/hu/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="hu">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation>Ismeretlen hátralévő idő</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation>
+ <numerusform>%n elem áthelyezése(%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation>
+ <numerusform>%n elem átmásolása(%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation>
+ <numerusform>%n elem mozgatása(%2)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation>&lt;b&gt;%1&lt;/b&gt; (%2) helyről-&gt; &lt;b&gt;%3&lt;/b&gt; (%4) helyre&lt;br /&gt;%5</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation>Várakozik</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation>Név:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation>Forrás:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation>Cél:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation>Hátralévő idő:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation>Hátralévő elemek:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation>Sebesség:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation>Több információ</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation>Mégse</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation>Fájl hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation>Mappa hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation>Fájl(ok) mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation>Mappa mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation>Fájl(ok) másolása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation>Mappa másolása</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/id/translation.ts b/plugins-alternative/Themes/Windows/Languages/id/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/id/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/it/translation.ts b/plugins-alternative/Themes/Windows/Languages/it/translation.ts
new file mode 100644
index 0000000..c3d5a73
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/it/translation.ts
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="it" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation>Tempo rediduo indeterminato</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Trasferimento di %n elemento (%2)</numerusform>
+ <numerusform>Trasferimento di %n elementi (%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Copia di %n elemento (%2)</numerusform>
+ <numerusform>Copia di %n elementi (%2)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation>
+ <numerusform>Spostamento di %n elemento (%2)</numerusform>
+ <numerusform>Spostamento di %n elementi (%2)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translatorcomment>Per esempio: da &lt;b&gt;Cartella di origine&lt;/b&gt; (e: precedente origine) to &lt;b&gt;Cartella di destinazione&lt;/b&gt; (d: destinazione desktop)&lt;br /&gt;Circa 5 ore rimanenti</translatorcomment>
+ <translation>da &lt;b&gt;%1&lt;/b&gt; (%2) a &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation>In attesa</translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation>Nome:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation>Da:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation>A:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation>Tempo residuo:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation>Elementi rimanenti:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation>Velocità:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation>Maggiori informazioni</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation>Aggiungi file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation>Aggiungi cartella</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation>Sposta file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation>Sposta la cartella</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation>Copia file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation>Copia la cartella</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/ja/translation.ts b/plugins-alternative/Themes/Windows/Languages/ja/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/ja/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/ko/translation.ts b/plugins-alternative/Themes/Windows/Languages/ko/translation.ts
new file mode 100644
index 0000000..4d682a3
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/ko/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ko_KR">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="+204"/>
+ <location line="+188"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location line="-55"/>
+ <location line="+2"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+7"/>
+ <location line="+2"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+5"/>
+ <location line="+2"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="+48"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="+176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+65"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+40"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Add file</source>
+ <translation type="unfinished">파일 추가</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Add folder</source>
+ <translation type="unfinished">폴더 추가</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished">파일 이동</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move folder</source>
+ <translation type="unfinished">폴더 이동</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished">파일 복사</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy folder</source>
+ <translation type="unfinished">폴더 복사</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/nl/translation.ts b/plugins-alternative/Themes/Windows/Languages/nl/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/nl/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/no/translation.ts b/plugins-alternative/Themes/Windows/Languages/no/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/no/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/pl/translation.ts b/plugins-alternative/Themes/Windows/Languages/pl/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/pl/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/ru/translation.ts b/plugins-alternative/Themes/Windows/Languages/ru/translation.ts
new file mode 100644
index 0000000..02e9260
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/ru/translation.ts
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation>Добавить файл</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation>Добавить папку</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation>Перемещение файла (ов)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation>Перемещение папки</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation>Копировать файл (ы)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation>Копировать папку</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/th/translation.ts b/plugins-alternative/Themes/Windows/Languages/th/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/th/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/tr/translation.ts b/plugins-alternative/Themes/Windows/Languages/tr/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/tr/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/Languages/zh/translation.ts b/plugins-alternative/Themes/Windows/Languages/zh/translation.ts
new file mode 100644
index 0000000..fe6d20c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Languages/zh/translation.ts
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="204"/>
+ <location filename="../../interface.cpp" line="392"/>
+ <source>Unknown remaining time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="337"/>
+ <location filename="../../interface.cpp" line="339"/>
+ <source>Transferring %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="346"/>
+ <location filename="../../interface.cpp" line="348"/>
+ <source>Copying %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../interface.cpp" line="353"/>
+ <location filename="../../interface.cpp" line="355"/>
+ <source>Moving %n item(s) (%2)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;%5</source>
+ <extracomment>Sample: from &lt;b&gt;sources&lt;/b&gt; (e:<byte value="xc"/>oldersource) to &lt;b&gt;destination&lt;/b&gt; (d:desktopdestination)&lt;br /&gt;About 5 Hours remaining</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="412"/>
+ <source>In waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interface</name>
+ <message>
+ <location filename="../../interface.ui" line="176"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="186"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="196"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="206"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="216"/>
+ <source>Items remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>Speed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="291"/>
+ <source>More information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="331"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="345"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="354"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="363"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="372"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="381"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="390"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/Themes/Windows/StructEnumDefinition.h b/plugins-alternative/Themes/Windows/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins-alternative/Themes/Windows/TransferModel.cpp b/plugins-alternative/Themes/Windows/TransferModel.cpp
new file mode 100644
index 0000000..7743266
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/TransferModel.cpp
@@ -0,0 +1,286 @@
+#include "TransferModel.h"
+
+#define COLUMN_COUNT 3
+
+// Model
+
+TransferModel::TransferModel()
+{
+ iconStart=QIcon(":/Themes/Windows/resources/player_play.png");
+ iconPause=QIcon(":/Themes/Windows/resources/player_pause.png");
+ iconStop=QIcon(":/Themes/Windows/resources/checkbox.png");
+ currentIndexSearch=0;
+ currentFile = 0;
+ totalFile = 0;
+ currentSize = 0;
+ totalSize = 0;
+ haveSearchItem=false;
+}
+
+int TransferModel::columnCount( const QModelIndex& parent ) const
+{
+ return parent == QModelIndex() ? COLUMN_COUNT : 0;
+}
+
+QVariant TransferModel::data( const QModelIndex& index, int role ) const
+{
+ Q_UNUSED(role);
+ Q_UNUSED(index);
+ return QVariant();
+}
+
+int TransferModel::rowCount( const QModelIndex& parent ) const
+{
+ Q_UNUSED(parent);
+ return 0;
+}
+
+QVariant TransferModel::headerData( int section, Qt::Orientation orientation, int role ) const
+{
+ if ( role == Qt::DisplayRole && orientation == Qt::Horizontal && section >= 0 && section < COLUMN_COUNT ) {
+ switch ( section ) {
+ case 0:
+ return facilityEngine->translateText("Source");
+ case 1:
+ return facilityEngine->translateText("Size");
+ case 2:
+ return facilityEngine->translateText("Destination");
+ }
+ }
+
+ return QAbstractTableModel::headerData( section, orientation, role );
+}
+
+bool TransferModel::setData( const QModelIndex& index, const QVariant& value, int role )
+{
+ Q_UNUSED(index);
+ Q_UNUSED(value);
+ Q_UNUSED(role);
+ return true;
+}
+
+/*
+ Return[0]: totalFile
+ Return[1]: totalSize
+ Return[2]: currentFile
+ */
+QList<quint64> TransferModel::synchronizeItems(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions)
+{
+ loop_size=returnActions.size();
+ index_for_loop=0;
+ emit layoutAboutToBeChanged();
+ while(index_for_loop<loop_size)
+ {
+ const Ultracopier::ReturnActionOnCopyList& action=returnActions.at(index_for_loop);
+ switch(action.type)
+ {
+ case Ultracopier::AddingItem:
+ {
+ this->totalFile++;
+ this->totalSize+=action.addAction.size;
+ }
+ break;
+ case Ultracopier::RemoveItem:
+ internalRunningOperation.remove(action.addAction.id);
+ startId.remove(action.addAction.id);
+ stopId.remove(action.addAction.id);
+ this->currentFile++;
+ break;
+ case Ultracopier::PreOperation:
+ {
+ ItemOfCopyListWithMoreInformations tempItem;
+ tempItem.currentProgression=0;
+ tempItem.generalData=action.addAction;
+ tempItem.generalData.destinationFullPath.remove(tempItem.generalData.destinationFullPath.size()-tempItem.generalData.destinationFileName.size(),tempItem.generalData.destinationFileName.size());
+ tempItem.generalData.sourceFullPath.remove(tempItem.generalData.sourceFullPath.size()-tempItem.generalData.sourceFileName.size(),tempItem.generalData.sourceFileName.size());
+ tempItem.actionType=action.type;
+ internalRunningOperation[action.addAction.id]=tempItem;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("set for file %1: actionType: PreOperation").arg(action.addAction.id));
+ }
+ break;
+ case Ultracopier::Transfer:
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("found entry for file %1: actionType: Transfer").arg(action.addAction.id));
+ if(!startId.contains(action.addAction.id))
+ startId << action.addAction.id;
+ stopId.remove(action.addAction.id);
+ if(internalRunningOperation.contains(action.addAction.id))
+ internalRunningOperation[action.addAction.id].actionType=action.type;
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unable to found entry for file %1: actionType: Transfer").arg(action.addAction.id));
+ }
+ break;
+ case Ultracopier::PostOperation:
+ {
+ if(!stopId.contains(action.addAction.id))
+ stopId << action.addAction.id;
+ startId.remove(action.addAction.id);
+ }
+ break;
+ case Ultracopier::CustomOperation:
+ {
+ bool custom_with_progression=(action.addAction.size==1);
+ //without progression
+ if(custom_with_progression)
+ {
+ if(startId.remove(action.addAction.id))
+ if(!stopId.contains(action.addAction.id))
+ stopId << action.addAction.id;
+ }
+ //with progression
+ else
+ {
+ stopId.remove(action.addAction.id);
+ if(!startId.contains(action.addAction.id))
+ startId << action.addAction.id;
+ }
+ if(internalRunningOperation.contains(action.addAction.id))
+ {
+ ItemOfCopyListWithMoreInformations &item=internalRunningOperation[action.addAction.id];
+ item.actionType=action.type;
+ item.custom_with_progression=custom_with_progression;
+ item.currentProgression=0;
+ }
+ }
+ break;
+ default:
+ //unknow code, ignore it
+ break;
+ }
+ index_for_loop++;
+ }
+ emit layoutChanged();
+ return QList<quint64>() << totalFile << totalSize << currentFile;
+}
+
+void TransferModel::setFacilityEngine(FacilityInterface * facilityEngine)
+{
+ this->facilityEngine=facilityEngine;
+}
+
+void TransferModel::setFileProgression(QList<Ultracopier::ProgressionItem> &progressionList)
+{
+ loop_size=progressionList.size();
+ index_for_loop=0;
+ while(index_for_loop<loop_size)
+ {
+ if(internalRunningOperation.contains(progressionList.at(index_for_loop).id))
+ {
+ internalRunningOperation[progressionList.at(index_for_loop).id].generalData.size=progressionList.at(index_for_loop).total;
+ internalRunningOperation[progressionList.at(index_for_loop).id].currentProgression=(progressionList.at(index_for_loop).currentRead+progressionList.at(index_for_loop).currentWrite)/2;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ progressionList.removeAt(index_for_loop);
+ index_for_loop--;
+ loop_size--;
+ #endif
+ }
+ index_for_loop++;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(progressionList.size()>0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"progression remaning items");
+ #endif
+}
+
+TransferModel::currentTransfertItem TransferModel::getCurrentTransfertItem()
+{
+ currentTransfertItem returnItem;
+ returnItem.haveItem=startId.size()>0;
+ if(returnItem.haveItem)
+ {
+ if(!internalRunningOperation.contains(*startId.constBegin()))
+ {
+ returnItem.haveItem=false;
+ return returnItem;
+ }
+ const ItemOfCopyListWithMoreInformations &itemTransfer=internalRunningOperation[*startId.constBegin()];
+ returnItem.from=itemTransfer.generalData.sourceFullPath;
+ returnItem.to=itemTransfer.generalData.destinationFullPath;
+ returnItem.current_file=itemTransfer.generalData.destinationFileName;
+ returnItem.size=facilityEngine->sizeToString(itemTransfer.generalData.size);
+ switch(itemTransfer.actionType)
+ {
+ case Ultracopier::CustomOperation:
+ if(!itemTransfer.custom_with_progression)
+ returnItem.progressBar_file=-1;
+ else
+ {
+ if(itemTransfer.generalData.size>0)
+ returnItem.progressBar_file=((double)itemTransfer.currentProgression/itemTransfer.generalData.size)*65535;
+ else
+ returnItem.progressBar_file=-1;
+ }
+ break;
+ case Ultracopier::Transfer:
+ if(itemTransfer.generalData.size>0)
+ returnItem.progressBar_file=((double)itemTransfer.currentProgression/itemTransfer.generalData.size)*65535;
+ else
+ returnItem.progressBar_file=0;
+ break;
+ //should never pass here
+ case Ultracopier::PostOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ returnItem.progressBar_file=65535;
+ break;
+ //should never pass here
+ case Ultracopier::PreOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ returnItem.progressBar_file=0;
+ break;
+ default:
+ returnItem.progressBar_file=0;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unknow action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ break;
+ }
+ }
+ else
+ {
+ if(!internalRunningOperation.contains(*stopId.constBegin()))
+ {
+ returnItem.haveItem=false;
+ return returnItem;
+ }
+ else
+ returnItem.haveItem=true;
+ const ItemOfCopyListWithMoreInformations &itemTransfer=internalRunningOperation[*stopId.constBegin()];
+ returnItem.from=itemTransfer.generalData.sourceFullPath;
+ returnItem.to=itemTransfer.generalData.destinationFullPath;
+ returnItem.current_file=itemTransfer.generalData.destinationFileName;
+ returnItem.size=facilityEngine->sizeToString(itemTransfer.generalData.size);
+ switch(itemTransfer.actionType)
+ {
+ case Ultracopier::CustomOperation:
+ if(!itemTransfer.custom_with_progression)
+ returnItem.progressBar_file=-1;
+ else
+ {
+ if(itemTransfer.generalData.size>0)
+ returnItem.progressBar_file=((double)itemTransfer.currentProgression/itemTransfer.generalData.size)*65535;
+ else
+ returnItem.progressBar_file=-1;
+ }
+ break;
+ case Ultracopier::Transfer:
+ if(itemTransfer.generalData.size>0)
+ returnItem.progressBar_file=((double)itemTransfer.currentProgression/itemTransfer.generalData.size)*65535;
+ else
+ returnItem.progressBar_file=0;
+ break;
+ //should never pass here
+ case Ultracopier::PostOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ returnItem.progressBar_file=65535;
+ break;
+ //should never pass here
+ case Ultracopier::PreOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ returnItem.progressBar_file=0;
+ break;
+ default:
+ returnItem.progressBar_file=65535;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unknow action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType));
+ break;
+ }
+ }
+ return returnItem;
+}
diff --git a/plugins-alternative/Themes/Windows/TransferModel.h b/plugins-alternative/Themes/Windows/TransferModel.h
new file mode 100644
index 0000000..c2d89aa
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/TransferModel.h
@@ -0,0 +1,90 @@
+#ifndef TRANSFERMODEL_H
+#define TRANSFERMODEL_H
+
+#include <QAbstractTableModel>
+#include <QModelIndex>
+#include <QVariant>
+#include <QList>
+#include <QSet>
+#include <QIcon>
+#include <QString>
+
+#include "StructEnumDefinition.h"
+#include "Environment.h"
+
+#include "../../../interface/FacilityInterface.h"
+
+/// \brief model to store the transfer list
+class TransferModel : public QAbstractTableModel
+{
+ Q_OBJECT
+public:
+ /// \brief the transfer item displayed
+ struct transfertItem
+ {
+ quint64 id;
+ QString source;
+ QString size;
+ QString destination;
+ };
+ /// \brief the transfer item with progression
+ struct ItemOfCopyListWithMoreInformations
+ {
+ quint64 currentProgression;
+ Ultracopier::ItemOfCopyList generalData;
+ Ultracopier::ActionTypeCopyList actionType;
+ bool custom_with_progression;
+ };
+ /// \brief returned first transfer item
+ struct currentTransfertItem
+ {
+ quint64 id;
+ bool haveItem;
+ QString from;
+ QString to;
+ QString current_file;
+ QString size;
+ int progressBar_file;
+ };
+
+ TransferModel();
+
+ virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
+ virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+ virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
+
+ QList<quint64> synchronizeItems(const QList<Ultracopier::ReturnActionOnCopyList>& returnActions);
+ void setFacilityEngine(FacilityInterface * facilityEngine);
+
+ void setFileProgression(QList<Ultracopier::ProgressionItem> &progressionList);
+
+ currentTransfertItem getCurrentTransfertItem();
+
+ quint64 currentFile;
+ quint64 totalFile;
+ quint64 currentSize;
+ quint64 totalSize;
+protected:
+ QSet<quint64> startId,stopId;///< To show what is started, what is stopped
+ QHash<quint64,ItemOfCopyListWithMoreInformations> internalRunningOperation;///< to have progression and stat
+ QIcon iconStart,iconPause,iconStop;
+private:
+ int loop_size,index_for_loop;
+ int sub_loop_size,sub_index_for_loop;
+ int row,column;
+ FacilityInterface * facilityEngine;
+ QString search_text;
+ /// \brief index from start the search, decresed by remove before it
+ int currentIndexSearch;
+ bool haveSearchItem;
+ quint64 searchId;
+signals:
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const QString &fonction,const QString &text,const QString &file,const int &ligne);
+ #endif
+};
+
+#endif // TRANSFERMODEL_H
diff --git a/plugins-alternative/Themes/Windows/Variable.h b/plugins-alternative/Themes/Windows/Variable.h
new file mode 100644
index 0000000..963d0c8
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/Variable.h
@@ -0,0 +1,15 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins-alternative/Themes/Windows/documentation.dox b/plugins-alternative/Themes/Windows/documentation.dox
new file mode 100644
index 0000000..6a5ad0e
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/documentation.dox
@@ -0,0 +1,28 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage Windows
+
+ \section mainpage_overview Overview
+
+ It's interface to have interface like windows for Ultracopier.\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>. Is part of Ultracopier project as alternative plugin.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section license GPL Version 3
+ The code source is under GPL3.
+
+*/
diff --git a/plugins-alternative/Themes/Windows/factory.cpp b/plugins-alternative/Themes/Windows/factory.cpp
new file mode 100644
index 0000000..dbce51a
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/factory.cpp
@@ -0,0 +1,74 @@
+/** \file factory.cpp
+\brief Define the factory core
+\author alpha_one_x86
+*/
+
+#include "factory.h"
+
+QRegularExpression ThemesFactory::slashEnd;
+QRegularExpression ThemesFactory::isolateName;
+
+ThemesFactory::ThemesFactory()
+{
+ slashEnd=QRegularExpression("/$");
+ isolateName=QRegularExpression("^.*/([^/]+)$");
+}
+
+PluginInterface_Themes * ThemesFactory::getInstance()
+{
+ Themes * newInterface=new Themes(facilityEngine);
+ connect(this,&ThemesFactory::reloadLanguage,newInterface,&Themes::newLanguageLoaded);
+ return newInterface;
+}
+
+void ThemesFactory::setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,FacilityInterface * facilityEngine,const bool &portableVersion)
+{
+ Q_UNUSED(options)
+ Q_UNUSED(writePath)
+ Q_UNUSED(pluginPath)
+ this->facilityEngine=facilityEngine;
+ Q_UNUSED(portableVersion)
+}
+
+QWidget * ThemesFactory::options()
+{
+ return NULL;
+}
+
+QIcon ThemesFactory::getIcon(const QString &fileName) const
+{
+ if(fileName=="SystemTrayIcon/exit.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("application-exit");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/add.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("list-add");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/informations.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("help-about");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ if(fileName=="SystemTrayIcon/options.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("applications-system");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ return QIcon(":/Themes/Windows/resources/"+fileName);
+}
+
+void ThemesFactory::resetOptions()
+{
+}
+
+void ThemesFactory::newLanguageLoaded()
+{
+ emit reloadLanguage();
+}
diff --git a/plugins-alternative/Themes/Windows/factory.h b/plugins-alternative/Themes/Windows/factory.h
new file mode 100644
index 0000000..32ea9f1
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/factory.h
@@ -0,0 +1,45 @@
+/** \file factory.h
+\brief Define the factory, to create instance of the interface
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef FACTORY_H
+#define FACTORY_H
+
+#include <QObject>
+#include <QWidget>
+#include <QIcon>
+#include <QRegularExpression>
+
+#include "interface.h"
+#include "../../../interface/PluginInterface_Themes.h"
+
+/// \brief Define the factory, to create instance of the interface
+class ThemesFactory : public PluginInterface_ThemesFactory
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.ThemesFactory/1.0.1.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_ThemesFactory)
+ public:
+ ThemesFactory();
+ /// \brief to return the instance of the copy engine
+ PluginInterface_Themes * getInstance();
+ /// \brief set the resources, to store options, to have facilityInterface
+ void setResources(OptionInterface * optionsEngine,const QString &writePath,const QString &pluginPath,FacilityInterface * facilityEngine,const bool &portableVersion);
+ /// \brief to get the default options widget
+ QWidget * options();
+ /// \brief to get a resource icon
+ QIcon getIcon(const QString &fileName) const;
+ //regex
+ static QRegularExpression slashEnd;
+ static QRegularExpression isolateName;
+ signals:
+ void reloadLanguage();
+ public slots:
+ void resetOptions();
+ void newLanguageLoaded();
+ private:
+ FacilityInterface * facilityEngine;
+};
+
+#endif // FACTORY_H
diff --git a/plugins-alternative/Themes/Windows/informations.xml b/plugins-alternative/Themes/Windows/informations.xml
new file mode 100644
index 0000000..1871990
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Windows dialog for Ultracopier]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Dialogue de Windows pour Ultracopier]]></title>
+ <!-- What kind of plugin this is -->
+ <category>Themes</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in RFC822 format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Windows dialog for Ultracopier, to have same copy dialog than windows vista/7/8]]></description>
+ <description xml:lang="fr"><![CDATA[Dialogue de Windows pour Ultracopier, pour avoir une boite de dialogue pour la copie comme windows vista/7/8]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Windows</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins-alternative/Themes/Windows/interface.cpp b/plugins-alternative/Themes/Windows/interface.cpp
new file mode 100644
index 0000000..e358f9c
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/interface.cpp
@@ -0,0 +1,414 @@
+/** \file interface.cpp
+\brief Define the interface core
+\author alpha_one_x86
+*/
+
+#include "interface.h"
+#include "factory.h"
+#include "ui_interface.h"
+
+Themes::Themes(FacilityInterface * facilityEngine) :
+ ui(new Ui::interface())
+{
+ ui->setupUi(this);
+ remainingSeconds= 0;
+ speed = 0;
+ progression_current=0;
+ progression_total=0;
+ modeIsForced = false;
+ haveStarted = false;
+ this->facilityEngine = facilityEngine;
+ transferModel.setFacilityEngine(facilityEngine);
+ menu=new QMenu(this);
+ ui->toolButton->setMenu(menu);
+ updateModeAndType();
+
+ connect(ui->actionAddFile,&QAction::triggered,this,&Themes::forcedModeAddFile);
+ connect(ui->actionAddFileToCopy,&QAction::triggered,this,&Themes::forcedModeAddFileToCopy);
+ connect(ui->actionAddFileToMove,&QAction::triggered,this,&Themes::forcedModeAddFileToMove);
+ connect(ui->actionAddFolderToCopy,&QAction::triggered,this,&Themes::forcedModeAddFolderToCopy);
+ connect(ui->actionAddFolderToMove,&QAction::triggered,this,&Themes::forcedModeAddFolderToMove);
+ connect(ui->actionAddFolder,&QAction::triggered,this,&Themes::forcedModeAddFolder);
+
+ updateDetails();
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(&transferModel,&TransferModel::debugInformation,this,&Themes::debugInformation);
+ #endif
+ #ifndef Q_OS_WIN32
+ ui->widget_bottom->setStyleSheet("background-color: rgb(237, 237, 237);");
+ #endif
+ show();
+}
+
+Themes::~Themes()
+{
+ delete menu;
+}
+
+void Themes::forcedModeAddFile()
+{
+ emit userAddFile(mode);
+}
+
+void Themes::forcedModeAddFolder()
+{
+ emit userAddFolder(mode);
+}
+
+void Themes::forcedModeAddFileToCopy()
+{
+ emit userAddFile(Ultracopier::Copy);
+}
+
+void Themes::forcedModeAddFolderToCopy()
+{
+ emit userAddFolder(Ultracopier::Copy);
+}
+
+void Themes::forcedModeAddFileToMove()
+{
+ emit userAddFile(Ultracopier::Move);
+}
+
+void Themes::forcedModeAddFolderToMove()
+{
+ emit userAddFolder(Ultracopier::Move);
+}
+
+void Themes::updateModeAndType()
+{
+ menu->clear();
+ if(modeIsForced)
+ {
+ menu->addAction(ui->actionAddFile);
+ if(type==Ultracopier::FileAndFolder)
+ menu->addAction(ui->actionAddFolder);
+ }
+ else
+ {
+ menu->addAction(ui->actionAddFileToCopy);
+ menu->addAction(ui->actionAddFileToMove);
+ if(type==Ultracopier::FileAndFolder)
+ {
+ menu->addAction(ui->actionAddFolderToCopy);
+ menu->addAction(ui->actionAddFolderToMove);
+ }
+ }
+}
+
+void Themes::closeEvent(QCloseEvent *event)
+{
+ event->ignore();
+ this->hide();
+ emit cancel();
+}
+
+void Themes::detectedSpeed(const quint64 &speed)
+{
+ this->speed=speed;
+ if(ui->more->isChecked())
+ ui->label_speed->setText(facilityEngine->speedToString(speed));
+}
+
+void Themes::setSupportSpeedLimitation(const bool &supportSpeedLimitationBool)
+{
+ Q_UNUSED(supportSpeedLimitationBool);
+}
+
+QWidget * Themes::getOptionsEngineWidget()
+{
+ return NULL;
+}
+
+void Themes::getOptionsEngineEnabled(const bool &isEnabled)
+{
+ Q_UNUSED(isEnabled)
+}
+
+void Themes::setCopyType(const Ultracopier::CopyType &type)
+{
+ this->type=type;
+ updateModeAndType();
+}
+
+void Themes::forceCopyMode(const Ultracopier::CopyMode &mode)
+{
+ modeIsForced=true;
+ this->mode=mode;
+ updateModeAndType();
+ updateInformations();
+}
+
+void Themes::updateTitle()
+{
+ remainingTime(remainingSeconds);
+}
+
+void Themes::actionInProgess(const Ultracopier::EngineActionInProgress &action)
+{
+ this->action=action;
+ switch(action)
+ {
+ case Ultracopier::Copying:
+ case Ultracopier::CopyingAndListing:
+ ui->progressBar->setMaximum(65535);
+ ui->progressBar->setMinimum(0);
+ break;
+ case Ultracopier::Listing:
+ ui->progressBar->setMaximum(0);
+ ui->progressBar->setMinimum(0);
+ break;
+ case Ultracopier::Idle:
+ if(haveStarted)
+ emit cancel();
+ break;
+ default:
+ break;
+ }
+ switch(action)
+ {
+ case Ultracopier::Copying:
+ case Ultracopier::CopyingAndListing:
+ haveStarted=true;
+ break;
+ default:
+ break;
+ }
+}
+
+void Themes::newTransferStart(const Ultracopier::ItemOfCopyList &item)
+{
+ ui->text->setText(item.sourceFullPath);
+}
+
+void Themes::newTransferStop(const quint64 &id)
+{
+ Q_UNUSED(id)
+}
+
+void Themes::newFolderListing(const QString &path)
+{
+ if(action==Ultracopier::Listing)
+ ui->text->setText(path);
+}
+
+void Themes::remainingTime(const int &remainingSeconds)
+{
+ this->remainingSeconds=remainingSeconds;
+
+ QString remainingTime;
+ if(remainingSeconds>=0)
+ remainingTime=facilityEngine->simplifiedRemainingTime(remainingSeconds);
+ else
+ remainingTime=facilityEngine->translateText(tr("Unknown remaining time"));
+
+ this->setWindowTitle(remainingTime);
+
+ if(ui->more->isChecked())
+ ui->label_remaining_time->setText(remainingTime);
+ else
+ updateInformations();
+}
+
+void Themes::newCollisionAction(const QString &action)
+{
+ Q_UNUSED(action)
+}
+
+void Themes::newErrorAction(const QString &action)
+{
+ Q_UNUSED(action)
+}
+
+void Themes::errorDetected()
+{
+}
+
+/// \brief new error
+void Themes::errorToRetry(const QString &source,const QString &destination,const QString &error)
+{
+ Q_UNUSED(source);
+ Q_UNUSED(destination);
+ Q_UNUSED(error);
+}
+
+void Themes::setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation)
+{
+ Q_UNUSED(transferListOperation)
+}
+
+//speed limitation
+bool Themes::setSpeedLimitation(const qint64 &speedLimitation)
+{
+ Q_UNUSED(speedLimitation)
+ return false;
+}
+
+//get information about the copy
+void Themes::setGeneralProgression(const quint64 &current,const quint64 &total)
+{
+ progression_current=current;
+ progression_total=total;
+ ui->progressBar->setValue(((double)current/total)*65535);
+}
+
+void Themes::setCollisionAction(const QList<QPair<QString,QString> > &list)
+{
+ Q_UNUSED(list)
+}
+
+void Themes::setErrorAction(const QList<QPair<QString,QString> > &list)
+{
+ Q_UNUSED(list)
+}
+
+//edit the transfer list
+void Themes::getActionOnList(const QList<Ultracopier::ReturnActionOnCopyList> &returnActions)
+{
+ transferModel.synchronizeItems(returnActions);
+ updateInformations();
+}
+
+void Themes::haveExternalOrder()
+{
+ ui->toolButton->hide();
+}
+
+void Themes::isInPause(const bool &isInPause)
+{
+ //resume in auto the pause
+ if(isInPause)
+ emit resume();
+}
+
+void Themes::newLanguageLoaded()
+{
+ ui->retranslateUi(this);
+ updateTitle();
+ updateInformations();
+}
+
+void Themes::setFileProgression(const QList<Ultracopier::ProgressionItem> &progressionList)
+{
+ QList<Ultracopier::ProgressionItem> progressionListBis=progressionList;
+ transferModel.setFileProgression(progressionListBis);
+ updateInformations();
+}
+
+void Themes::on_more_toggled(bool checked)
+{
+ Q_UNUSED(checked);
+ updateDetails();
+ updateInformations();
+}
+
+void Themes::updateDetails()
+{
+ ui->text->setHidden(ui->more->isChecked());
+ ui->details->setHidden(!ui->more->isChecked());
+ if(ui->more->isChecked())
+ {
+ this->setMinimumHeight(242);
+ this->setMaximumHeight(242);
+ ui->more->setIcon(QIcon(":/Themes/Windows/resources/arrow-up.png"));
+ }
+ else
+ {
+ this->setMinimumHeight(168);
+ this->setMaximumHeight(168);
+ ui->more->setIcon(QIcon(":/Themes/Windows/resources/arrow-down.png"));
+ }
+
+ // usefull under windows
+ this->updateGeometry();
+ this->update();
+ this->adjustSize();
+
+ updateInformations();
+}
+
+void Themes::updateInformations()
+{
+ TransferModel::currentTransfertItem transfertItem=transferModel.getCurrentTransfertItem();
+ if(!modeIsForced)
+ {
+ if(transferModel.totalFile>1)
+ ui->label_main->setText(tr("Transferring %n item(s) (%2)","",transferModel.totalFile).arg(facilityEngine->sizeToString(progression_total)));
+ else
+ ui->label_main->setText(tr("Transferring %n item(s) (%2)","",transferModel.totalFile).arg(facilityEngine->sizeToString(progression_total)));
+ }
+ else
+ {
+ if(mode==Ultracopier::Copy)
+ {
+ if(transferModel.totalFile>1)
+ ui->label_main->setText(tr("Copying %n item(s) (%2)","",transferModel.totalFile).arg(facilityEngine->sizeToString(progression_total)));
+ else
+ ui->label_main->setText(tr("Copying %n item(s) (%2)","",transferModel.totalFile).arg(facilityEngine->sizeToString(progression_total)));
+ }
+ else
+ {
+ if(transferModel.totalFile>1)
+ ui->label_main->setText(tr("Moving %n item(s) (%2)","",transferModel.totalFile).arg(facilityEngine->sizeToString(progression_total)));
+ else
+ ui->label_main->setText(tr("Moving %n item(s) (%2)","",transferModel.totalFile).arg(facilityEngine->sizeToString(progression_total)));
+ }
+ }
+
+ if(ui->more->isChecked())
+ {
+ if(transfertItem.haveItem)
+ {
+ QString simplifiedFrom=transfertItem.from;
+ QString simplifiedTo=transfertItem.to;
+ simplifiedFrom.remove(ThemesFactory::slashEnd);
+ simplifiedTo.remove(ThemesFactory::slashEnd);
+ simplifiedFrom.replace('\\','/');
+ simplifiedTo.replace('\\','/');
+ simplifiedFrom.replace(ThemesFactory::isolateName, "\\1");
+ simplifiedTo.replace(ThemesFactory::isolateName, "\\1");
+ ui->label_file->setText(transfertItem.current_file);
+ ui->label_from->setText(QStringLiteral("<b>%1</b> (%2)").arg(simplifiedFrom).arg(transfertItem.from));
+ ui->label_to->setText(QStringLiteral("<b>%1</b> (%2)").arg(simplifiedTo).arg(transfertItem.to));
+ ui->label_items->setText(QStringLiteral("%1 (%2)").arg(transferModel.totalFile-transferModel.currentFile).arg(facilityEngine->sizeToString(progression_total-progression_current)));
+ }
+ else
+ {
+ ui->label_file->setText("");
+ ui->label_from->setText("");
+ ui->label_to->setText("");
+ ui->label_items->setText(QStringLiteral("%1 (%2)").arg(transferModel.totalFile-transferModel.currentFile).arg(facilityEngine->sizeToString(progression_total-progression_current)));
+ }
+ }
+ else
+ {
+ if(transfertItem.haveItem)
+ {
+ QString remainingTime;
+ if(remainingSeconds>=0)
+ remainingTime=facilityEngine->simplifiedRemainingTime(remainingSeconds);
+ else
+ remainingTime=facilityEngine->translateText(tr("Unknown remaining time"));
+ QString simplifiedFrom=transfertItem.from;
+ QString simplifiedTo=transfertItem.to;
+ simplifiedFrom.remove(ThemesFactory::slashEnd);
+ simplifiedTo.remove(ThemesFactory::slashEnd);
+ simplifiedFrom.replace('\\','/');
+ simplifiedTo.replace('\\','/');
+ simplifiedFrom.replace(ThemesFactory::isolateName, "\\1");
+ simplifiedTo.replace(ThemesFactory::isolateName, "\\1");
+ ui->text->setText(
+ //: Sample: from <b>sources</b> (e:\folder\source) to <b>destination</b> (d:\desktop\destination)<br />About 5 Hours remaining
+ tr("from <b>%1</b> (%2) to <b>%3</b> (%4)<br />%5")
+ .arg(simplifiedFrom)
+ .arg(transfertItem.from)
+ .arg(simplifiedTo)
+ .arg(transfertItem.to)
+ .arg(remainingTime)
+ );
+ }
+ else
+ ui->text->setText(tr("In waiting"));
+ }
+}
diff --git a/plugins-alternative/Themes/Windows/interface.h b/plugins-alternative/Themes/Windows/interface.h
new file mode 100644
index 0000000..5de55e6
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/interface.h
@@ -0,0 +1,165 @@
+/** \file interface.h
+\brief Define the interface
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef INTERFACE_TEST_H
+#define INTERFACE_TEST_H
+
+#include <QObject>
+#include <QWidget>
+#include <QMenu>
+#include <QCloseEvent>
+
+#include "../../../interface/PluginInterface_Themes.h"
+#include "TransferModel.h"
+
+namespace Ui {
+ class interface;
+}
+
+/// \brief Define the interface
+class Themes : public PluginInterface_Themes
+{
+ Q_OBJECT
+public slots:
+ //send information about the copy
+ /// \brief to set the action in progress
+ void actionInProgess(const Ultracopier::EngineActionInProgress &);
+ /// \brief new transfer have started
+ void newTransferStart(const Ultracopier::ItemOfCopyList &item);
+ /** \brief one transfer have been stopped
+ * is stopped, example: because error have occurred, and try later, don't remove the item! */
+ void newTransferStop(const quint64 &id);
+ /// \brief the new folder is listing
+ void newFolderListing(const QString &path);
+ /** \brief show the detected speed
+ * in byte per seconds */
+ void detectedSpeed(const quint64 &speed);
+ /** \brief support speed limitation */
+ void setSupportSpeedLimitation(const bool &supportSpeedLimitationBool);
+ /** \brief show the remaining time
+ * time in seconds */
+ void remainingTime(const int &remainingSeconds);
+ /// \brief set the current collision action
+ void newCollisionAction(const QString &action);
+ /// \brief set the current error action
+ void newErrorAction(const QString &action);
+ /// \brief set one error is detected
+ void errorDetected();
+ /// \brief new error
+ void errorToRetry(const QString &source,const QString &destination,const QString &error);
+ //speed limitation
+ /** \brief the max speed used
+ * in byte per seconds, -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const qint64 &speedLimitation);
+ //set the translate
+ void newLanguageLoaded();
+public:
+ /// \brief the transfer item with progression
+ struct ItemOfCopyListWithMoreInformations
+ {
+ quint64 currentProgression;
+ Ultracopier::ItemOfCopyList generalData;
+ Ultracopier::ActionTypeCopyList actionType;
+ bool custom_with_progression;
+ };
+ /// \brief returned first transfer item
+ struct currentTransfertItem
+ {
+ quint64 id;
+ bool haveItem;
+ QString from;
+ QString to;
+ QString current_file;
+ int progressBar_file;
+ };
+ /// \brief get the widget for the copy engine
+ QWidget * getOptionsEngineWidget();
+ /// \brief to set if the copy engine is found
+ void getOptionsEngineEnabled(const bool &isEnabled);
+ /// \brief get action on the transfer list (add/move/remove)
+ void getActionOnList(const QList<Ultracopier::ReturnActionOnCopyList> &returnActions);
+ //get information about the copy
+ /// \brief show the general progression
+ void setGeneralProgression(const quint64 &current,const quint64 &total);
+ /// \brief show the file progression
+ void setFileProgression(const QList<Ultracopier::ProgressionItem> &progressionList);
+ /// \brief set collision action
+ void setCollisionAction(const QList<QPair<QString,QString> > &);
+ /// \brief set error action
+ void setErrorAction(const QList<QPair<QString,QString> > &);
+ /// \brief set the copyType -> file or folder
+ void setCopyType(const Ultracopier::CopyType &);
+ /// \brief set the copyMove -> copy or move, to force in copy or move, else support both
+ void forceCopyMode(const Ultracopier::CopyMode &);
+ /// \brief set if transfer list is exportable/importable
+ void setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation);
+ /** \brief set if the order is external (like file manager copy)
+ * to notify the interface, which can hide add folder/filer button */
+ void haveExternalOrder();
+ /// \brief set if is in pause
+ void isInPause(const bool &);
+signals:
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const QString &fonction,const QString &text,const QString &file,const int &ligne);
+ #endif
+/* //set the transfer list
+ void removeItems(QList<int> ids);
+ void moveItemsOnTop(QList<int> ids);
+ void moveItemsUp(QList<int> ids);
+ void moveItemsDown(QList<int> ids);
+ void moveItemsOnBottom(QList<int> ids);
+ void exportTransferList();
+ void importTransferList();
+ //user ask ask to add folder (add it with interface ask source/destination)
+ void userAddFolder(CopyMode);
+ void userAddFile(CopyMode);
+ void urlDropped(QList<QUrl> urls);
+ //action on the copy
+ void pause();
+ void resume();
+ void skip(quint64 id);
+ void cancel();
+ //edit the action
+ void sendCollisionAction(QString action);
+ void sendErrorAction(QString action);
+ void newSpeedLimitation(qint64);*/
+public:
+ //constructor and destructor
+ Themes(FacilityInterface * facilityEngine);
+ ~Themes();
+private:
+ Ui::interface *ui;
+ TransferModel transferModel;
+ void updateTitle();
+ QMenu *menu;
+ Ultracopier::EngineActionInProgress action;
+ void closeEvent(QCloseEvent *event);
+ void updateModeAndType();
+ bool modeIsForced;
+ Ultracopier::CopyType type;
+ Ultracopier::CopyMode mode;
+ bool haveStarted;
+ QList<ItemOfCopyListWithMoreInformations> InternalRunningOperation;
+ int loop_size,index_for_loop;
+ int sub_loop_size,sub_index_for_loop;
+ FacilityInterface * facilityEngine;
+ void updateDetails();
+ void updateInformations();
+ int remainingSeconds;
+ quint64 progression_current;
+ quint64 progression_total;
+ quint64 speed;
+private slots:
+ void forcedModeAddFile();
+ void forcedModeAddFolder();
+ void forcedModeAddFileToCopy();
+ void forcedModeAddFolderToCopy();
+ void forcedModeAddFileToMove();
+ void forcedModeAddFolderToMove();
+ void on_more_toggled(bool checked);
+};
+
+#endif // INTERFACE_TEST_H
diff --git a/plugins-alternative/Themes/Windows/interface.pro b/plugins-alternative/Themes/Windows/interface.pro
new file mode 100644
index 0000000..9a82f6a
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/interface.pro
@@ -0,0 +1,48 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+QT += widgets
+TEMPLATE = lib
+CONFIG += plugin
+HEADERS = interface.h \
+ StructEnumDefinition.h \
+ factory.h \
+ ../../../interface/PluginInterface_Themes.h \
+ TransferModel.h
+SOURCES = interface.cpp \
+ factory.cpp \
+ TransferModel.cpp
+TARGET = $$qtLibraryTarget(interface)
+TRANSLATIONS += Languages/ar/translation.ts \
+ Languages/de/translation.ts \
+ Languages/el/translation.ts \
+ Languages/en/translation.ts \
+ Languages/es/translation.ts \
+ Languages/fr/translation.ts \
+ Languages/hi/translation.ts \
+ Languages/hu/translation.ts \
+ Languages/id/translation.ts \
+ Languages/it/translation.ts \
+ Languages/ja/translation.ts \
+ Languages/ko/translation.ts \
+ Languages/nl/translation.ts \
+ Languages/no/translation.ts \
+ Languages/pl/translation.ts \
+ Languages/ru/translation.ts \
+ Languages/th/translation.ts \
+ Languages/tr/translation.ts \
+ Languages/zh/translation.ts
+
+FORMS += \
+ interface.ui
+
+RESOURCES += \
+ resources.qrc
+
+win32 {
+ RESOURCES += resources_windows.qrc
+}
+!win32 {
+ RESOURCES += resources_unix.qrc
+}
diff --git a/plugins-alternative/Themes/Windows/interface.ui b/plugins-alternative/Themes/Windows/interface.ui
new file mode 100644
index 0000000..f255562
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/interface.ui
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>interface</class>
+ <widget class="QWidget" name="interface">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>420</width>
+ <height>284</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>420</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>420</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Ultracopier</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/Themes/Windows/resources/icon.png</normaloff>:/Themes/Windows/resources/icon.png</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="widget" native="true">
+ <property name="minimumSize">
+ <size>
+ <width>420</width>
+ <height>42</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>420</width>
+ <height>42</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(230, 240, 255, 255), stop:0.5 rgba(166, 199, 230, 255), stop:1 rgba(3, 40, 84, 255));</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <property name="leftMargin">
+ <number>20</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>20</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_main">
+ <property name="styleSheet">
+ <string notr="true">background-color: rgba(255, 0, 0, 0);
+font: 12pt &quot;Sans Serif&quot;;</string>
+ </property>
+ <property name="text">
+ <string notr="true">Copying 0 item (0KB)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="minimumSize">
+ <size>
+ <width>51</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>51</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgba(255, 0, 0, 0);</string>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="resources.qrc">:/Themes/Windows/resources/icon-top.png</pixmap>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_2" native="true">
+ <property name="minimumSize">
+ <size>
+ <width>420</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>420</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(255, 255, 255);</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>14</number>
+ </property>
+ <property name="leftMargin">
+ <number>20</number>
+ </property>
+ <property name="topMargin">
+ <number>14</number>
+ </property>
+ <property name="rightMargin">
+ <number>20</number>
+ </property>
+ <property name="bottomMargin">
+ <number>14</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="text">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>28</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">from &lt;b&gt;%1&lt;/b&gt; (%2) to &lt;b&gt;%3&lt;/b&gt; (%4)&lt;br /&gt;
+%5</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="details" native="true">
+ <layout class="QFormLayout" name="formLayout">
+ <property name="labelAlignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ <property name="verticalSpacing">
+ <number>2</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_file"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>From:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_from"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>To:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_to"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>Time remaining:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="label_remaining_time"/>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Items remaining:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="label_items"/>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Speed:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLabel" name="label_speed"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>14</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>14</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>65535</number>
+ </property>
+ <property name="textVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_bottom" native="true">
+ <property name="minimumSize">
+ <size>
+ <width>420</width>
+ <height>42</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>420</width>
+ <height>42</height>
+ </size>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="leftMargin">
+ <number>20</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>20</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="more">
+ <property name="text">
+ <string>More information</string>
+ </property>
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/Themes/Windows/resources/arrow-down.png</normaloff>:/Themes/Windows/resources/arrow-down.png</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>123</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolButton">
+ <property name="text">
+ <string notr="true">...</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ <action name="actionAddFile">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Windows/resources/add.png</normaloff>:/Themes/Windows/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add file</string>
+ </property>
+ </action>
+ <action name="actionAddFolder">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Windows/resources/add.png</normaloff>:/Themes/Windows/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add folder</string>
+ </property>
+ </action>
+ <action name="actionAddFileToMove">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Windows/resources/add.png</normaloff>:/Themes/Windows/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Move file(s)</string>
+ </property>
+ </action>
+ <action name="actionAddFolderToMove">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Windows/resources/add.png</normaloff>:/Themes/Windows/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Move folder</string>
+ </property>
+ </action>
+ <action name="actionAddFileToCopy">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Windows/resources/add.png</normaloff>:/Themes/Windows/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy file(s)</string>
+ </property>
+ </action>
+ <action name="actionAddFolderToCopy">
+ <property name="icon">
+ <iconset>
+ <normaloff>:/Themes/Windows/resources/add.png</normaloff>:/Themes/Windows/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy folder</string>
+ </property>
+ </action>
+ </widget>
+ <resources>
+ <include location="resources.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>Cancel</sender>
+ <signal>clicked()</signal>
+ <receiver>interface</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>388</x>
+ <y>349</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>523</x>
+ <y>498</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins-alternative/Themes/Windows/plugin.json b/plugins-alternative/Themes/Windows/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins-alternative/Themes/Windows/resources.qrc b/plugins-alternative/Themes/Windows/resources.qrc
new file mode 100644
index 0000000..f7ffc64
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources.qrc
@@ -0,0 +1,10 @@
+<RCC>
+ <qresource prefix="/Themes/Windows">
+ <file>resources/icon.png</file>
+ <file>resources/arrow-down.png</file>
+ <file>resources/arrow-up.png</file>
+ <file>resources/SystemTrayIcon/informations.png</file>
+ <file>resources/icon-top.png</file>
+ <file>resources/empty.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/informations.png b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/informations.png
new file mode 100644
index 0000000..5b7b255
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/informations.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Caught_Unix.png b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Caught_Unix.png
new file mode 100644
index 0000000..6f5d1cf
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Caught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Caught_Windows.png b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Caught_Windows.png
new file mode 100644
index 0000000..5464856
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Caught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
new file mode 100644
index 0000000..3961215
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
new file mode 100644
index 0000000..45d6315
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Uncaught_Unix.png b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Uncaught_Unix.png
new file mode 100644
index 0000000..ac4299a
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Uncaught_Unix.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Uncaught_Windows.png b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Uncaught_Windows.png
new file mode 100644
index 0000000..6e6bae7
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/SystemTrayIcon/systray_Uncaught_Windows.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/arrow-down.png b/plugins-alternative/Themes/Windows/resources/arrow-down.png
new file mode 100644
index 0000000..39b5c37
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/arrow-down.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/arrow-up.png b/plugins-alternative/Themes/Windows/resources/arrow-up.png
new file mode 100644
index 0000000..5c824fb
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/arrow-up.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/empty.png b/plugins-alternative/Themes/Windows/resources/empty.png
new file mode 100644
index 0000000..846d96d
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/empty.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/icon-top.png b/plugins-alternative/Themes/Windows/resources/icon-top.png
new file mode 100644
index 0000000..64b7992
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/icon-top.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/icon-top.xcf b/plugins-alternative/Themes/Windows/resources/icon-top.xcf
new file mode 100644
index 0000000..9a775e2
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/icon-top.xcf
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources/icon.png b/plugins-alternative/Themes/Windows/resources/icon.png
new file mode 100644
index 0000000..eccfbc5
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources/icon.png
Binary files differ
diff --git a/plugins-alternative/Themes/Windows/resources_unix.qrc b/plugins-alternative/Themes/Windows/resources_unix.qrc
new file mode 100644
index 0000000..3904f69
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources_unix.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Windows">
+ <file>resources/SystemTrayIcon/systray_Caught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Unix.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins-alternative/Themes/Windows/resources_windows.qrc b/plugins-alternative/Themes/Windows/resources_windows.qrc
new file mode 100644
index 0000000..28666fc
--- /dev/null
+++ b/plugins-alternative/Themes/Windows/resources_windows.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Windows">
+ <file>resources/SystemTrayIcon/systray_Caught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Windows.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins/CopyEngine/Rsync/Rsync.pro b/plugins/CopyEngine/Rsync/Rsync.pro
new file mode 100644
index 0000000..e525f27
--- /dev/null
+++ b/plugins/CopyEngine/Rsync/Rsync.pro
@@ -0,0 +1,2 @@
+include($$PWD/../Ultracopier/CopyEngine.pro)
+DEFINES += ULTRACOPIER_PLUGIN_RSYNC
diff --git a/plugins/CopyEngine/Rsync/informations.xml b/plugins/CopyEngine/Rsync/informations.xml
new file mode 100644
index 0000000..17c9f26
--- /dev/null
+++ b/plugins/CopyEngine/Rsync/informations.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Rsync copy engine]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>CopyEngine</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Copy engine of Ultracopier which uses rsync as backend]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Rsync</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package>
diff --git a/plugins/CopyEngine/Ultracopier/AvancedQFile.cpp b/plugins/CopyEngine/Ultracopier/AvancedQFile.cpp
new file mode 100644
index 0000000..3d867fb
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/AvancedQFile.cpp
@@ -0,0 +1,208 @@
+/** \file AvancedQFile.cpp
+\brief Define the QFile herited class to set file date/time
+\author alpha_one_x86 */
+
+#include "AvancedQFile.h"
+
+#ifdef Q_CC_GNU
+//this next header is needed to change file time/date under gcc
+#include <utime.h>
+#include <errno.h>
+#endif
+
+//source
+//hSrc=CreateFile(pData->pfiSrcFile->GetFullFilePath(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffer ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+//destination
+//hDst=CreateFile(pData->strDstFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffer ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+
+bool AvancedQFile::setCreated(const QDateTime &time)
+{
+ time_t ctime=time.toTime_t();
+ #ifdef Q_CC_GNU
+ //creation time not exists into unix world
+ Q_UNUSED(ctime)
+ return true;
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
+bool AvancedQFile::setLastModified(const QDateTime &time)
+{
+ time_t actime=QFileInfo(*this).lastRead().toTime_t();
+ //protect to wrong actime
+ if(actime<0)
+ actime=0;
+ time_t modtime=time.toTime_t();
+ if(modtime<0)
+ {
+ setErrorString(tr("Last modified date is wrong"));
+ return false;
+ }
+ #ifdef Q_CC_GNU
+ //this function avalaible on unix and mingw
+ utimbuf butime;
+ butime.actime=actime;
+ butime.modtime=modtime;
+ int returnVal=utime(this->fileName().toLocal8Bit().data(),&butime);
+ if(returnVal==0)
+ return true;
+ else
+ {
+ setErrorString(strerror(errno));
+ return false;
+ }
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
+bool AvancedQFile::setLastRead(const QDateTime &time)
+{
+ time_t modtime=QFileInfo(*this).lastModified().toTime_t();
+ //protect to wrong actime
+ if(modtime<0)
+ modtime=0;
+ time_t actime=time.toTime_t();
+ if(actime<0)
+ {
+ setErrorString(tr("Last access date is wrong"));
+ return false;
+ }
+ #ifdef Q_CC_GNU
+ //this function avalaible on unix and mingw
+ utimbuf butime;
+ butime.actime=actime;
+ butime.modtime=modtime;
+ int returnVal=utime(this->fileName().toLocal8Bit().data(),&butime);
+ if(returnVal==0)
+ return true;
+ else
+ {
+ setErrorString(strerror(errno));
+ return false;
+ }
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
+#ifdef ULTRACOPIER_OVERLAPPED_FILE
+AvancedQFile::avancedQFile()
+{
+ handle=INVALID_HANDLE_VALUE;
+ fileError=QFileDevice::NoError;
+ fileErrorString.clear();
+}
+
+AvancedQFile::~avancedQFile()
+{
+ close();
+}
+
+QString AvancedQFile::getLastWindowsError()
+{
+ WCHAR ErrorStringW[65535];
+ DWORD dw = GetLastError();
+
+ int size=FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ dw,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ ErrorStringW,
+ 0, NULL );
+ if(size<0)
+ tr("Unknown error: %1").arg(dw);
+ return QString::fromWCharArray(ErrorStringW,size);
+}
+
+bool AvancedQFile::open(OpenMode mode)
+{
+ fileError=QFileDevice::NoError;
+ fileErrorString.clear();
+ WCHAR fileNameW[fileName().size()+1];
+ if(QDir::toNativeSeparators("\\\\?\\"+fileName()).toWCharArray(fileNameW)!=fileName().size())
+ {
+ fileError=QFileDevice::OpenError;
+ fileErrorString=tr("Path conversion error");
+ return false;
+ }
+ fileNameW[fileName().size()]='\0';
+
+ DWORD dwDesiredAccess=0;
+ if(mode & QIODevice::ReadOnly)
+ dwDesiredAccess|=GENERIC_READ;
+ if(mode & QIODevice::WriteOnly)
+ dwDesiredAccess|=GENERIC_Write;
+
+ DWORD dwCreationDisposition;
+ if(mode & QIODevice::WriteOnly)
+ dwCreationDisposition=CREATE_ALWAYS;
+ else
+ dwCreationDisposition=OPEN_EXISTING;
+
+ handle=CreateFile(
+ fileNameW,
+ dwDesiredAccess,
+ 0,
+ 0,
+ dwCreationDisposition,
+ FILE_FLAG_WRITE_THROUGH | FILE_FLAG_SEQUENTIAL_SCAN,
+ 0
+ );
+ if(handle==INVALID_HANDLE_VALUE)
+ {
+ fileError=QFileDevice::OpenError;
+ fileErrorString=getLastWindowsError();
+ }
+ return (handle!=INVALID_HANDLE_VALUE);
+}
+
+void AvancedQFile::close()
+{
+ if(handle==INVALID_HANDLE_VALUE)
+ return;
+ CloseHandle(handle);
+}
+
+bool AvancedQFile::seek(qint64 pos)
+{
+ toto
+}
+
+bool AvancedQFile::resize(qint64 size)
+{
+ toto
+}
+
+QString AvancedQFile::errorString() const
+{
+ if(fileErrorString.isEmpty())
+ return tr("Unknown error");
+ return fileErrorString;
+}
+
+bool AvancedQFile::isOpen() const
+{
+ return (handle!=INVALID_HANDLE_VALUE);
+}
+
+qint64 AvancedQFile::write(const QByteArray &data)
+{
+}
+
+QByteArray AvancedQFile::read(qint64 maxlen)
+{
+}
+
+QFileDevice::FileError AvancedQFile::error() const
+{
+ return fileError;
+}
+#endif
diff --git a/plugins/CopyEngine/Ultracopier/AvancedQFile.h b/plugins/CopyEngine/Ultracopier/AvancedQFile.h
new file mode 100644
index 0000000..8c3dc4a
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/AvancedQFile.h
@@ -0,0 +1,45 @@
+/** \file AvancedQFile.h
+\brief Define the QFile herited class to set file date/time
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef AVANCEDQFILE_H
+#define AVANCEDQFILE_H
+
+#include <QFile>
+#include <QDateTime>
+#include <QFileInfo>
+
+/// \brief devired class from QFile to set time/date on file
+class AvancedQFile : public QFile
+{
+ Q_OBJECT
+public:
+ /// \brief set created date, not exists in unix world
+ bool setCreated(const QDateTime &time);
+ /// \brief set last modification date
+ bool setLastModified(const QDateTime &time);
+ /// \brief set last read date
+ bool setLastRead(const QDateTime &time);
+
+ #ifdef ULTRACOPIER_OVERLAPPED_FILE
+ explicit AvancedQFile();
+ ~AvancedQFile();
+ bool open(OpenMode mode);
+ void close();
+ bool seek(qint64 pos);
+ bool resize(qint64 size);
+ QString errorString() const;
+ bool isOpen() const;
+ qint64 write(const QByteArray &data);
+ QByteArray read(qint64 maxlen);
+ FileError error() const;
+ QString getLastWindowsError();
+private:
+ HANDLE handle;
+ FileError fileError;
+ QString fileErrorString;
+ #endif
+};
+
+#endif // AVANCEDQFILE_H
diff --git a/plugins/CopyEngine/Ultracopier/CompilerInfo.h b/plugins/CopyEngine/Ultracopier/CompilerInfo.h
new file mode 100644
index 0000000..84625b9
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/CompilerInfo.h
@@ -0,0 +1 @@
+#include "../../../CompilerInfo.h"
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngine-collision-and-error.cpp b/plugins/CopyEngine/Ultracopier/CopyEngine-collision-and-error.cpp
new file mode 100644
index 0000000..16c36ae
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/CopyEngine-collision-and-error.cpp
@@ -0,0 +1,568 @@
+/** \file copyEngine.cpp
+\brief Define the copy engine
+\author alpha_one_x86 */
+
+#include "CopyEngine.h"
+#include "FolderExistsDialog.h"
+#include "DiskSpace.h"
+
+//dialog message
+/// \note Can be call without queue because all call will be serialized
+void CopyEngine::fileAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread)
+{
+ fileAlreadyExists(source,destination,isSame,thread);
+}
+
+/// \note Can be call without queue because all call will be serialized
+void CopyEngine::errorOnFileSlot(QFileInfo fileInfo,std::string errorString,TransferThread * thread,const ErrorType &errorType)
+{
+ errorOnFile(fileInfo,errorString,thread,errorType);
+}
+
+/// \note Can be call without queue because all call will be serialized
+void CopyEngine::folderAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,ScanFileOrFolder * thread)
+{
+ folderAlreadyExists(source,destination,isSame,thread);
+}
+
+/// \note Can be call without queue because all call will be serialized
+void CopyEngine::errorOnFolderSlot(QFileInfo fileInfo,std::string errorString,ScanFileOrFolder * thread,ErrorType errorType)
+{
+ errorOnFolder(fileInfo,errorString,thread,errorType);
+}
+
+//mkpath event
+void CopyEngine::mkPathErrorOnFolderSlot(QFileInfo folder,std::string error,ErrorType errorType)
+{
+ mkPathErrorOnFolder(folder,error,errorType);
+}
+
+/// \note Can be call without queue because all call will be serialized
+void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the action
+ if(isSame)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file is same: "+source.absoluteFilePath().toStdString());
+ FileExistsAction tempFileExistsAction=alwaysDoThisActionForFileExists;
+ if(tempFileExistsAction==FileExists_Overwrite || tempFileExistsAction==FileExists_OverwriteIfNewer || tempFileExistsAction==FileExists_OverwriteIfNotSame || tempFileExistsAction==FileExists_OverwriteIfOlder)
+ tempFileExistsAction=FileExists_NotSet;
+ switch(tempFileExistsAction)
+ {
+ case FileExists_Skip:
+ case FileExists_Rename:
+ thread->setFileExistsAction(tempFileExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=thread;
+ newItem.scan=NULL;
+ alreadyExistsQueue.push_back(newItem);
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ FileIsSameDialog dialog(interface,source,firstRenamingRule,otherRenamingRule);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileExistsAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
+ if(newAction==FileExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileExists)
+ {
+ alwaysDoThisActionForFileExists=newAction;
+ listThread->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ if(uiIsInstalled)
+ switch(newAction)
+ {
+ default:
+ case FileExists_Skip:
+ ui->comboBoxFileCollision->setCurrentIndex(1);
+ break;
+ case FileExists_Rename:
+ ui->comboBoxFileCollision->setCurrentIndex(6);
+ break;
+ }
+ }
+ if(dialog.getAlways() || newAction!=FileExists_Rename)
+ thread->setFileExistsAction(newAction);
+ else
+ thread->setFileRename(dialog.getNewName());
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file already exists: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ FileExistsAction tempFileExistsAction=alwaysDoThisActionForFileExists;
+ switch(tempFileExistsAction)
+ {
+ case FileExists_Skip:
+ case FileExists_Rename:
+ case FileExists_Overwrite:
+ case FileExists_OverwriteIfNewer:
+ case FileExists_OverwriteIfOlder:
+ case FileExists_OverwriteIfNotSame:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"always do this action: "+std::to_string(tempFileExistsAction));
+ thread->setFileExistsAction(tempFileExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("dialog open, put in queue: %1 %2")
+ .arg(source.absoluteFilePath())
+ .arg(destination.absoluteFilePath())
+ .toStdString()
+ );
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=thread;
+ newItem.scan=NULL;
+ alreadyExistsQueue.push_back(newItem);
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ FileExistsDialog dialog(interface,source,destination,firstRenamingRule,otherRenamingRule);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileExistsAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
+ if(newAction==FileExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileExists)
+ {
+ alwaysDoThisActionForFileExists=newAction;
+ listThread->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ if(uiIsInstalled)
+ switch(newAction)
+ {
+ default:
+ case FileExists_Skip:
+ ui->comboBoxFileCollision->setCurrentIndex(1);
+ break;
+ case FileExists_Rename:
+ ui->comboBoxFileCollision->setCurrentIndex(6);
+ break;
+ case FileExists_Overwrite:
+ ui->comboBoxFileCollision->setCurrentIndex(2);
+ break;
+ case FileExists_OverwriteIfNotSame:
+ ui->comboBoxFileCollision->setCurrentIndex(3);
+ break;
+ case FileExists_OverwriteIfNewer:
+ ui->comboBoxFileCollision->setCurrentIndex(4);
+ break;
+ case FileExists_OverwriteIfOlder:
+ ui->comboBoxFileCollision->setCurrentIndex(5);
+ break;
+ }
+ }
+ if(dialog.getAlways() || newAction!=FileExists_Rename)
+ thread->setFileExistsAction(newAction);
+ else
+ thread->setFileRename(dialog.getNewName());
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit queryOneNewDialog()");
+ emit queryOneNewDialog();
+ }
+ return;
+ break;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+void CopyEngine::haveNeedPutAtBottom(bool needPutAtBottom, const QFileInfo &fileInfo, const std::string &errorString,TransferThread *thread,const ErrorType &errorType)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(!needPutAtBottom)
+ {
+ alwaysDoThisActionForFileError=FileError_NotSet;
+ if(uiIsInstalled)
+ ui->comboBoxFileError->setCurrentIndex(0);
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=fileInfo;
+ newItem.mkPath=false;
+ newItem.rmPath=false;
+ newItem.scan=NULL;
+ newItem.transfer=thread;
+ newItem.errorType=errorType;
+ errorQueue.push_back(newItem);
+ showOneNewDialog();
+ }
+}
+
+void CopyEngine::missingDiskSpace(std::vector<Diskspace> list)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ DiskSpace dialog(facilityEngine,list,interface);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ bool ok=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"cancel: "+std::to_string(ok));
+ if(!ok)
+ emit cancelAll();
+ else
+ listThread->autoStartIfNeeded();
+}
+
+/// \note Can be call without queue because all call will be serialized
+void CopyEngine::errorOnFile(QFileInfo fileInfo,std::string errorString,TransferThread * thread,const ErrorType &errorType,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+fileInfo.absoluteFilePath().toStdString()+", error: "+errorString);
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the action
+ FileErrorAction tempFileErrorAction=alwaysDoThisActionForFileError;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ thread->skip();
+ return;
+ case FileError_Retry:
+ thread->retryAfterError();
+ return;
+ case FileError_PutToEndOfTheList:
+ emit getNeedPutAtBottom(fileInfo,errorString,thread,errorType);
+ return;
+ case FileError_Cancel:
+ return;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=fileInfo;
+ newItem.mkPath=false;
+ newItem.rmPath=false;
+ newItem.scan=NULL;
+ newItem.transfer=thread;
+ newItem.errorType=errorType;
+ errorQueue.push_back(newItem);
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ emit error(fileInfo.absoluteFilePath().toStdString(),fileInfo.size(),fileInfo.lastModified().toMSecsSinceEpoch()/1000,errorString);
+ FileErrorDialog dialog(interface,fileInfo,errorString,errorType);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ alwaysDoThisActionForFileError=newAction;
+ if(uiIsInstalled)
+ switch(newAction)
+ {
+ default:
+ case FileError_Skip:
+ ui->comboBoxFileError->setCurrentIndex(1);
+ break;
+ case FileError_PutToEndOfTheList:
+ ui->comboBoxFileError->setCurrentIndex(2);
+ break;
+ }
+ }
+ switch(newAction)
+ {
+ case FileError_Skip:
+ thread->skip();
+ break;
+ case FileError_Retry:
+ thread->retryAfterError();
+ break;
+ case FileError_PutToEndOfTheList:
+ thread->putAtBottom();
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"file error action wrong");
+ break;
+ }
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"isCalledByShowOneNewDialog==true then not show other dial");
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+/// \note Can be call without queue because all call will be serialized
+void CopyEngine::folderAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,ScanFileOrFolder * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"folder already exists: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the always action
+ FolderExistsAction tempFolderExistsAction=alwaysDoThisActionForFolderExists;
+ switch(tempFolderExistsAction)
+ {
+ case FolderExists_Skip:
+ case FolderExists_Rename:
+ case FolderExists_Merge:
+ thread->setFolderExistsAction(tempFolderExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=NULL;
+ newItem.scan=thread;
+ alreadyExistsQueue.push_back(newItem);
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ FolderExistsDialog dialog(interface,source,isSame,destination,firstRenamingRule,otherRenamingRule);
+ dialog.exec();/// \bug crash when external close
+ FolderExistsAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
+ if(newAction==FolderExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFolderExists)
+ setComboBoxFolderCollision(newAction);
+ if(!dialog.getAlways() && newAction==FolderExists_Rename)
+ thread->setFolderExistsAction(newAction,dialog.getNewName());
+ else
+ thread->setFolderExistsAction(newAction);
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+}
+
+/// \note Can be call without queue because all call will be serialized
+/// \todo all this part
+void CopyEngine::errorOnFolder(QFileInfo fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType, bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+fileInfo.absoluteFilePath().toStdString()+", error: "+errorString);
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the always action
+ FileErrorAction tempFileErrorAction=alwaysDoThisActionForFolderError;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ case FileError_Retry:
+ case FileError_PutToEndOfTheList:
+ thread->setFolderErrorAction(tempFileErrorAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=fileInfo;
+ newItem.mkPath=false;
+ newItem.rmPath=false;
+ newItem.scan=thread;
+ newItem.transfer=NULL;
+ newItem.errorType=errorType;
+ errorQueue.push_back(newItem);
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ emit error(fileInfo.absoluteFilePath().toStdString(),fileInfo.size(),fileInfo.lastModified().toMSecsSinceEpoch()/1000,errorString);
+ FileErrorDialog dialog(interface,fileInfo,errorString,errorType);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ setComboBoxFolderError(newAction);
+ alwaysDoThisActionForFolderError=newAction;
+ }
+ dialogIsOpen=false;
+ thread->setFolderErrorAction(newAction);
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+// -----------------------------------------------------
+
+//mkpath event
+void CopyEngine::mkPathErrorOnFolder(QFileInfo folder,std::string errorString,const ErrorType &errorType,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+folder.absoluteFilePath().toStdString()+", error: "+errorString);
+ //load the always action
+ FileErrorAction tempFileErrorAction=alwaysDoThisActionForFolderError;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ listThread->mkPathQueue.skip();
+ return;
+ case FileError_Retry:
+ listThread->mkPathQueue.retry();
+ return;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=folder;
+ newItem.mkPath=true;
+ newItem.rmPath=false;
+ newItem.scan=NULL;
+ newItem.transfer=NULL;
+ newItem.errorType=errorType;
+ errorQueue.push_back(newItem);
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ emit error(folder.absoluteFilePath().toStdString(),folder.size(),folder.lastModified().toMSecsSinceEpoch()/1000,errorString);
+ FileErrorDialog dialog(interface,folder,errorString,errorType);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ setComboBoxFolderError(newAction);
+ alwaysDoThisActionForFolderError=newAction;
+ }
+ dialogIsOpen=false;
+ switch(newAction)
+ {
+ case FileError_Skip:
+ listThread->mkPathQueue.skip();
+ break;
+ case FileError_Retry:
+ listThread->mkPathQueue.retry();
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unknow switch case: "+std::to_string(newAction));
+ break;
+ }
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//show one new dialog if needed
+void CopyEngine::showOneNewDialog()
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"alreadyExistsQueue.size(): "+std::to_string(alreadyExistsQueue.size()));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"errorQueue.size(): "+std::to_string(errorQueue.size()));
+ int loop_size=alreadyExistsQueue.size();
+ while(loop_size>0)
+ {
+ if(alreadyExistsQueue.front().transfer!=NULL)
+ {
+ fileAlreadyExists(alreadyExistsQueue.front().source,
+ alreadyExistsQueue.front().destination,
+ alreadyExistsQueue.front().isSame,
+ alreadyExistsQueue.front().transfer,
+ true);
+ }
+ else if(alreadyExistsQueue.front().scan!=NULL)
+ folderAlreadyExists(alreadyExistsQueue.front().source,
+ alreadyExistsQueue.front().destination,
+ alreadyExistsQueue.front().isSame,
+ alreadyExistsQueue.front().scan,
+ true);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"bug, no thread actived");
+ alreadyExistsQueue.erase(alreadyExistsQueue.cbegin());
+ loop_size--;
+ }
+ loop_size=errorQueue.size();
+ while(errorQueue.size()>0 && loop_size>0)
+ {
+ if(errorQueue.front().transfer!=NULL)
+ errorOnFile(errorQueue.front().inode,errorQueue.front().errorString,errorQueue.front().transfer,errorQueue.front().errorType,true);
+ else if(errorQueue.front().scan!=NULL)
+ errorOnFolder(errorQueue.front().inode,errorQueue.front().errorString,errorQueue.front().scan,errorQueue.front().errorType,true);
+ else if(errorQueue.front().mkPath)
+ mkPathErrorOnFolder(errorQueue.front().inode,errorQueue.front().errorString,errorQueue.front().errorType,true);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"bug, no thread actived");
+ errorQueue.erase(errorQueue.cbegin());
+ loop_size--;
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngine.cpp b/plugins/CopyEngine/Ultracopier/CopyEngine.cpp
new file mode 100644
index 0000000..f3d6e04
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/CopyEngine.cpp
@@ -0,0 +1,1253 @@
+/** \file copyEngine.cpp
+\brief Define the copy engine
+\author alpha_one_x86 */
+
+#include <QFileDialog>
+#include <QMessageBox>
+#include <cmath>
+
+#include "CopyEngine.h"
+#include "FolderExistsDialog.h"
+#include "../../../interface/PluginInterface_CopyEngine.h"
+
+// The cmath header from MSVC does not contain round()
+#if (defined(_WIN64) || defined(_WIN32)) && defined(_MSC_VER)
+inline double round(double d) {
+ return floor( d + 0.5 );
+}
+#endif
+
+CopyEngine::CopyEngine(FacilityInterface * facilityEngine) :
+ ui(new Ui::copyEngineOptions())
+{
+ listThread=new ListThread(facilityEngine);
+ this->facilityEngine = facilityEngine;
+ filters = NULL;
+ renamingRules = NULL;
+
+ blockSize = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE;
+ sequentialBuffer = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*ULTRACOPIER_PLUGIN_DEFAULT_SEQUENTIAL_NUMBER_OF_BLOCK;
+ parallelBuffer = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
+ interface = NULL;
+ tempWidget = NULL;
+ uiIsInstalled = false;
+ dialogIsOpen = false;
+ renameTheOriginalDestination = false;
+ maxSpeed = 0;
+ alwaysDoThisActionForFileExists = FileExists_NotSet;
+ alwaysDoThisActionForFileError = FileError_NotSet;
+ checkDestinationFolderExists = false;
+ stopIt = false;
+ size_for_speed = 0;
+ putAtBottom = 0;
+ forcedMode = false;
+ followTheStrictOrder = false;
+ deletePartiallyTransferredFiles = true;
+ inodeThreads = 16;
+ moveTheWholeFolder = true;
+
+ //implement the SingleShot in this class
+ //timerActionDone.setSingleShot(true);
+ timerActionDone.setInterval(ULTRACOPIER_PLUGIN_TIME_UPDATE_TRASNFER_LIST);
+ //timerProgression.setSingleShot(true);
+ timerProgression.setInterval(ULTRACOPIER_PLUGIN_TIME_UPDATE_PROGRESSION);
+
+ timerUpdateMount.setInterval(ULTRACOPIER_PLUGIN_TIME_UPDATE_MOUNT_MS);
+}
+
+CopyEngine::~CopyEngine()
+{
+ /*if(filters!=NULL)
+ delete filters;
+ if(renamingRules!=NULL)
+ delete renamingRules;
+ destroyed by the widget parent, here the interface
+ */
+ stopIt=true;
+ delete listThread;
+ delete ui;
+}
+
+void CopyEngine::connectTheSignalsSlots()
+{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ debugDialogWindow.show();
+ #endif
+ if(!connect(listThread,&ListThread::actionInProgess, this,&CopyEngine::actionInProgess, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect actionInProgess()");
+ if(!connect(listThread,&ListThread::actionInProgess, this,&CopyEngine::newActionInProgess, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect actionInProgess() to slot");
+ if(!connect(listThread,&ListThread::newFolderListing, this,&CopyEngine::newFolderListing, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect newFolderListing()");
+ if(!connect(listThread,&ListThread::isInPause, this,&CopyEngine::isInPause, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect isInPause()");
+ if(!connect(listThread,&ListThread::error, this,&CopyEngine::error, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect error()");
+ if(!connect(listThread,&ListThread::rmPath, this,&CopyEngine::rmPath, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect rmPath()");
+ if(!connect(listThread,&ListThread::mkPath, this,&CopyEngine::mkPath, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect mkPath()");
+ if(!connect(listThread,&ListThread::newActionOnList, this,&CopyEngine::newActionOnList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect newActionOnList()");
+ if(!connect(listThread,&ListThread::doneTime, this,&CopyEngine::doneTime, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect doneTime()");
+ if(!connect(listThread,&ListThread::pushFileProgression, this,&CopyEngine::pushFileProgression, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect pushFileProgression()");
+ if(!connect(listThread,&ListThread::pushGeneralProgression, this,&CopyEngine::pushGeneralProgression, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect pushGeneralProgression()");
+ if(!connect(listThread,&ListThread::syncReady, this,&CopyEngine::syncReady, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect syncReady()");
+ if(!connect(listThread,&ListThread::canBeDeleted, this,&CopyEngine::canBeDeleted, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect canBeDeleted()");
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ if(!connect(listThread,&ListThread::debugInformation, this,&CopyEngine::debugInformation, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect debugInformation()");
+ #endif
+
+ if(!connect(listThread,&ListThread::send_fileAlreadyExists, this,&CopyEngine::fileAlreadyExistsSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_fileAlreadyExists()");
+ if(!connect(listThread,&ListThread::send_errorOnFile, this,&CopyEngine::errorOnFileSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_errorOnFile()");
+ if(!connect(listThread,&ListThread::send_folderAlreadyExists, this,&CopyEngine::folderAlreadyExistsSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_folderAlreadyExists()");
+ if(!connect(listThread,&ListThread::send_errorOnFolder, this,&CopyEngine::errorOnFolderSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_errorOnFolder()");
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ if(!connect(listThread,&ListThread::updateTheDebugInfo, this,&CopyEngine::updateTheDebugInfo, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect updateTheDebugInfo()");
+ #endif
+ if(!connect(listThread,&ListThread::errorTransferList, this,&CopyEngine::errorTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect errorTransferList()");
+ if(!connect(listThread,&ListThread::warningTransferList, this,&CopyEngine::warningTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect warningTransferList()");
+ if(!connect(listThread,&ListThread::mkPathErrorOnFolder, this,&CopyEngine::mkPathErrorOnFolderSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect mkPathErrorOnFolder()");
+ if(!connect(listThread,&ListThread::send_realBytesTransfered, this,&CopyEngine::get_realBytesTransfered, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_realBytesTransfered()");
+
+ if(!connect(this,&CopyEngine::tryCancel, listThread,&ListThread::cancel, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect tryCancel()");
+ if(!connect(this,&CopyEngine::getNeedPutAtBottom, listThread,&ListThread::getNeedPutAtBottom, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect getNeedPutAtBottom()");
+ if(!connect(listThread,&ListThread::haveNeedPutAtBottom, this,&CopyEngine::haveNeedPutAtBottom, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect haveNeedPutAtBottom()");
+
+
+ if(!connect(this,&CopyEngine::signal_pause, listThread,&ListThread::pause, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_pause()");
+ if(!connect(this,&CopyEngine::signal_exportErrorIntoTransferList,listThread,&ListThread::exportErrorIntoTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_exportErrorIntoTransferList()");
+ if(!connect(this,&CopyEngine::signal_resume, listThread,&ListThread::resume, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_resume()");
+ if(!connect(this,&CopyEngine::signal_skip, listThread,&ListThread::skip, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_skip()");
+ if(!connect(this,&CopyEngine::signal_setCollisionAction, listThread,&ListThread::setAlwaysFileExistsAction, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_setCollisionAction()");
+ if(!connect(this,&CopyEngine::signal_setTransferAlgorithm, listThread,&ListThread::setTransferAlgorithm, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_setCollisionAction()");
+ if(!connect(this,&CopyEngine::signal_setFolderCollision, listThread,&ListThread::setFolderCollision, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_setFolderCollision()");
+ if(!connect(this,&CopyEngine::signal_removeItems, listThread,&ListThread::removeItems, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_removeItems()");
+ if(!connect(this,&CopyEngine::signal_moveItemsOnTop, listThread,&ListThread::moveItemsOnTop, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_moveItemsOnTop()");
+ if(!connect(this,&CopyEngine::signal_moveItemsUp, listThread,&ListThread::moveItemsUp, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_moveItemsUp()");
+ if(!connect(this,&CopyEngine::signal_moveItemsDown, listThread,&ListThread::moveItemsDown, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_moveItemsDown()");
+ if(!connect(this,&CopyEngine::signal_moveItemsOnBottom, listThread,&ListThread::moveItemsOnBottom, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_moveItemsOnBottom()");
+ if(!connect(this,&CopyEngine::signal_exportTransferList, listThread,&ListThread::exportTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_exportTransferList()");
+ if(!connect(this,&CopyEngine::signal_importTransferList, listThread,&ListThread::importTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_importTransferList()");
+ if(!connect(this,&CopyEngine::signal_forceMode, listThread,&ListThread::forceMode, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_forceMode()");
+ if(!connect(this,&CopyEngine::send_osBufferLimit, listThread,&ListThread::set_osBufferLimit, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_osBufferLimit()");
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ if(!connect(this,&CopyEngine::send_speedLimitation, listThread,&ListThread::setSpeedLimitation, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_speedLimitation()");
+ #endif
+ if(!connect(this,&CopyEngine::send_blockSize, listThread,&ListThread::setBlockSize, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_blockSize()");
+ if(!connect(this,&CopyEngine::send_parallelBuffer, listThread,&ListThread::setParallelBuffer, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setParallelBuffer()");
+ if(!connect(this,&CopyEngine::send_sequentialBuffer, listThread,&ListThread::setSequentialBuffer, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setSequentialBuffer()");
+ if(!connect(this,&CopyEngine::send_parallelizeIfSmallerThan, listThread,&ListThread::setParallelizeIfSmallerThan, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setParallelizeIfSmallerThan()");
+ if(!connect(this,&CopyEngine::send_moveTheWholeFolder, listThread,&ListThread::setMoveTheWholeFolder, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect moveTheWholeFolder()");
+ if(!connect(this,&CopyEngine::send_deletePartiallyTransferredFiles, listThread,&ListThread::setDeletePartiallyTransferredFiles, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect deletePartiallyTransferredFiles()");
+ if(!connect(this,&CopyEngine::send_setRenameTheOriginalDestination, listThread,&ListThread::setRenameTheOriginalDestination, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setRenameTheOriginalDestination()");
+ if(!connect(this,&CopyEngine::send_setInodeThreads, listThread,&ListThread::setInodeThreads, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setInodeThreads()");
+ if(!connect(this,&CopyEngine::send_followTheStrictOrder, listThread,&ListThread::setFollowTheStrictOrder, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect followTheStrictOrder()");
+ if(!connect(this,&CopyEngine::send_setFilters,listThread,&ListThread::set_setFilters, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_setFilters()");
+ if(!connect(this,&CopyEngine::send_sendNewRenamingRules,listThread,&ListThread::set_sendNewRenamingRules, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_sendNewRenamingRules()");
+ if(!connect(&timerActionDone,&QTimer::timeout, listThread,&ListThread::sendActionDone))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect timerActionDone");
+ if(!connect(&timerProgression,&QTimer::timeout, listThread,&ListThread::sendProgression))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect timerProgression");
+ if(!connect(listThread,&ListThread::missingDiskSpace, this,&CopyEngine::missingDiskSpace,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect timerProgression");
+
+ if(!connect(this,&CopyEngine::queryOneNewDialog,this,&CopyEngine::showOneNewDialog,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect queryOneNewDialog()");
+ if(!connect(listThread,&ListThread::errorToRetry,this,&CopyEngine::errorToRetry,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect errorToRetry()");
+
+ if(!connect(&timerUpdateMount,&QTimer::timeout,listThread,&ListThread::set_updateMount, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect set_updateMount()");
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+void CopyEngine::updateTheDebugInfo(const std::vector<std::string> &newList, const std::vector<std::string> &newList2, const int &numberOfInodeOperation)
+{
+ debugDialogWindow.setTransferThreadList(newList);
+ debugDialogWindow.setTransferList(newList2);
+ debugDialogWindow.setInodeUsage(numberOfInodeOperation);
+}
+#endif
+
+//to send the options panel
+bool CopyEngine::getOptionsEngine(QWidget * tempWidget)
+{
+ this->tempWidget=tempWidget;
+ ui->setupUi(tempWidget);
+ ui->toolBox->setCurrentIndex(0);
+ ui->blockSize->setMaximum(ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE);
+ connect(tempWidget, &QWidget::destroyed, this, &CopyEngine::resetTempWidget);
+ //conect the ui widget
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ if(!setSpeedLimitation(maxSpeed))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the speed limitation");
+ #endif
+
+ //here else, the default settings can't be loaded
+ uiIsInstalled=true;
+
+ setBlockSize(blockSize);
+ setSequentialBuffer(sequentialBuffer);
+ setParallelBuffer(parallelBuffer);
+ setAutoStart(autoStart);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ setRsync(rsync);
+ #else
+ ui->label_rsync->setVisible(false);
+ ui->rsync->setVisible(false);
+ #endif
+ setCheckDestinationFolderExists(checkDestinationFolderExists);
+ set_doChecksum(doChecksum);
+ set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+ set_checksumOnlyOnError(checksumOnlyOnError);
+ set_osBuffer(osBuffer);
+ set_osBufferLimited(osBufferLimited);
+ set_osBufferLimit(osBufferLimit);
+ setRightTransfer(doRightTransfer);
+ setKeepDate(keepDate);
+ setParallelizeIfSmallerThan(parallelizeIfSmallerThan);
+ setFollowTheStrictOrder(followTheStrictOrder);
+ setDeletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
+ setInodeThreads(inodeThreads);
+ setRenameTheOriginalDestination(renameTheOriginalDestination);
+ setMoveTheWholeFolder(moveTheWholeFolder);
+ setCheckDiskSpace(checkDiskSpace);
+ setDefaultDestinationFolder(defaultDestinationFolder);
+
+ switch(alwaysDoThisActionForFileExists)
+ {
+ case FileExists_NotSet:
+ ui->comboBoxFileCollision->setCurrentIndex(0);
+ break;
+ case FileExists_Skip:
+ ui->comboBoxFileCollision->setCurrentIndex(1);
+ break;
+ case FileExists_Overwrite:
+ ui->comboBoxFileCollision->setCurrentIndex(2);
+ break;
+ case FileExists_OverwriteIfNotSame:
+ ui->comboBoxFileCollision->setCurrentIndex(3);
+ break;
+ case FileExists_OverwriteIfNewer:
+ ui->comboBoxFileCollision->setCurrentIndex(4);
+ break;
+ case FileExists_OverwriteIfOlder:
+ ui->comboBoxFileCollision->setCurrentIndex(5);
+ break;
+ case FileExists_Rename:
+ ui->comboBoxFileCollision->setCurrentIndex(6);
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ ui->comboBoxFileCollision->setCurrentIndex(0);
+ break;
+ }
+ switch(alwaysDoThisActionForFileError)
+ {
+ case FileError_NotSet:
+ ui->comboBoxFileError->setCurrentIndex(0);
+ break;
+ case FileError_Skip:
+ ui->comboBoxFileError->setCurrentIndex(1);
+ break;
+ case FileError_PutToEndOfTheList:
+ ui->comboBoxFileError->setCurrentIndex(2);
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ ui->comboBoxFileError->setCurrentIndex(0);
+ break;
+ }
+ switch(alwaysDoThisActionForFolderExists)
+ {
+ case FolderExists_NotSet:
+ ui->comboBoxFolderCollision->setCurrentIndex(0);
+ break;
+ case FolderExists_Merge:
+ ui->comboBoxFolderCollision->setCurrentIndex(1);
+ break;
+ case FolderExists_Skip:
+ ui->comboBoxFolderCollision->setCurrentIndex(2);
+ break;
+ case FolderExists_Rename:
+ ui->comboBoxFolderCollision->setCurrentIndex(3);
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ ui->comboBoxFolderCollision->setCurrentIndex(0);
+ break;
+ }
+ switch(alwaysDoThisActionForFolderError)
+ {
+ case FileError_NotSet:
+ ui->comboBoxFolderError->setCurrentIndex(0);
+ break;
+ case FileError_Skip:
+ ui->comboBoxFolderError->setCurrentIndex(1);
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored: "+std::to_string(alwaysDoThisActionForFolderError));
+ ui->comboBoxFolderError->setCurrentIndex(0);
+ break;
+ }
+ switch(transferAlgorithm)
+ {
+ case TransferAlgorithm_Automatic:
+ ui->transferAlgorithm->setCurrentIndex(0);
+ break;
+ case TransferAlgorithm_Sequential:
+ ui->transferAlgorithm->setCurrentIndex(1);
+ break;
+ case TransferAlgorithm_Parallel:
+ ui->transferAlgorithm->setCurrentIndex(2);
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ ui->transferAlgorithm->setCurrentIndex(0);
+ break;
+ }
+ return true;
+}
+
+//to have interface widget to do modal dialog
+void CopyEngine::setInterfacePointer(QWidget * interface)
+{
+ this->interface=interface;
+ filters=new Filters(tempWidget);
+ renamingRules=new RenamingRules(tempWidget);
+
+ if(uiIsInstalled)
+ {
+ connect(ui->doRightTransfer, &QCheckBox::toggled, this,&CopyEngine::setRightTransfer);
+ connect(ui->keepDate, &QCheckBox::toggled, this,&CopyEngine::setKeepDate);
+ connect(ui->blockSize, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setBlockSize);
+ connect(ui->autoStart, &QCheckBox::toggled, this,&CopyEngine::setAutoStart);
+ connect(ui->doChecksum, &QCheckBox::toggled, this,&CopyEngine::doChecksum_toggled);
+ connect(ui->checksumIgnoreIfImpossible, &QCheckBox::toggled, this,&CopyEngine::checksumIgnoreIfImpossible_toggled);
+ connect(ui->checksumOnlyOnError, &QCheckBox::toggled, this,&CopyEngine::checksumOnlyOnError_toggled);
+ connect(ui->osBuffer, &QCheckBox::toggled, this,&CopyEngine::osBuffer_toggled);
+ connect(ui->osBufferLimited, &QCheckBox::toggled, this,&CopyEngine::osBufferLimited_toggled);
+ connect(ui->osBufferLimit, &QSpinBox::editingFinished, this,&CopyEngine::osBufferLimit_editingFinished);
+ connect(ui->moveTheWholeFolder, &QCheckBox::toggled, this,&CopyEngine::setMoveTheWholeFolder);
+ connect(ui->deletePartiallyTransferredFiles, &QCheckBox::toggled, this,&CopyEngine::setDeletePartiallyTransferredFiles);
+ connect(ui->followTheStrictOrder, &QCheckBox::toggled, this,&CopyEngine::setFollowTheStrictOrder);
+ connect(ui->checkBoxDestinationFolderExists, &QCheckBox::toggled, this,&CopyEngine::setCheckDestinationFolderExists);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ connect(ui->rsync, &QCheckBox::toggled, this,&CopyEngine::setRsync);
+ #endif
+ connect(ui->renameTheOriginalDestination, &QCheckBox::toggled, this,&CopyEngine::setRenameTheOriginalDestination);
+ connect(filters, &Filters::haveNewFilters, this,&CopyEngine::sendNewFilters);
+ connect(ui->filters, &QPushButton::clicked, this,&CopyEngine::showFilterDialog);
+ connect(ui->inodeThreads, &QSpinBox::editingFinished, this,&CopyEngine::inodeThreadsFinished);
+ connect(ui->inodeThreads, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setInodeThreads);
+ connect(ui->defaultDestinationFolderBrowse, &QPushButton::clicked, this,&CopyEngine::defaultDestinationFolderBrowse);
+
+ connect(ui->sequentialBuffer, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setSequentialBuffer);
+ connect(ui->parallelBuffer, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setParallelBuffer);
+ connect(ui->parallelizeIfSmallerThan, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setParallelizeIfSmallerThan);
+ connect(ui->comboBoxFolderError, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setFolderError);
+ connect(ui->comboBoxFolderCollision, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setFolderCollision);
+ connect(ui->comboBoxFileError, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setFileError);
+ connect(ui->comboBoxFileCollision, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setFileCollision);
+ connect(ui->transferAlgorithm, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setTransferAlgorithm);
+
+ if(!connect(renamingRules,&RenamingRules::sendNewRenamingRules,this,&CopyEngine::sendNewRenamingRules))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect sendNewRenamingRules()");
+ if(!connect(ui->renamingRules,&QPushButton::clicked,this,&CopyEngine::showRenamingRules))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect renamingRules.clicked()");
+ }
+
+ filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ set_setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+
+ renamingRules->setRenamingRules(firstRenamingRule,otherRenamingRule);
+ emit send_sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+bool CopyEngine::haveSameSource(const std::vector<std::string> &sources)
+{
+ return listThread->haveSameSource(sources);
+}
+
+bool CopyEngine::haveSameDestination(const std::string &destination)
+{
+ return listThread->haveSameDestination(destination);
+}
+
+bool CopyEngine::newCopy(const std::vector<std::string> &sources)
+{
+ if(forcedMode && mode!=Ultracopier::Copy)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to move, you can't copy with it");
+ QMessageBox::critical(NULL,QString::fromStdString(facilityEngine->translateText("Internal error")),tr("The engine is forced to move, you can't copy with it"));
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ std::string destination;
+ if(!defaultDestinationFolder.empty() && QDir(QString::fromStdString(defaultDestinationFolder)).exists())
+ destination = defaultDestinationFolder;
+ else
+ destination = askDestination();
+ if(destination.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Canceled by the user");
+ return false;
+ }
+ return listThread->newCopy(sources,destination);
+}
+
+bool CopyEngine::newCopy(const std::vector<std::string> &sources,const std::string &destination)
+{
+ if(forcedMode && mode!=Ultracopier::Copy)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to move, you can't copy with it");
+ QMessageBox::critical(NULL,QString::fromStdString(facilityEngine->translateText("Internal error")),tr("The engine is forced to move, you can't copy with it"));
+ return false;
+ }
+ return listThread->newCopy(sources,destination);
+}
+
+bool CopyEngine::newMove(const std::vector<std::string> &sources)
+{
+ if(forcedMode && mode!=Ultracopier::Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to copy, you can't move with it");
+ QMessageBox::critical(NULL,QString::fromStdString(facilityEngine->translateText("Internal error")),tr("The engine is forced to copy, you can't move with it"));
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ std::string destination;
+ if(!ui->defaultDestinationFolder->text().isEmpty() && QDir(ui->defaultDestinationFolder->text()).exists())
+ destination = ui->defaultDestinationFolder->text().toStdString();
+ else
+ destination = askDestination();
+ if(destination.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Canceled by the user");
+ return false;
+ }
+ return listThread->newMove(sources,destination);
+}
+
+bool CopyEngine::newMove(const std::vector<std::string> &sources,const std::string &destination)
+{
+ if(forcedMode && mode!=Ultracopier::Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to copy, you can't move with it");
+ QMessageBox::critical(NULL,QString::fromStdString(facilityEngine->translateText("Internal error")),tr("The engine is forced to copy, you can't move with it"));
+ return false;
+ }
+ return listThread->newMove(sources,destination);
+}
+
+void CopyEngine::defaultDestinationFolderBrowse()
+{
+ std::string destination = askDestination();
+ if(destination.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Canceled by the user");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(uiIsInstalled)
+ ui->defaultDestinationFolder->setText(QString::fromStdString(destination));
+}
+
+std::string CopyEngine::askDestination()
+{
+ std::string destination = listThread->getUniqueDestinationFolder();
+ if(!destination.empty())
+ {
+ QMessageBox::StandardButton button=QMessageBox::question(interface,tr("Destination"),tr("Use the actual destination \"%1\"?")
+ .arg(QString::fromStdString(destination)),
+ QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes);
+ if(button==QMessageBox::Yes)
+ return destination;
+ }
+ destination=QFileDialog::getExistingDirectory(interface,QString::fromStdString(facilityEngine->translateText("Select destination directory")),QStringLiteral(""),QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks).toStdString();
+ return destination;
+}
+
+void CopyEngine::newTransferList(const std::string &file)
+{
+ emit signal_importTransferList(file);
+}
+
+//because direct access to list thread into the main thread can't be do
+uint64_t CopyEngine::realByteTransfered()
+{
+ return size_for_speed;
+}
+
+//speed limitation
+bool CopyEngine::supportSpeedLimitation() const
+{
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ return true;
+ #else
+ return false;
+ #endif
+}
+
+/** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+void CopyEngine::syncTransferList()
+{
+ listThread->syncTransferList();
+}
+
+void CopyEngine::set_doChecksum(bool doChecksum)
+{
+ listThread->set_doChecksum(doChecksum);
+ if(uiIsInstalled)
+ {
+ ui->doChecksum->setChecked(doChecksum);
+ ui->checksumOnlyOnError->setEnabled(ui->doChecksum->isChecked());
+ ui->checksumIgnoreIfImpossible->setEnabled(ui->doChecksum->isChecked());
+ }
+ this->doChecksum=doChecksum;
+}
+
+void CopyEngine::set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible)
+{
+ listThread->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+ if(uiIsInstalled)
+ ui->checksumIgnoreIfImpossible->setChecked(checksumIgnoreIfImpossible);
+ this->checksumIgnoreIfImpossible=checksumIgnoreIfImpossible;
+}
+
+void CopyEngine::set_checksumOnlyOnError(bool checksumOnlyOnError)
+{
+ listThread->set_checksumOnlyOnError(checksumOnlyOnError);
+ if(uiIsInstalled)
+ ui->checksumOnlyOnError->setChecked(checksumOnlyOnError);
+ this->checksumOnlyOnError=checksumOnlyOnError;
+}
+
+void CopyEngine::set_osBuffer(bool osBuffer)
+{
+ listThread->set_osBuffer(osBuffer);
+ if(uiIsInstalled)
+ {
+ ui->osBuffer->setChecked(osBuffer);
+ updateBufferCheckbox();
+ }
+ this->osBuffer=osBuffer;
+}
+
+void CopyEngine::set_osBufferLimited(bool osBufferLimited)
+{
+ listThread->set_osBufferLimited(osBufferLimited);
+ if(uiIsInstalled)
+ {
+ ui->osBufferLimited->setChecked(osBufferLimited);
+ updateBufferCheckbox();
+ }
+ this->osBufferLimited=osBufferLimited;
+}
+
+void CopyEngine::set_osBufferLimit(unsigned int osBufferLimit)
+{
+ emit send_osBufferLimit(osBufferLimit);
+ if(uiIsInstalled)
+ ui->osBufferLimit->setValue(osBufferLimit);
+ this->osBufferLimit=osBufferLimit;
+}
+
+void CopyEngine::updateBufferCheckbox()
+{
+ ui->osBufferLimited->setEnabled(ui->osBuffer->isChecked());
+ ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
+}
+
+void CopyEngine::set_setFilters(std::vector<std::string> includeStrings,std::vector<std::string> includeOptions,std::vector<std::string> excludeStrings,std::vector<std::string> excludeOptions)
+{
+ if(filters!=NULL)
+ {
+ filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ emit send_setFilters(filters->getInclude(),filters->getExclude());
+ }
+ this->includeStrings=includeStrings;
+ this->includeOptions=includeOptions;
+ this->excludeStrings=excludeStrings;
+ this->excludeOptions=excludeOptions;
+}
+
+void CopyEngine::setRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule)
+{
+ sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+bool CopyEngine::userAddFolder(const Ultracopier::CopyMode &mode)
+{
+ std::string source = QFileDialog::getExistingDirectory(interface,QString::fromStdString(facilityEngine->translateText("Select source directory")),
+ QStringLiteral(""),
+ QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks).toStdString();
+ if(source.empty() || source=="")
+ return false;
+ std::vector<std::string> sources;
+ sources.push_back(source);
+ if(mode==Ultracopier::Copy)
+ return newCopy(sources);
+ else
+ return newMove(sources);
+}
+
+bool CopyEngine::userAddFile(const Ultracopier::CopyMode &mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QStringList sources = QFileDialog::getOpenFileNames(
+ interface,
+ QString::fromStdString(facilityEngine->translateText("Select one or more files to open")),
+ QStringLiteral(""),
+ QString::fromStdString(facilityEngine->translateText("All files"))+QStringLiteral(" (*)"));
+
+ std::vector<std::string> sourcesstd;
+ unsigned int index=0;
+ while(index<(unsigned int)sources.size())
+ {
+ sourcesstd.push_back(sources.at(index).toStdString());
+ index++;
+ }
+
+ if(sourcesstd.empty())
+ return false;
+ if(mode==Ultracopier::Copy)
+ return newCopy(sourcesstd);
+ else
+ return newMove(sourcesstd);
+}
+
+void CopyEngine::pause()
+{
+ emit signal_pause();
+}
+
+void CopyEngine::resume()
+{
+ emit signal_resume();
+}
+
+void CopyEngine::skip(const uint64_t &id)
+{
+ emit signal_skip(id);
+}
+
+void CopyEngine::cancel()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ stopIt=true;
+ timerProgression.stop();
+ timerActionDone.stop();
+ emit tryCancel();
+}
+
+void CopyEngine::removeItems(const std::vector<uint64_t> &ids)
+{
+ emit signal_removeItems(ids);
+}
+
+void CopyEngine::moveItemsOnTop(const std::vector<uint64_t> &ids)
+{
+ emit signal_moveItemsOnTop(ids);
+}
+
+void CopyEngine::moveItemsUp(const std::vector<uint64_t> &ids)
+{
+ emit signal_moveItemsUp(ids);
+}
+
+void CopyEngine::moveItemsDown(const std::vector<uint64_t> &ids)
+{
+ emit signal_moveItemsDown(ids);
+}
+
+void CopyEngine::moveItemsOnBottom(const std::vector<uint64_t> &ids)
+{
+ emit signal_moveItemsOnBottom(ids);
+}
+
+/** \brief give the forced mode, to export/import transfer list */
+void CopyEngine::forceMode(const Ultracopier::CopyMode &mode)
+{
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(mode==Ultracopier::Move)
+ {
+ listThread->setRsync(false);
+ rsync=false;
+ }
+ if(uiIsInstalled)
+ ui->rsync->setEnabled(mode==Ultracopier::Copy);
+ #endif
+ if(forcedMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Mode forced previously");
+ QMessageBox::critical(NULL,QString::fromStdString(facilityEngine->translateText("Internal error")),tr("The mode has been forced previously. This is an internal error, please report it"));
+ return;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(mode==Ultracopier::Move)
+ rsync=false;
+ #endif
+ if(mode==Ultracopier::Copy)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Force mode to copy");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Force mode to move");
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(uiIsInstalled)
+ ui->rsync->setEnabled(mode==Ultracopier::Copy);
+ #endif
+ this->mode=mode;
+ forcedMode=true;
+ emit signal_forceMode(mode);
+}
+
+void CopyEngine::exportTransferList()
+{
+ std::string fileName = QFileDialog::getSaveFileName(interface,QString::fromStdString(facilityEngine->translateText("Save transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
+ if(fileName.empty())
+ return;
+ emit signal_exportTransferList(fileName);
+}
+
+void CopyEngine::importTransferList()
+{
+ std::string fileName = QFileDialog::getOpenFileName(interface,QString::fromStdString(facilityEngine->translateText("Open transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
+ if(fileName.empty())
+ return;
+ emit signal_importTransferList(fileName);
+}
+
+void CopyEngine::warningTransferList(const std::string &warning)
+{
+ QMessageBox::warning(interface,QString::fromStdString(facilityEngine->translateText("Error")),QString::fromStdString(warning));
+}
+
+void CopyEngine::errorTransferList(const std::string &error)
+{
+ QMessageBox::critical(interface,QString::fromStdString(facilityEngine->translateText("Error")),QString::fromStdString(error));
+}
+
+bool CopyEngine::setSpeedLimitation(const int64_t &speedLimitation)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"maxSpeed: "+std::to_string(speedLimitation));
+ maxSpeed=speedLimitation;
+ emit send_speedLimitation(speedLimitation);
+ return true;
+}
+
+void CopyEngine::setFileCollision(int index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
+ if(uiIsInstalled)
+ if(index!=ui->comboBoxFileCollision->currentIndex())
+ ui->comboBoxFileCollision->setCurrentIndex(index);
+ switch(index)
+ {
+ case 0:
+ alwaysDoThisActionForFileExists=FileExists_NotSet;
+ break;
+ case 1:
+ alwaysDoThisActionForFileExists=FileExists_Skip;
+ break;
+ case 2:
+ alwaysDoThisActionForFileExists=FileExists_Overwrite;
+ break;
+ case 3:
+ alwaysDoThisActionForFileExists=FileExists_OverwriteIfNotSame;
+ break;
+ case 4:
+ alwaysDoThisActionForFileExists=FileExists_OverwriteIfNewer;
+ break;
+ case 5:
+ alwaysDoThisActionForFileExists=FileExists_OverwriteIfOlder;
+ break;
+ case 6:
+ alwaysDoThisActionForFileExists=FileExists_Rename;
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ alwaysDoThisActionForFileExists=FileExists_NotSet;
+ break;
+ }
+ emit signal_setCollisionAction(alwaysDoThisActionForFileExists);
+}
+
+void CopyEngine::setFileError(int index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
+ if(uiIsInstalled)
+ if(index!=ui->comboBoxFileError->currentIndex())
+ ui->comboBoxFileError->setCurrentIndex(index);
+ switch(index)
+ {
+ case 0:
+ alwaysDoThisActionForFileError=FileError_NotSet;
+ break;
+ case 1:
+ alwaysDoThisActionForFileError=FileError_Skip;
+ break;
+ case 2:
+ alwaysDoThisActionForFileError=FileError_PutToEndOfTheList;
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ alwaysDoThisActionForFileError=FileError_NotSet;
+ break;
+ }
+ emit signal_setCollisionAction(alwaysDoThisActionForFileExists);
+}
+
+void CopyEngine::setTransferAlgorithm(int index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
+ if(uiIsInstalled)
+ if(index!=ui->transferAlgorithm->currentIndex())
+ ui->transferAlgorithm->setCurrentIndex(index);
+ switch(index)
+ {
+ case 0:
+ transferAlgorithm=TransferAlgorithm_Automatic;
+ break;
+ case 1:
+ transferAlgorithm=TransferAlgorithm_Sequential;
+ break;
+ case 2:
+ transferAlgorithm=TransferAlgorithm_Parallel;
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ transferAlgorithm=TransferAlgorithm_Automatic;
+ break;
+ }
+ if(transferAlgorithm==TransferAlgorithm_Sequential)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Sequential");
+ else if(transferAlgorithm==TransferAlgorithm_Automatic)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Automatic");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Parallel");
+ emit signal_setTransferAlgorithm(transferAlgorithm);
+}
+
+void CopyEngine::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+ if(uiIsInstalled)
+ ui->doRightTransfer->setChecked(doRightTransfer);
+ listThread->setRightTransfer(doRightTransfer);
+}
+
+//set keep date
+void CopyEngine::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+ if(uiIsInstalled)
+ ui->keepDate->setChecked(keepDate);
+ listThread->setKeepDate(keepDate);
+}
+
+//set block size in KB
+void CopyEngine::setBlockSize(const int blockSize)
+{
+ this->blockSize=blockSize;
+ if(uiIsInstalled)
+ {
+ ui->blockSize->setValue(blockSize);
+ ui->sequentialBuffer->setSingleStep(blockSize);
+ ui->parallelBuffer->setSingleStep(blockSize);
+ }
+ emit send_blockSize(blockSize);
+ updatedBlockSize();
+}
+
+void CopyEngine::setParallelBuffer(int parallelBuffer)
+{
+ parallelBuffer=round((float)parallelBuffer/(float)blockSize)*blockSize;
+ this->parallelBuffer=parallelBuffer;
+ if(uiIsInstalled)
+ ui->parallelBuffer->setValue(parallelBuffer);
+ emit send_parallelBuffer(parallelBuffer/blockSize);
+}
+
+void CopyEngine::setSequentialBuffer(int sequentialBuffer)
+{
+ sequentialBuffer=round((float)sequentialBuffer/(float)blockSize)*blockSize;
+ this->sequentialBuffer=sequentialBuffer;
+ if(uiIsInstalled)
+ ui->sequentialBuffer->setValue(sequentialBuffer);
+ emit send_sequentialBuffer(sequentialBuffer/blockSize);
+}
+
+void CopyEngine::setParallelizeIfSmallerThan(int parallelizeIfSmallerThan)
+{
+ this->parallelizeIfSmallerThan=parallelizeIfSmallerThan;
+ if(uiIsInstalled)
+ ui->parallelizeIfSmallerThan->setValue(parallelizeIfSmallerThan);
+ emit send_parallelizeIfSmallerThan(parallelizeIfSmallerThan*1024);
+}
+
+void CopyEngine::setMoveTheWholeFolder(const bool &moveTheWholeFolder)
+{
+ this->moveTheWholeFolder=moveTheWholeFolder;
+ if(uiIsInstalled)
+ ui->moveTheWholeFolder->setChecked(moveTheWholeFolder);
+ emit send_moveTheWholeFolder(moveTheWholeFolder);
+}
+
+void CopyEngine::setFollowTheStrictOrder(const bool &followTheStrictOrder)
+{
+ this->followTheStrictOrder=followTheStrictOrder;
+ if(uiIsInstalled)
+ ui->followTheStrictOrder->setChecked(followTheStrictOrder);
+ emit send_followTheStrictOrder(followTheStrictOrder);
+}
+
+void CopyEngine::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
+{
+ this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
+ if(uiIsInstalled)
+ ui->deletePartiallyTransferredFiles->setChecked(deletePartiallyTransferredFiles);
+ emit send_deletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
+}
+
+void CopyEngine::setInodeThreads(const int &inodeThreads)
+{
+ this->inodeThreads=inodeThreads;
+ if(uiIsInstalled)
+ ui->inodeThreads->setValue(inodeThreads);
+ emit send_setInodeThreads(inodeThreads);
+}
+
+void CopyEngine::setRenameTheOriginalDestination(const bool &renameTheOriginalDestination)
+{
+ this->renameTheOriginalDestination=renameTheOriginalDestination;
+ if(uiIsInstalled)
+ ui->renameTheOriginalDestination->setChecked(renameTheOriginalDestination);
+ emit send_setRenameTheOriginalDestination(renameTheOriginalDestination);
+}
+
+void CopyEngine::inodeThreadsFinished()
+{
+ this->inodeThreads=ui->inodeThreads->value();
+ emit send_setInodeThreads(inodeThreads);
+}
+
+//set auto start
+void CopyEngine::setAutoStart(const bool autoStart)
+{
+ this->autoStart=autoStart;
+ if(uiIsInstalled)
+ ui->autoStart->setChecked(autoStart);
+ listThread->setAutoStart(autoStart);
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+/// \brief set rsync
+void CopyEngine::setRsync(const bool rsync)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set rsync: "+std::to_string(rsync));
+ this->rsync=rsync;
+ if(uiIsInstalled)
+ {
+ ui->rsync->setChecked(rsync);
+ ui->rsync->setEnabled(forcedMode && mode==Ultracopier::Copy);
+ ui->label_rsync->setEnabled(forcedMode && mode==Ultracopier::Copy);
+ }
+ listThread->setRsync(rsync);
+}
+#endif
+
+//set check destination folder
+void CopyEngine::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+{
+ this->checkDestinationFolderExists=checkDestinationFolderExists;
+ if(uiIsInstalled)
+ ui->checkBoxDestinationFolderExists->setChecked(checkDestinationFolderExists);
+ listThread->setCheckDestinationFolderExists(checkDestinationFolderExists);
+}
+
+//reset widget
+void CopyEngine::resetTempWidget()
+{
+ uiIsInstalled=false;
+ tempWidget=NULL;
+}
+
+void CopyEngine::setFolderCollision(int index)
+{
+ switch(index)
+ {
+ case 0:
+ setComboBoxFolderCollision(FolderExists_NotSet,false);
+ break;
+ case 1:
+ setComboBoxFolderCollision(FolderExists_Merge,false);
+ break;
+ case 2:
+ setComboBoxFolderCollision(FolderExists_Skip,false);
+ break;
+ case 3:
+ setComboBoxFolderCollision(FolderExists_Rename,false);
+ break;
+ }
+}
+
+void CopyEngine::setFolderError(int index)
+{
+ switch(index)
+ {
+ case 0:
+ setComboBoxFolderError(FileError_NotSet,false);
+ break;
+ case 1:
+ setComboBoxFolderError(FileError_Skip,false);
+ break;
+ }
+}
+
+//set the translate
+void CopyEngine::newLanguageLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, retranslate the widget options");
+ if(tempWidget!=NULL)
+ {
+ ui->retranslateUi(tempWidget);
+ ui->comboBoxFolderError->setItemText(0,tr("Ask"));
+ ui->comboBoxFolderError->setItemText(1,tr("Skip"));
+
+ ui->comboBoxFolderCollision->setItemText(0,tr("Ask"));
+ ui->comboBoxFolderCollision->setItemText(1,tr("Merge"));
+ ui->comboBoxFolderCollision->setItemText(2,tr("Skip"));
+ ui->comboBoxFolderCollision->setItemText(3,tr("Rename"));
+
+ ui->comboBoxFileError->setItemText(0,tr("Ask"));
+ ui->comboBoxFileError->setItemText(1,tr("Skip"));
+ ui->comboBoxFileError->setItemText(2,tr("Put at the end"));
+
+ ui->comboBoxFileCollision->setItemText(0,tr("Ask"));
+ ui->comboBoxFileCollision->setItemText(1,tr("Skip"));
+ ui->comboBoxFileCollision->setItemText(2,tr("Overwrite"));
+ ui->comboBoxFileCollision->setItemText(3,tr("Overwrite if different"));
+ ui->comboBoxFileCollision->setItemText(4,tr("Overwrite if newer"));
+ ui->comboBoxFileCollision->setItemText(5,tr("Overwrite if older"));
+ ui->comboBoxFileCollision->setItemText(6,tr("Rename"));
+
+ ui->transferAlgorithm->setItemText(0,tr("Automatic"));
+ ui->transferAlgorithm->setItemText(1,tr("Sequential"));
+ ui->transferAlgorithm->setItemText(2,tr("Parallel"));
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"ui not loaded!");
+}
+
+void CopyEngine::setComboBoxFolderCollision(FolderExistsAction action,bool changeComboBox)
+{
+ alwaysDoThisActionForFolderExists=action;
+ emit signal_setFolderCollision(alwaysDoThisActionForFolderExists);
+ if(!changeComboBox || !uiIsInstalled)
+ return;
+ switch(action)
+ {
+ case FolderExists_Merge:
+ ui->comboBoxFolderCollision->setCurrentIndex(1);
+ break;
+ case FolderExists_Skip:
+ ui->comboBoxFolderCollision->setCurrentIndex(2);
+ break;
+ case FolderExists_Rename:
+ ui->comboBoxFolderCollision->setCurrentIndex(3);
+ break;
+ default:
+ ui->comboBoxFolderCollision->setCurrentIndex(0);
+ break;
+ }
+}
+
+void CopyEngine::setComboBoxFolderError(FileErrorAction action,bool changeComboBox)
+{
+ alwaysDoThisActionForFileError=action;
+ if(!changeComboBox || !uiIsInstalled)
+ return;
+ switch(action)
+ {
+ case FileError_Skip:
+ ui->comboBoxFolderError->setCurrentIndex(1);
+ break;
+ default:
+ ui->comboBoxFolderError->setCurrentIndex(0);
+ break;
+ }
+}
+
+void CopyEngine::doChecksum_toggled(bool doChecksum)
+{
+ listThread->set_doChecksum(doChecksum);
+}
+
+void CopyEngine::checksumOnlyOnError_toggled(bool checksumOnlyOnError)
+{
+ listThread->set_checksumOnlyOnError(checksumOnlyOnError);
+}
+
+void CopyEngine::checksumIgnoreIfImpossible_toggled(bool checksumIgnoreIfImpossible)
+{
+ listThread->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+}
+
+void CopyEngine::osBuffer_toggled(bool osBuffer)
+{
+ listThread->set_osBuffer(osBuffer);
+ updateBufferCheckbox();
+}
+
+void CopyEngine::osBufferLimited_toggled(bool osBufferLimited)
+{
+ listThread->set_osBufferLimited(osBufferLimited);
+ updateBufferCheckbox();
+}
+
+void CopyEngine::osBufferLimit_editingFinished()
+{
+ emit send_osBufferLimit(ui->osBufferLimit->value());
+}
+
+void CopyEngine::showFilterDialog()
+{
+ if(filters!=NULL)
+ filters->exec();
+}
+
+void CopyEngine::sendNewFilters()
+{
+ if(filters!=NULL)
+ emit send_setFilters(filters->getInclude(),filters->getExclude());
+}
+
+void CopyEngine::sendNewRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"new filter");
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ emit send_sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+void CopyEngine::showRenamingRules()
+{
+ if(renamingRules==NULL)
+ {
+ QMessageBox::critical(NULL,tr("Options error"),tr("Options engine is not loaded. Unable to access the filters"));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"options not loaded");
+ return;
+ }
+ renamingRules->exec();
+}
+
+void CopyEngine::get_realBytesTransfered(quint64 realBytesTransfered)
+{
+ size_for_speed=realBytesTransfered;
+}
+
+void CopyEngine::newActionInProgess(Ultracopier::EngineActionInProgress action)
+{
+ if(action==Ultracopier::Idle)
+ {
+ timerProgression.stop();
+ timerActionDone.stop();
+ }
+ else
+ {
+ timerProgression.start();
+ timerActionDone.start();
+ }
+}
+
+void CopyEngine::updatedBlockSize()
+{
+ if(uiIsInstalled)
+ {
+ ui->sequentialBuffer->setMinimum(ui->blockSize->value());
+ ui->sequentialBuffer->setSingleStep(ui->blockSize->value());
+ ui->sequentialBuffer->setMaximum(ui->blockSize->value()*ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK);
+ ui->parallelBuffer->setMinimum(ui->blockSize->value());
+ ui->parallelBuffer->setSingleStep(ui->blockSize->value());
+ ui->parallelBuffer->setMaximum(ui->blockSize->value()*ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK);
+ }
+ setParallelBuffer(parallelBuffer);
+ setSequentialBuffer(sequentialBuffer);
+}
+
+void CopyEngine::setCheckDiskSpace(const bool &checkDiskSpace)
+{
+ this->checkDiskSpace=checkDiskSpace;
+ if(uiIsInstalled)
+ ui->checkDiskSpace->setChecked(checkDiskSpace);
+ listThread->setCheckDiskSpace(checkDiskSpace);
+}
+
+void CopyEngine::setDefaultDestinationFolder(const std::string &defaultDestinationFolder)
+{
+ this->defaultDestinationFolder=defaultDestinationFolder;
+ if(uiIsInstalled)
+ ui->defaultDestinationFolder->setText(QString::fromStdString(defaultDestinationFolder));
+}
+
+void CopyEngine::setCopyListOrder(const bool &order)
+{
+ listThread->setCopyListOrder(order);
+}
+
+void CopyEngine::exportErrorIntoTransferList()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"exportErrorIntoTransferList");
+ std::string fileName = QFileDialog::getSaveFileName(interface,QString::fromStdString(facilityEngine->translateText("Save transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
+ if(fileName.empty())
+ return;
+ emit signal_exportErrorIntoTransferList(fileName);
+}
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngine.h b/plugins/CopyEngine/Ultracopier/CopyEngine.h
new file mode 100644
index 0000000..e5311d8
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/CopyEngine.h
@@ -0,0 +1,382 @@
+/** \file copyEngine.h
+\brief Define the copy engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QWidget>
+#include <QObject>
+#include <QList>
+#include <vector>
+#include <string>
+#include <QFileInfo>
+#include <QFile>
+#include <QFileDialog>
+#include <QMessageBox>
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "FileErrorDialog.h"
+#include "FileExistsDialog.h"
+#include "FolderExistsDialog.h"
+#include "FileIsSameDialog.h"
+#include "ui_copyEngineOptions.h"
+#include "Environment.h"
+#include "ListThread.h"
+#include "Filters.h"
+#include "RenamingRules.h"
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+#include "DebugDialog.h"
+#include <QTimer>
+#endif
+
+#ifndef COPY_ENGINE_H
+#define COPY_ENGINE_H
+
+namespace Ui {
+ class copyEngineOptions;
+}
+
+/// \brief the implementation of copy engine plugin, manage directly few stuff, else pass to ListThread class.
+class CopyEngine : public PluginInterface_CopyEngine
+{
+ Q_OBJECT
+public:
+ CopyEngine(FacilityInterface * facilityEngine);
+ ~CopyEngine();
+ void connectTheSignalsSlots();
+private:
+ ListThread * listThread;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ DebugDialog debugDialogWindow;
+ #endif
+ QWidget * tempWidget;
+ Ui::copyEngineOptions * ui;
+ bool uiIsInstalled;
+ QWidget * interface;
+ Filters * filters;
+ RenamingRules * renamingRules;
+ FacilityInterface * facilityEngine;
+ uint32_t maxSpeed;
+ bool doRightTransfer;
+ bool keepDate;
+ int blockSize;
+ int parallelBuffer;
+ int sequentialBuffer;
+ int parallelizeIfSmallerThan;
+ bool followTheStrictOrder;
+ bool deletePartiallyTransferredFiles;
+ int inodeThreads;
+ bool renameTheOriginalDestination;
+ bool moveTheWholeFolder;
+ bool autoStart;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ bool rsync;
+ #endif
+ bool checkDestinationFolderExists;
+ FileExistsAction alwaysDoThisActionForFileExists;
+ FileErrorAction alwaysDoThisActionForFileError;
+ FileErrorAction alwaysDoThisActionForFolderError;
+ FolderExistsAction alwaysDoThisActionForFolderExists;
+ TransferAlgorithm transferAlgorithm;
+ bool dialogIsOpen;
+ volatile bool stopIt;
+ std::string defaultDestinationFolder;
+ /// \brief error queue
+ struct errorQueueItem
+ {
+ TransferThread * transfer; ///< NULL if send by scan thread
+ ScanFileOrFolder * scan; ///< NULL if send by transfer thread
+ bool mkPath;
+ bool rmPath;
+ QFileInfo inode;
+ std::string errorString;
+ ErrorType errorType;
+ };
+ std::vector<errorQueueItem> errorQueue;
+ /// \brief already exists queue
+ struct alreadyExistsQueueItem
+ {
+ TransferThread * transfer; ///< NULL if send by scan thread
+ ScanFileOrFolder * scan; ///< NULL if send by transfer thread
+ QFileInfo source;
+ QFileInfo destination;
+ bool isSame;
+ };
+ std::vector<alreadyExistsQueueItem> alreadyExistsQueue;
+ uint64_t size_for_speed;//because direct access to list thread into the main thread can't be do
+ Ultracopier::CopyMode mode;
+ bool forcedMode;
+
+ bool doChecksum;
+ bool checksumIgnoreIfImpossible;
+ bool checksumOnlyOnError;
+ bool osBuffer;
+ bool osBufferLimited;
+ bool checkDiskSpace;
+ unsigned int osBufferLimit;
+ std::vector<std::string> includeStrings,includeOptions,excludeStrings,excludeOptions;
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+
+ //send action done timer
+ QTimer timerActionDone;
+ //send progression timer
+ QTimer timerProgression;
+
+ QTimer timerUpdateMount;
+ int putAtBottom;//to keep how many automatic put at bottom have been used
+private slots:
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ void updateTheDebugInfo(const std::vector<std::string> &newList, const std::vector<std::string> &newList2, const int &numberOfInodeOperation);
+ #endif
+
+ /************* External call ********************/
+ //dialog message
+ /// \note Can be call without queue because all call will be serialized
+ void fileAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFileSlot(QFileInfo fileInfo, std::string errorString, TransferThread * thread, const ErrorType &errorType);
+ /// \note Can be call without queue because all call will be serialized
+ void folderAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,ScanFileOrFolder * thread);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFolderSlot(QFileInfo fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType);
+ //mkpath event
+ void mkPathErrorOnFolderSlot(QFileInfo, std::string, ErrorType errorType);
+
+ //dialog message
+ /// \note Can be call without queue because all call will be serialized
+ void fileAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread,bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFile(QFileInfo fileInfo, std::string errorString, TransferThread * thread, const ErrorType &errorType, bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void folderAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,ScanFileOrFolder * thread,bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFolder(QFileInfo fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType, bool isCalledByShowOneNewDialog=false);
+ //mkpath event
+ void mkPathErrorOnFolder(QFileInfo, std::string, const ErrorType &errorType, bool isCalledByShowOneNewDialog=false);
+
+ //show one new dialog if needed
+ void showOneNewDialog();
+ void sendNewFilters();
+
+ void doChecksum_toggled(bool);
+ void checksumOnlyOnError_toggled(bool);
+ void checksumIgnoreIfImpossible_toggled(bool);
+ void osBuffer_toggled(bool);
+ void osBufferLimited_toggled(bool);
+ void osBufferLimit_editingFinished();
+ void showFilterDialog();
+ void sendNewRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule);
+ void showRenamingRules();
+ void get_realBytesTransfered(quint64 realBytesTransfered);
+ void newActionInProgess(Ultracopier::EngineActionInProgress);
+ void updatedBlockSize();
+ void updateBufferCheckbox();
+ void haveNeedPutAtBottom(bool needPutAtBottom, const QFileInfo &fileInfo, const std::string &errorString, TransferThread *thread, const ErrorType &errorType);
+ void missingDiskSpace(std::vector<Diskspace> list);
+ void exportErrorIntoTransferList();
+public:
+ /** \brief to send the options panel
+ * \return return false if have not the options
+ * \param tempWidget the widget to generate on it the options */
+ bool getOptionsEngine(QWidget * tempWidget);
+ /** \brief to have interface widget to do modal dialog
+ * \param interface to have the widget of the interface, useful for modal dialog */
+ void setInterfacePointer(QWidget * interface);
+ //return empty if multiple
+ /** \brief compare the current sources of the copy, with the passed arguments
+ * \param sources the sources list to compares with the current sources list
+ * \return true if have same sources, else false (or empty) */
+ bool haveSameSource(const std::vector<std::string> &sources);
+ /** \brief compare the current destination of the copy, with the passed arguments
+ * \param destination the destination to compares with the current destination
+ * \return true if have same destination, else false (or empty) */
+ bool haveSameDestination(const std::string &destination);
+ //external soft like file browser have send copy/move list to do
+ /** \brief send copy without destination, ask the destination
+ * \param sources the sources list to copy
+ * \return true if the copy have been accepted */
+ bool newCopy(const std::vector<std::string> &sources);
+ /** \brief send copy with destination
+ * \param sources the sources list to copy
+ * \param destination the destination to copy
+ * \return true if the copy have been accepted */
+ bool newCopy(const std::vector<std::string> &sources,const std::string &destination);
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \return true if the move have been accepted */
+ bool newMove(const std::vector<std::string> &sources);
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \param destination the destination to move
+ * \return true if the move have been accepted */
+ bool newMove(const std::vector<std::string> &sources,const std::string &destination);
+ /** \brief send the new transfer list
+ * \param file the transfer list */
+ void newTransferList(const std::string &file);
+
+ /** \brief to get byte read, use by Ultracopier for the speed calculation
+ * real size transfered to right speed calculation */
+ uint64_t realByteTransfered();
+ /** \brief support speed limitation */
+ bool supportSpeedLimitation() const;
+
+ /** \brief to set drives detected
+ * specific to this copy engine */
+
+ /** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+ void syncTransferList();
+
+ void set_doChecksum(bool doChecksum);
+ void set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible);
+ void set_checksumOnlyOnError(bool checksumOnlyOnError);
+ void set_osBuffer(bool osBuffer);
+ void set_osBufferLimited(bool osBufferLimited);
+ void set_osBufferLimit(unsigned int osBufferLimit);
+ void set_setFilters(std::vector<std::string> includeStrings,std::vector<std::string> includeOptions,std::vector<std::string> excludeStrings,std::vector<std::string> excludeOptions);
+ void setRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ void setRsync(const bool rsync);
+ #endif
+ void setCheckDiskSpace(const bool &checkDiskSpace);
+ void setDefaultDestinationFolder(const std::string &defaultDestinationFolder);
+ void setCopyListOrder(const bool &order);
+ void defaultDestinationFolderBrowse();
+ std::string askDestination();
+public slots:
+ //user ask ask to add folder (add it with interface ask source/destination)
+ /** \brief add folder called on the interface
+ * Used by manual adding */
+ bool userAddFolder(const Ultracopier::CopyMode &mode);
+ /** \brief add file called on the interface
+ * Used by manual adding */
+ bool userAddFile(const Ultracopier::CopyMode &mode);
+ //action on the copy
+ /// \brief put the transfer in pause
+ void pause();
+ /// \brief resume the transfer
+ void resume();
+ /** \brief skip one transfer entry
+ * \param id id of the file to remove */
+ void skip(const uint64_t &id);
+ /// \brief cancel all the transfer
+ void cancel();
+ //edit the transfer list
+ /** \brief remove the selected item
+ * \param ids ids is the id list of the selected items */
+ void removeItems(const std::vector<uint64_t> &ids);
+ /** \brief move on top of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnTop(const std::vector<uint64_t> &ids);
+ /** \brief move up the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsUp(const std::vector<uint64_t> &ids);
+ /** \brief move down the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsDown(const std::vector<uint64_t> &ids);
+ /** \brief move on bottom of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnBottom(const std::vector<uint64_t> &ids);
+
+ /** \brief give the forced mode, to export/import transfer list */
+ void forceMode(const Ultracopier::CopyMode &mode);
+ /// \brief export the transfer list into a file
+ void exportTransferList();
+ /// \brief import the transfer list into a file
+ void importTransferList();
+
+ /** \brief to set the speed limitation
+ * -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const int64_t &speedLimitation);
+
+ // specific to this copy engine
+
+ /// \brief set if the rights shoul be keep
+ void setRightTransfer(const bool doRightTransfer);
+ /// \brief set keep date
+ void setKeepDate(const bool keepDate);
+ /// \brief set block size in KB
+ void setBlockSize(const int blockSize);
+
+ void setParallelBuffer(int parallelBuffer);
+ void setSequentialBuffer(int sequentialBuffer);
+ void setParallelizeIfSmallerThan(int parallelizeIfSmallerThan);
+ void setMoveTheWholeFolder(const bool &moveTheWholeFolder);
+ void setFollowTheStrictOrder(const bool &followTheStrictOrder);
+ void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
+ void setInodeThreads(const int &inodeThreads);
+ void setRenameTheOriginalDestination(const bool &renameTheOriginalDestination);
+ void inodeThreadsFinished();
+
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
+ /// \brief set if need check if the destination folder exists
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief reset widget
+ void resetTempWidget();
+ //autoconnect
+ void setFolderCollision(int index);
+ void setFolderError(int index);
+ void setFileCollision(int index);
+ void setFileError(int index);
+ void setTransferAlgorithm(int index);
+ /// \brief need retranslate the insterface
+ void newLanguageLoaded();
+private slots:
+ void setComboBoxFolderCollision(FolderExistsAction action,bool changeComboBox=true);
+ void setComboBoxFolderError(FileErrorAction action,bool changeComboBox=true);
+ void warningTransferList(const std::string &warning);
+ void errorTransferList(const std::string &error);
+signals:
+ //action on the copy
+ void signal_pause() const;
+ void signal_resume() const;
+ void signal_skip(const uint64_t &id) const;
+
+ //edit the transfer list
+ void signal_removeItems(const std::vector<uint64_t> &ids) const;
+ void signal_moveItemsOnTop(const std::vector<uint64_t> &ids) const;
+ void signal_moveItemsUp(const std::vector<uint64_t> &ids) const;
+ void signal_moveItemsDown(const std::vector<uint64_t> &ids) const;
+ void signal_moveItemsOnBottom(const std::vector<uint64_t> &ids) const;
+
+ void signal_forceMode(const Ultracopier::CopyMode &mode) const;
+ void signal_exportTransferList(const std::string &fileName) const;
+ void signal_importTransferList(const std::string &fileName) const;
+ void signal_exportErrorIntoTransferList(const std::string &fileName) const;
+
+ //action
+ void signal_setTransferAlgorithm(TransferAlgorithm transferAlgorithm) const;
+ void signal_setCollisionAction(FileExistsAction alwaysDoThisActionForFileExists) const;
+ void signal_setComboBoxFolderCollision(FolderExistsAction action) const;
+ void signal_setFolderCollision(FolderExistsAction action) const;
+
+ //internal cancel
+ void tryCancel() const;
+ void getNeedPutAtBottom(const QFileInfo &fileInfo,const std::string &errorString,TransferThread * thread,const ErrorType &errorType) const;
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,std::string fonction,std::string text,std::string file,int ligne) const;
+ #endif
+
+ //other signals
+ void queryOneNewDialog() const;
+
+ void send_speedLimitation(const uint64_t &speedLimitation) const;
+ void send_blockSize(const int &blockSize) const;
+ void send_osBufferLimit(const unsigned int &osBufferLimit) const;
+ void send_setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude) const;
+ void send_sendNewRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule) const;
+ void send_parallelBuffer(const int &parallelBuffer) const;
+ void send_sequentialBuffer(const int &sequentialBuffer) const;
+ void send_parallelizeIfSmallerThan(const int &parallelizeIfSmallerThan) const;
+ void send_followTheStrictOrder(const bool &followTheStrictOrder) const;
+ void send_deletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles) const;
+ void send_setInodeThreads(const int &inodeThreads) const;
+ void send_moveTheWholeFolder(const bool &moveTheWholeFolder) const;
+ void send_setRenameTheOriginalDestination(const bool &renameTheOriginalDestination) const;
+};
+
+#endif // COPY_ENGINE_H
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngine.pro b/plugins/CopyEngine/Ultracopier/CopyEngine.pro
new file mode 100644
index 0000000..112e999
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/CopyEngine.pro
@@ -0,0 +1,106 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+QT += widgets xml
+DEFINES += UNICODE _UNICODE
+TEMPLATE = lib
+CONFIG += plugin
+win32 {
+ LIBS += -ladvapi32
+}
+
+HEADERS = \
+ $$PWD/StructEnumDefinition.h \
+ $$PWD/StructEnumDefinition_CopyEngine.h \
+ $$PWD/DebugEngineMacro.h \
+ $$PWD/Variable.h \
+ $$PWD/TransferThread.h \
+ $$PWD/ReadThread.h \
+ $$PWD/WriteThread.h \
+ $$PWD/MkPath.h \
+ $$PWD/AvancedQFile.h \
+ $$PWD/ListThread.h \
+ $$PWD/../../../interface/PluginInterface_CopyEngine.h \
+ $$PWD/../../../interface/OptionInterface.h \
+ $$PWD/../../../interface/FacilityInterface.h \
+ $$PWD/../../../cpp11addition.h \
+ $$PWD/Filters.h \
+ $$PWD/FilterRules.h \
+ $$PWD/RenamingRules.h \
+ $$PWD/DriveManagement.h \
+ $$PWD/CopyEngine.h \
+ $$PWD/DebugDialog.h \
+ $$PWD/CopyEngineFactory.h \
+ $$PWD/FileErrorDialog.h \
+ $$PWD/FileExistsDialog.h \
+ $$PWD/FileIsSameDialog.h \
+ $$PWD/FolderExistsDialog.h \
+ $$PWD/ScanFileOrFolder.h \
+ $$PWD/DiskSpace.h
+SOURCES = \
+ $$PWD/TransferThread.cpp \
+ $$PWD/ReadThread.cpp \
+ $$PWD/WriteThread.cpp \
+ $$PWD/MkPath.cpp \
+ $$PWD/AvancedQFile.cpp \
+ $$PWD/ListThread.cpp \
+ $$PWD/../../../cpp11addition.cpp \
+ $$PWD/../../../cpp11additionstringtointcpp.cpp \
+ $$PWD/Filters.cpp \
+ $$PWD/FilterRules.cpp \
+ $$PWD/RenamingRules.cpp \
+ $$PWD/ListThread_InodeAction.cpp \
+ $$PWD/DriveManagement.cpp \
+ $$PWD/CopyEngine-collision-and-error.cpp \
+ $$PWD/CopyEngine.cpp \
+ $$PWD/DebugDialog.cpp \
+ $$PWD/CopyEngineFactory.cpp \
+ $$PWD/FileErrorDialog.cpp \
+ $$PWD/FileExistsDialog.cpp \
+ $$PWD/FileIsSameDialog.cpp \
+ $$PWD/FolderExistsDialog.cpp \
+ $$PWD/ScanFileOrFolder.cpp \
+ $$PWD/DiskSpace.cpp
+TARGET = $$qtLibraryTarget(copyEngine)
+TRANSLATIONS += \
+ $$PWD/Languages/ar/translation.ts \
+ $$PWD/Languages/de/translation.ts \
+ $$PWD/Languages/el/translation.ts \
+ $$PWD/Languages/en/translation.ts \
+ $$PWD/Languages/es/translation.ts \
+ $$PWD/Languages/fr/translation.ts \
+ $$PWD/Languages/hi/translation.ts \
+ $$PWD/Languages/hu/translation.ts \
+ $$PWD/Languages/id/translation.ts \
+ $$PWD/Languages/it/translation.ts \
+ $$PWD/Languages/ja/translation.ts \
+ $$PWD/Languages/ko/translation.ts \
+ $$PWD/Languages/nl/translation.ts \
+ $$PWD/Languages/no/translation.ts \
+ $$PWD/Languages/pl/translation.ts \
+ $$PWD/Languages/pt/translation.ts \
+ $$PWD/Languages/ru/translation.ts \
+ $$PWD/Languages/th/translation.ts \
+ $$PWD/Languages/tr/translation.ts \
+ $$PWD/Languages/zh/translation.ts
+
+FORMS += \
+ $$PWD/fileErrorDialog.ui \
+ $$PWD/fileExistsDialog.ui \
+ $$PWD/fileIsSameDialog.ui \
+ $$PWD/debugDialog.ui \
+ $$PWD/folderExistsDialog.ui \
+ $$PWD/Filters.ui \
+ $$PWD/FilterRules.ui \
+ $$PWD/RenamingRules.ui \
+ $$PWD/copyEngineOptions.ui \
+ $$PWD/DiskSpace.ui
+
+OTHER_FILES += \
+ $$PWD/informations.xml
+
+!CONFIG(static) {
+RESOURCES += \
+ $$PWD/copyEngineResources.qrc
+}
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngineFactory.cpp b/plugins/CopyEngine/Ultracopier/CopyEngineFactory.cpp
new file mode 100644
index 0000000..6507ce2
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/CopyEngineFactory.cpp
@@ -0,0 +1,700 @@
+/** \file factory.cpp
+\brief Define the factory to create new instance
+\author alpha_one_x86 */
+
+#include <QFileDialog>
+#include <QList>
+#include <QDebug>
+#include <cmath>
+#include <QStorageInfo>
+
+#include "../../../cpp11addition.h"
+#include "CopyEngineFactory.h"
+
+// The cmath header from MSVC does not contain round()
+#if (defined(_WIN64) || defined(_WIN32)) && defined(_MSC_VER)
+inline double round(double d) {
+ return floor( d + 0.5 );
+}
+#endif
+
+CopyEngineFactory::CopyEngineFactory() :
+ ui(new Ui::copyEngineOptions())
+{
+ qRegisterMetaType<FolderExistsAction>("FolderExistsAction");
+ qRegisterMetaType<FileExistsAction>("FileExistsAction");
+ qRegisterMetaType<QList<Filters_rules> >("QList<Filters_rules>");
+ qRegisterMetaType<TransferStat>("TransferStat");
+ qRegisterMetaType<QList<QByteArray> >("QList<QByteArray>");
+ qRegisterMetaType<TransferAlgorithm>("TransferAlgorithm");
+ qRegisterMetaType<ActionType>("ActionType");
+ qRegisterMetaType<ErrorType>("ErrorType");
+ qRegisterMetaType<Diskspace>("Diskspace");
+ qRegisterMetaType<QList<Diskspace> >("QList<Diskspace>");
+ qRegisterMetaType<QFileInfo>("QFileInfo");
+ qRegisterMetaType<Ultracopier::CopyMode>("Ultracopier::CopyMode");
+ qRegisterMetaType<std::vector<Filters_rules> >("std::vector<Filters_rules>");
+
+ tempWidget=new QWidget();
+ ui->setupUi(tempWidget);
+ ui->toolBox->setCurrentIndex(0);
+ ui->blockSize->setMaximum(ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE);
+ errorFound=false;
+ optionsEngine=NULL;
+ filters=new Filters(tempWidget);
+ renamingRules=new RenamingRules(tempWidget);
+
+ connect(ui->doRightTransfer, &QCheckBox::toggled, this,&CopyEngineFactory::setDoRightTransfer);
+ connect(ui->keepDate, &QCheckBox::toggled, this,&CopyEngineFactory::setKeepDate);
+ connect(ui->blockSize, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::setBlockSize);
+ connect(ui->sequentialBuffer, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::setSequentialBuffer);
+ connect(ui->parallelBuffer, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::setParallelBuffer);
+ connect(ui->parallelizeIfSmallerThan, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::setParallelizeIfSmallerThan);
+ connect(ui->inodeThreads, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::on_inodeThreads_editingFinished);
+ connect(ui->autoStart, &QCheckBox::toggled, this,&CopyEngineFactory::setAutoStart);
+ connect(ui->doChecksum, &QCheckBox::toggled, this,&CopyEngineFactory::doChecksum_toggled);
+ connect(ui->comboBoxFolderError, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setFolderError);
+ connect(ui->comboBoxFolderCollision, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setFolderCollision);
+ connect(ui->comboBoxFileError, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setFileError);
+ connect(ui->comboBoxFileCollision, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setFileCollision);
+ connect(ui->transferAlgorithm, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setTransferAlgorithm);
+ connect(ui->checkBoxDestinationFolderExists, &QCheckBox::toggled, this,&CopyEngineFactory::setCheckDestinationFolder);
+ connect(ui->checksumIgnoreIfImpossible, &QCheckBox::toggled, this,&CopyEngineFactory::checksumIgnoreIfImpossible_toggled);
+ connect(ui->checksumOnlyOnError, &QCheckBox::toggled, this,&CopyEngineFactory::checksumOnlyOnError_toggled);
+ connect(ui->osBuffer, &QCheckBox::toggled, this,&CopyEngineFactory::osBuffer_toggled);
+ connect(ui->osBufferLimited, &QCheckBox::toggled, this,&CopyEngineFactory::osBufferLimited_toggled);
+ connect(ui->osBufferLimit, &QSpinBox::editingFinished, this,&CopyEngineFactory::osBufferLimit_editingFinished);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ connect(ui->rsync, &QCheckBox::toggled, this,&CopyEngineFactory::setRsync);
+ #endif
+ connect(ui->inodeThreads, &QSpinBox::editingFinished, this,&CopyEngineFactory::on_inodeThreads_editingFinished);
+ connect(ui->osBufferLimited, &QAbstractButton::toggled, this,&CopyEngineFactory::updateBufferCheckbox);
+ connect(ui->osBuffer, &QAbstractButton::toggled, this,&CopyEngineFactory::updateBufferCheckbox);
+ connect(ui->moveTheWholeFolder, &QCheckBox::toggled, this,&CopyEngineFactory::moveTheWholeFolder);
+ connect(ui->followTheStrictOrder, &QCheckBox::toggled, this,&CopyEngineFactory::followTheStrictOrder);
+ connect(ui->deletePartiallyTransferredFiles,&QCheckBox::toggled, this,&CopyEngineFactory::deletePartiallyTransferredFiles);
+ connect(ui->renameTheOriginalDestination,&QCheckBox::toggled, this,&CopyEngineFactory::renameTheOriginalDestination);
+ connect(ui->checkDiskSpace, &QCheckBox::toggled, this,&CopyEngineFactory::checkDiskSpace);
+ connect(ui->defaultDestinationFolderBrowse,&QPushButton::clicked, this,&CopyEngineFactory::defaultDestinationFolderBrowse);
+ connect(ui->defaultDestinationFolder,&QLineEdit::editingFinished, this,&CopyEngineFactory::defaultDestinationFolder);
+ connect(ui->copyListOrder, &QCheckBox::toggled, this,&CopyEngineFactory::copyListOrder);
+
+ connect(filters,&Filters::sendNewFilters,this,&CopyEngineFactory::sendNewFilters);
+ connect(ui->filters,&QPushButton::clicked,this,&CopyEngineFactory::showFilterDialog);
+ connect(renamingRules,&RenamingRules::sendNewRenamingRules,this,&CopyEngineFactory::sendNewRenamingRules);
+ connect(ui->renamingRules,&QPushButton::clicked,this,&CopyEngineFactory::showRenamingRules);
+
+ lunchInitFunction.setInterval(0);
+ lunchInitFunction.setSingleShot(true);
+ connect(&lunchInitFunction,&QTimer::timeout,this,&CopyEngineFactory::init,Qt::QueuedConnection);
+ lunchInitFunction.start();
+}
+
+CopyEngineFactory::~CopyEngineFactory()
+{
+ delete renamingRules;
+ delete filters;
+ delete ui;
+}
+
+void CopyEngineFactory::init()
+{
+}
+
+PluginInterface_CopyEngine * CopyEngineFactory::getInstance()
+{
+ CopyEngine *realObject=new CopyEngine(facilityEngine);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(realObject,&CopyEngine::debugInformation,this,&CopyEngineFactory::debugInformation);
+ #endif
+ realObject->connectTheSignalsSlots();
+ PluginInterface_CopyEngine * newTransferEngine=realObject;
+ connect(this,&CopyEngineFactory::reloadLanguage,realObject,&CopyEngine::newLanguageLoaded);
+ realObject->setRightTransfer(ui->doRightTransfer->isChecked());
+ realObject->setKeepDate(ui->keepDate->isChecked());
+ realObject->setBlockSize(ui->blockSize->value());
+ realObject->setAutoStart(ui->autoStart->isChecked());
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ realObject->setRsync(ui->rsync->isChecked());
+ #endif
+ realObject->setFolderCollision(ui->comboBoxFolderCollision->currentIndex());
+ realObject->setFolderError(ui->comboBoxFolderError->currentIndex());
+ realObject->setFileCollision(ui->comboBoxFileCollision->currentIndex());
+ realObject->setFileError(ui->comboBoxFileError->currentIndex());
+ realObject->setTransferAlgorithm(ui->transferAlgorithm->currentIndex());
+ realObject->setCheckDestinationFolderExists(ui->checkBoxDestinationFolderExists->isChecked());
+ realObject->set_doChecksum(ui->doChecksum->isChecked());
+ realObject->set_checksumIgnoreIfImpossible(ui->checksumIgnoreIfImpossible->isChecked());
+ realObject->set_checksumOnlyOnError(ui->checksumOnlyOnError->isChecked());
+ realObject->set_osBuffer(ui->osBuffer->isChecked());
+ realObject->set_osBufferLimited(ui->osBufferLimited->isChecked());
+ realObject->set_osBufferLimit(ui->osBufferLimit->value());
+ realObject->set_setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ realObject->setRenamingRules(firstRenamingRule,otherRenamingRule);
+ realObject->setSequentialBuffer(ui->sequentialBuffer->value());
+ realObject->setParallelBuffer(ui->parallelBuffer->value());
+ realObject->setParallelizeIfSmallerThan(ui->parallelizeIfSmallerThan->value());
+ realObject->setMoveTheWholeFolder(ui->moveTheWholeFolder->isChecked());
+ realObject->setFollowTheStrictOrder(ui->followTheStrictOrder->isChecked());
+ realObject->setDeletePartiallyTransferredFiles(ui->deletePartiallyTransferredFiles->isChecked());
+ realObject->setInodeThreads(ui->inodeThreads->value());
+ realObject->setRenameTheOriginalDestination(ui->renameTheOriginalDestination->isChecked());
+ realObject->setCheckDiskSpace(ui->checkDiskSpace->isChecked());
+ realObject->setDefaultDestinationFolder(ui->defaultDestinationFolder->text().toStdString());
+ realObject->setCopyListOrder(ui->copyListOrder->isChecked());
+ return newTransferEngine;
+}
+
+void CopyEngineFactory::setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, writePath: "+writePath+", pluginPath:"+pluginPath);
+ this->facilityEngine=facilityInterface;
+ Q_UNUSED(portableVersion);
+ #ifndef ULTRACOPIER_PLUGIN_DEBUG
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ #endif
+ #if ! defined (Q_CC_GNU)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("Unable to change date time of files, only gcc is supported"));
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,COMPILERINFO);
+ #if defined (ULTRACOPIER_PLUGIN_CHECKLISTTYPE)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"CHECK LIST TYPE set");
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"CHECK LIST TYPE not set");
+ #endif
+ if(options!=NULL)
+ {
+ //load the options
+ std::vector<std::pair<std::string, std::string> > KeysList;
+ KeysList.push_back(std::pair<std::string, std::string>("doRightTransfer","true"));
+ #ifndef Q_OS_LINUX
+ KeysList.push_back(std::pair<std::string, std::string>("keepDate","false"));
+ #else
+ KeysList.push_back(std::pair<std::string, std::string>("keepDate","true"));
+ #endif
+ KeysList.push_back(std::pair<std::string, std::string>("blockSize",std::to_string(ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE)));
+ uint32_t sequentialBuffer=ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*ULTRACOPIER_PLUGIN_DEFAULT_SEQUENTIAL_NUMBER_OF_BLOCK;
+ uint32_t parallelBuffer=ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
+ //to prevent swap and other bad effect, only under windows and unix for now
+ #if defined(Q_OS_WIN32) or (defined(Q_OS_LINUX) and defined(_SC_PHYS_PAGES))
+ size_t max_memory=getTotalSystemMemory()/1024;
+ if(max_memory>0)
+ {
+ if(sequentialBuffer>(max_memory/10))
+ sequentialBuffer=max_memory/10;
+ if(parallelBuffer>(max_memory/100))
+ parallelBuffer=max_memory/100;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("detected memory: %1MB").arg(max_memory/1024).toStdString());
+ #endif
+ KeysList.push_back(std::pair<std::string, std::string>("sequentialBuffer",std::to_string(sequentialBuffer)));
+ KeysList.push_back(std::pair<std::string, std::string>("parallelBuffer",std::to_string(parallelBuffer)));
+ KeysList.push_back(std::pair<std::string, std::string>("parallelizeIfSmallerThan",std::to_string(128)));//128KB, better for modern hardware: Multiple queue en linux, SSD, ...
+ KeysList.push_back(std::pair<std::string, std::string>("autoStart","true"));
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ KeysList.push_back(std::pair<std::string, std::string>("rsync","true"));
+ #endif
+ KeysList.push_back(std::pair<std::string, std::string>("folderError",std::to_string(0)));
+ KeysList.push_back(std::pair<std::string, std::string>("folderCollision",std::to_string(0)));
+ KeysList.push_back(std::pair<std::string, std::string>("fileError",std::to_string(2)));
+ KeysList.push_back(std::pair<std::string, std::string>("fileCollision",std::to_string(0)));
+ KeysList.push_back(std::pair<std::string, std::string>("transferAlgorithm",std::to_string(0)));
+ KeysList.push_back(std::pair<std::string, std::string>("checkDestinationFolder","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("includeStrings",""));
+ KeysList.push_back(std::pair<std::string, std::string>("includeOptions",""));
+ KeysList.push_back(std::pair<std::string, std::string>("excludeStrings",""));
+ KeysList.push_back(std::pair<std::string, std::string>("excludeOptions",""));
+ KeysList.push_back(std::pair<std::string, std::string>("doChecksum","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("checksumIgnoreIfImpossible","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("checksumOnlyOnError","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("osBuffer","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("firstRenamingRule",""));
+ KeysList.push_back(std::pair<std::string, std::string>("otherRenamingRule",""));
+ KeysList.push_back(std::pair<std::string, std::string>("osBufferLimited","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("osBufferLimit",std::to_string(512)));
+ KeysList.push_back(std::pair<std::string, std::string>("deletePartiallyTransferredFiles","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("moveTheWholeFolder","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("followTheStrictOrder","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("renameTheOriginalDestination","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("checkDiskSpace","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("defaultDestinationFolder",""));
+ KeysList.push_back(std::pair<std::string, std::string>("inodeThreads",std::to_string(1)));
+ KeysList.push_back(std::pair<std::string, std::string>("copyListOrder","false"));
+ options->addOptionGroup(KeysList);
+ #if ! defined (Q_CC_GNU)
+ ui->keepDate->setEnabled(false);
+ ui->keepDate->setToolTip(QStringLiteral("Not supported with this compiler"));
+ #endif
+ ui->doRightTransfer->setChecked(stringtobool(options->getOptionValue("doRightTransfer")));
+ ui->keepDate->setChecked(stringtobool(options->getOptionValue("keepDate")));
+ ui->blockSize->setValue(stringtouint32(options->getOptionValue("blockSize")));//keep before sequentialBuffer and parallelBuffer
+ ui->autoStart->setChecked(stringtobool(options->getOptionValue("autoStart")));
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ ui->rsync->setChecked(stringtobool(options->getOptionValue("rsync")));
+ #else
+ ui->label_rsync->setVisible(false);
+ ui->rsync->setVisible(false);
+ #endif
+ ui->comboBoxFolderError->setCurrentIndex(stringtouint32(options->getOptionValue("folderError")));
+ ui->comboBoxFolderCollision->setCurrentIndex(stringtouint32(options->getOptionValue("folderCollision")));
+ ui->comboBoxFileError->setCurrentIndex(stringtouint32(options->getOptionValue("fileError")));
+ ui->comboBoxFileCollision->setCurrentIndex(stringtouint32(options->getOptionValue("fileCollision")));
+ ui->transferAlgorithm->setCurrentIndex(stringtouint32(options->getOptionValue("transferAlgorithm")));
+ ui->checkBoxDestinationFolderExists->setChecked(stringtobool(options->getOptionValue("checkDestinationFolder")));
+ ui->parallelizeIfSmallerThan->setValue(stringtouint32(options->getOptionValue("parallelizeIfSmallerThan")));
+ ui->sequentialBuffer->setValue(stringtouint32(options->getOptionValue("sequentialBuffer")));
+ ui->parallelBuffer->setValue(stringtouint32(options->getOptionValue("parallelBuffer")));
+ ui->sequentialBuffer->setSingleStep(ui->blockSize->value());
+ ui->parallelBuffer->setSingleStep(ui->blockSize->value());
+ ui->deletePartiallyTransferredFiles->setChecked(stringtobool(options->getOptionValue("deletePartiallyTransferredFiles")));
+ ui->moveTheWholeFolder->setChecked(stringtobool(options->getOptionValue("moveTheWholeFolder")));
+ ui->followTheStrictOrder->setChecked(stringtobool(options->getOptionValue("followTheStrictOrder")));
+ ui->inodeThreads->setValue(stringtouint32(options->getOptionValue("inodeThreads")));
+ ui->renameTheOriginalDestination->setChecked(stringtobool(options->getOptionValue("renameTheOriginalDestination")));
+ ui->checkDiskSpace->setChecked(stringtobool(options->getOptionValue("checkDiskSpace")));
+ ui->defaultDestinationFolder->setText(QString::fromStdString(options->getOptionValue("defaultDestinationFolder")));
+
+ ui->doChecksum->setChecked(stringtobool(options->getOptionValue("doChecksum")));
+ ui->checksumIgnoreIfImpossible->setChecked(stringtobool(options->getOptionValue("checksumIgnoreIfImpossible")));
+ ui->checksumOnlyOnError->setChecked(stringtobool(options->getOptionValue("checksumOnlyOnError")));
+
+ ui->osBuffer->setChecked(stringtobool(options->getOptionValue("osBuffer")));
+ ui->osBufferLimited->setChecked(stringtobool(options->getOptionValue("osBufferLimited")));
+ ui->osBufferLimit->setValue(stringtouint32(options->getOptionValue("osBufferLimit")));
+ //ui->autoStart->setChecked(options->getOptionValue("autoStart").toBool());//moved from options(), wrong previous place
+ includeStrings=stringtostringlist(options->getOptionValue("includeStrings"));
+ includeOptions=stringtostringlist(options->getOptionValue("includeOptions"));
+ excludeStrings=stringtostringlist(options->getOptionValue("excludeStrings"));
+ excludeOptions=stringtostringlist(options->getOptionValue("excludeOptions"));
+ filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ firstRenamingRule=options->getOptionValue("firstRenamingRule");
+ otherRenamingRule=options->getOptionValue("otherRenamingRule");
+ renamingRules->setRenamingRules(firstRenamingRule,otherRenamingRule);
+
+ ui->checksumOnlyOnError->setEnabled(ui->doChecksum->isChecked());
+ ui->checksumIgnoreIfImpossible->setEnabled(ui->doChecksum->isChecked());
+ ui->copyListOrder->setChecked(stringtobool(options->getOptionValue("copyListOrder")));
+
+ updateBufferCheckbox();
+ optionsEngine=options;
+
+ updatedBlockSize();
+ }
+}
+
+std::vector<std::string> CopyEngineFactory::supportedProtocolsForTheSource() const
+{
+ std::vector<std::string> l;
+ l.push_back("file");
+ return l;
+}
+
+std::vector<std::string> CopyEngineFactory::supportedProtocolsForTheDestination() const
+{
+ std::vector<std::string> l;
+ l.push_back("file");
+ return l;
+}
+
+Ultracopier::CopyType CopyEngineFactory::getCopyType()
+{
+ return Ultracopier::FileAndFolder;
+}
+
+Ultracopier::TransferListOperation CopyEngineFactory::getTransferListOperation()
+{
+ return Ultracopier::TransferListOperation_ImportExport;
+}
+
+bool CopyEngineFactory::canDoOnlyCopy() const
+{
+ return false;
+}
+
+void CopyEngineFactory::resetOptions()
+{
+}
+
+QWidget * CopyEngineFactory::options()
+{
+ return tempWidget;
+}
+
+void CopyEngineFactory::setDoRightTransfer(bool doRightTransfer)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("doRightTransfer",booltostring(doRightTransfer));
+}
+
+void CopyEngineFactory::setKeepDate(bool keepDate)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("keepDate",booltostring(keepDate));
+}
+
+void CopyEngineFactory::setBlockSize(int blockSize)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("blockSize",std::to_string(blockSize));
+ updatedBlockSize();
+}
+
+void CopyEngineFactory::setParallelBuffer(int parallelBuffer)
+{
+ if(optionsEngine!=NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ parallelBuffer=round((float)parallelBuffer/(float)ui->blockSize->value())*ui->blockSize->value();
+ ui->parallelBuffer->setValue(parallelBuffer);
+ optionsEngine->setOptionValue("parallelBuffer",std::to_string(parallelBuffer));
+ }
+}
+
+void CopyEngineFactory::setSequentialBuffer(int sequentialBuffer)
+{
+ if(optionsEngine!=NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ sequentialBuffer=round((float)sequentialBuffer/(float)ui->blockSize->value())*ui->blockSize->value();
+ ui->sequentialBuffer->setValue(sequentialBuffer);
+ optionsEngine->setOptionValue("sequentialBuffer",std::to_string(sequentialBuffer));
+ }
+}
+
+void CopyEngineFactory::setParallelizeIfSmallerThan(int parallelizeIfSmallerThan)
+{
+ if(optionsEngine!=NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ optionsEngine->setOptionValue("parallelizeIfSmallerThan",std::to_string(parallelizeIfSmallerThan));
+ }
+}
+
+void CopyEngineFactory::setAutoStart(bool autoStart)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("autoStart",booltostring(autoStart));
+}
+
+void CopyEngineFactory::setFolderCollision(int index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("folderCollision",std::to_string(index));
+}
+
+void CopyEngineFactory::setFolderError(int index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("folderError",std::to_string(index));
+}
+
+void CopyEngineFactory::setTransferAlgorithm(int index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("transferAlgorithm",std::to_string(index));
+}
+
+void CopyEngineFactory::setCheckDestinationFolder()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("checkDestinationFolder",booltostring(ui->checkBoxDestinationFolderExists->isChecked()));
+}
+
+void CopyEngineFactory::newLanguageLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, retranslate the widget options");
+ OptionInterface * optionsEngine=this->optionsEngine;
+ this->optionsEngine=NULL;
+ ui->retranslateUi(tempWidget);
+ ui->comboBoxFolderError->setItemText(0,tr("Ask"));
+ ui->comboBoxFolderError->setItemText(1,tr("Skip"));
+
+ ui->comboBoxFolderCollision->setItemText(0,tr("Ask"));
+ ui->comboBoxFolderCollision->setItemText(1,tr("Merge"));
+ ui->comboBoxFolderCollision->setItemText(2,tr("Skip"));
+ ui->comboBoxFolderCollision->setItemText(3,tr("Rename"));
+
+ ui->comboBoxFileError->setItemText(0,tr("Ask"));
+ ui->comboBoxFileError->setItemText(1,tr("Skip"));
+ ui->comboBoxFileError->setItemText(2,tr("Put at the end"));
+
+ ui->comboBoxFileCollision->setItemText(0,tr("Ask"));
+ ui->comboBoxFileCollision->setItemText(1,tr("Skip"));
+ ui->comboBoxFileCollision->setItemText(2,tr("Overwrite"));
+ ui->comboBoxFileCollision->setItemText(3,tr("Overwrite if different"));
+ ui->comboBoxFileCollision->setItemText(4,tr("Overwrite if newer"));
+ ui->comboBoxFileCollision->setItemText(5,tr("Overwrite if older"));
+ ui->comboBoxFileCollision->setItemText(6,tr("Rename"));
+
+ ui->transferAlgorithm->setItemText(0,tr("Automatic"));
+ ui->transferAlgorithm->setItemText(1,tr("Sequential"));
+ ui->transferAlgorithm->setItemText(2,tr("Parallel"));
+ if(optionsEngine!=NULL)
+ {
+ filters->newLanguageLoaded();
+ renamingRules->newLanguageLoaded();
+ }
+ emit reloadLanguage();
+ this->optionsEngine=optionsEngine;
+}
+
+void CopyEngineFactory::doChecksum_toggled(bool doChecksum)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("doChecksum",booltostring(doChecksum));
+}
+
+void CopyEngineFactory::checksumOnlyOnError_toggled(bool checksumOnlyOnError)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("checksumOnlyOnError",booltostring(checksumOnlyOnError));
+}
+
+void CopyEngineFactory::osBuffer_toggled(bool osBuffer)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("osBuffer",booltostring(osBuffer));
+ ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
+}
+
+void CopyEngineFactory::osBufferLimited_toggled(bool osBufferLimited)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("osBufferLimited",booltostring(osBufferLimited));
+ ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
+}
+
+void CopyEngineFactory::osBufferLimit_editingFinished()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the spinbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("osBufferLimit",std::to_string(ui->osBufferLimit->value()));
+}
+
+void CopyEngineFactory::showFilterDialog()
+{
+ if(optionsEngine==NULL)
+ {
+ QMessageBox::critical(NULL,tr("Options error"),tr("Options engine is not loaded. Unable to access the filters"));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"options not loaded");
+ return;
+ }
+ filters->exec();
+}
+
+void CopyEngineFactory::sendNewFilters(const std::vector<std::string> &includeStrings,const std::vector<std::string> &includeOptions,const std::vector<std::string> &excludeStrings,const std::vector<std::string> &excludeOptions)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"new filter");
+ this->includeStrings=includeStrings;
+ this->includeOptions=includeOptions;
+ this->excludeStrings=excludeStrings;
+ this->excludeOptions=excludeOptions;
+ if(optionsEngine!=NULL)
+ {
+ optionsEngine->setOptionValue("includeStrings",stringlisttostring(includeStrings));
+ optionsEngine->setOptionValue("includeOptions",stringlisttostring(includeOptions));
+ optionsEngine->setOptionValue("excludeStrings",stringlisttostring(excludeStrings));
+ optionsEngine->setOptionValue("excludeOptions",stringlisttostring(excludeOptions));
+ }
+}
+
+void CopyEngineFactory::sendNewRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"new filter");
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ if(optionsEngine!=NULL)
+ {
+ optionsEngine->setOptionValue("firstRenamingRule",firstRenamingRule);
+ optionsEngine->setOptionValue("otherRenamingRule",otherRenamingRule);
+ }
+}
+
+void CopyEngineFactory::showRenamingRules()
+{
+ if(optionsEngine==NULL)
+ {
+ QMessageBox::critical(NULL,tr("Options error"),tr("Options engine is not loaded, can't access to the filters"));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"options not loaded");
+ return;
+ }
+ renamingRules->exec();
+}
+
+void CopyEngineFactory::updateBufferCheckbox()
+{
+ ui->osBufferLimited->setEnabled(ui->osBuffer->isChecked());
+ ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
+}
+
+void CopyEngineFactory::checksumIgnoreIfImpossible_toggled(bool checksumIgnoreIfImpossible)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("checksumIgnoreIfImpossible",booltostring(checksumIgnoreIfImpossible));
+}
+
+void CopyEngineFactory::setFileCollision(int index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
+ if(optionsEngine==NULL)
+ return;
+ switch(index)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ optionsEngine->setOptionValue("fileCollision",std::to_string(index));
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ break;
+ }
+}
+
+void CopyEngineFactory::setFileError(int index)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
+ if(optionsEngine==NULL)
+ return;
+ switch(index)
+ {
+ case 0:
+ case 1:
+ case 2:
+ optionsEngine->setOptionValue("fileError",std::to_string(index));
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
+ break;
+ }
+}
+
+void CopyEngineFactory::updatedBlockSize()
+{
+ ui->sequentialBuffer->setMinimum(ui->blockSize->value());
+ ui->sequentialBuffer->setSingleStep(ui->blockSize->value());
+ ui->sequentialBuffer->setMaximum(ui->blockSize->value()*ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK);
+ ui->parallelBuffer->setMinimum(ui->blockSize->value());
+ ui->parallelBuffer->setSingleStep(ui->blockSize->value());
+ ui->parallelBuffer->setMaximum(ui->blockSize->value()*ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK);
+ setParallelBuffer(ui->parallelBuffer->value());
+ setSequentialBuffer(ui->sequentialBuffer->value());
+}
+
+void CopyEngineFactory::deletePartiallyTransferredFiles(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("deletePartiallyTransferredFiles",booltostring(checked));
+}
+
+void CopyEngineFactory::renameTheOriginalDestination(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("renameTheOriginalDestination",booltostring(checked));
+}
+
+void CopyEngineFactory::checkDiskSpace(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("checkDiskSpace",booltostring(checked));
+}
+
+void CopyEngineFactory::defaultDestinationFolderBrowse()
+{
+ QString destination = QFileDialog::getExistingDirectory(ui->defaultDestinationFolder,
+ QString::fromStdString(facilityEngine->translateText("Select destination directory")),
+ "",QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if(destination.isEmpty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Canceled by the user");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ ui->defaultDestinationFolder->setText(destination);
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("defaultDestinationFolder",destination.toStdString());
+}
+
+void CopyEngineFactory::defaultDestinationFolder()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("defaultDestinationFolder",ui->defaultDestinationFolder->text().toStdString());
+}
+
+void CopyEngineFactory::followTheStrictOrder(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("followTheStrictOrder",booltostring(checked));
+}
+
+void CopyEngineFactory::moveTheWholeFolder(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("moveTheWholeFolder",booltostring(checked));
+}
+
+void CopyEngineFactory::on_inodeThreads_editingFinished()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the spinbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("inodeThreads",std::to_string(ui->inodeThreads->value()));
+}
+
+#ifdef Q_OS_WIN32
+size_t CopyEngineFactory::getTotalSystemMemory()
+{
+ MEMORYSTATUSEX status;
+ status.dwLength = sizeof(status);
+ GlobalMemoryStatusEx(&status);
+ return status.ullTotalPhys;
+}
+#endif
+
+#ifdef Q_OS_LINUX
+size_t CopyEngineFactory::getTotalSystemMemory()
+{
+ long pages = sysconf(_SC_PHYS_PAGES);
+ long page_size = sysconf(_SC_PAGE_SIZE);
+ return pages * page_size;
+}
+#endif
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+void CopyEngineFactory::setRsync(bool rsync)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("rsync",std::to_string(rsync));
+}
+#endif
+
+void CopyEngineFactory::copyListOrder(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("copyListOrder",booltostring(checked));
+}
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngineFactory.h b/plugins/CopyEngine/Ultracopier/CopyEngineFactory.h
new file mode 100644
index 0000000..59c4208
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/CopyEngineFactory.h
@@ -0,0 +1,133 @@
+/** \file factory.h
+\brief Define the factory to create new instance
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "StructEnumDefinition_CopyEngine.h"
+
+#include <QObject>
+#include <QList>
+#include <QStringList>
+#include <QFileInfo>
+#include <QProcess>
+#include <QTimer>
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "qstorageinfo.h"
+#include "StructEnumDefinition.h"
+#include "ui_copyEngineOptions.h"
+#include "CopyEngine.h"
+#include "Environment.h"
+#include "Filters.h"
+#include "RenamingRules.h"
+
+#ifdef Q_OS_WIN32
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#endif
+#ifdef Q_OS_LINUX
+ #include <unistd.h>
+#endif
+
+#ifndef FACTORY_H
+#define FACTORY_H
+
+namespace Ui {
+ class copyEngineOptions;
+}
+
+/** \brief to generate copy engine instance */
+class CopyEngineFactory : public PluginInterface_CopyEngineFactory
+{
+ Q_OBJECT
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.CopyEngineFactory/1.0.0.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_CopyEngineFactory)
+ #endif
+public:
+ CopyEngineFactory();
+ ~CopyEngineFactory();
+ /// \brief to return the instance of the copy engine
+ PluginInterface_CopyEngine * getInstance();
+ /// \brief set the resources, to store options, to have facilityInterface
+ void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion);
+ //get mode allowed
+ /// \brief define if can copy file, folder or both
+ Ultracopier::CopyType getCopyType();
+ /// \brief to return which kind of transfer list operation is supported
+ Ultracopier::TransferListOperation getTransferListOperation();
+ /// \brief define if can only copy, or copy and move
+ bool canDoOnlyCopy() const;
+ /// \brief to get the supported protocols for the source
+ std::vector<std::string> supportedProtocolsForTheSource() const;
+ /// \brief to get the supported protocols for the destination
+ std::vector<std::string> supportedProtocolsForTheDestination() const;
+ /// \brief to get the options of the copy engine
+ QWidget * options();
+
+private:
+ Ui::copyEngineOptions *ui;
+ QWidget* tempWidget;
+ OptionInterface * optionsEngine;
+ bool errorFound;
+ FacilityInterface * facilityEngine;
+ Filters *filters;
+ RenamingRules *renamingRules;
+ QStorageInfo storageInfo;
+ QTimer lunchInitFunction;
+ std::vector<std::string> includeStrings,includeOptions,excludeStrings,excludeOptions;
+ std::string firstRenamingRule,otherRenamingRule;
+
+#if defined(Q_OS_WIN32) || (defined(Q_OS_LINUX) && defined(_SC_PHYS_PAGES))
+ static size_t getTotalSystemMemory();
+#endif
+private slots:
+ void init();
+ void setDoRightTransfer(bool doRightTransfer);
+ void setKeepDate(bool keepDate);
+ void setBlockSize(int blockSize);
+ void setParallelBuffer(int parallelBuffer);
+ void setSequentialBuffer(int sequentialBuffer);
+ void setParallelizeIfSmallerThan(int parallelizeIfSmallerThan);
+ void setAutoStart(bool autoStart);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ void setRsync(bool rsync);
+ #endif
+ void setFolderCollision(int index);
+ void setFolderError(int index);
+ void setTransferAlgorithm(int index);
+ void setCheckDestinationFolder();
+ void showFilterDialog();
+ void sendNewFilters(const std::vector<std::string> &includeStrings,const std::vector<std::string> &includeOptions,
+ const std::vector<std::string> &excludeStrings,const std::vector<std::string> &excludeOptions);
+ void doChecksum_toggled(bool);
+ void checksumOnlyOnError_toggled(bool);
+ void osBuffer_toggled(bool);
+ void osBufferLimited_toggled(bool);
+ void osBufferLimit_editingFinished();
+ void checksumIgnoreIfImpossible_toggled(bool);
+ void sendNewRenamingRules(const std::string &firstRenamingRule, const std::string &otherRenamingRule);
+ void showRenamingRules();
+ void updateBufferCheckbox();
+ void setFileCollision(int index);
+ void setFileError(int index);
+ void updatedBlockSize();
+ void deletePartiallyTransferredFiles(bool checked);
+ void renameTheOriginalDestination(bool checked);
+ void checkDiskSpace(bool checked);
+ void defaultDestinationFolderBrowse();
+ void defaultDestinationFolder();
+ void followTheStrictOrder(bool checked);
+ void moveTheWholeFolder(bool checked);
+ void on_inodeThreads_editingFinished();
+ void copyListOrder(bool checked);
+public slots:
+ void resetOptions();
+ void newLanguageLoaded();
+signals:
+ void reloadLanguage() const;
+};
+
+#endif // FACTORY_H
diff --git a/plugins/CopyEngine/Ultracopier/DebugDialog.cpp b/plugins/CopyEngine/Ultracopier/DebugDialog.cpp
new file mode 100644
index 0000000..0b3fec4
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/DebugDialog.cpp
@@ -0,0 +1,54 @@
+/** \file debugDialog.cpp
+\brief Define the dialog to have debug information
+\author alpha_one_x86 */
+
+#include "DebugDialog.h"
+#include "ui_debugDialog.h"
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+
+DebugDialog::DebugDialog(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::debugDialog)
+{
+ ui->setupUi(this);
+}
+
+DebugDialog::~DebugDialog()
+{
+ delete ui;
+}
+
+void DebugDialog::setTransferList(const std::vector<std::string> &list)
+{
+ ui->tranferList->clear();
+ unsigned int index=0;
+ while(index<list.size())
+ {
+ ui->tranferList->addItem(QString::fromStdString(list.at(index)));
+ index++;
+ }
+}
+
+void DebugDialog::setActiveTransfer(const int &activeTransfer)
+{
+ ui->spinBoxActiveTransfer->setValue(activeTransfer);
+}
+
+void DebugDialog::setInodeUsage(const int &inodeUsage)
+{
+ ui->spinBoxNumberOfInode->setValue(inodeUsage);
+}
+
+void DebugDialog::setTransferThreadList(const std::vector<std::string> &list)
+{
+ ui->transferThreadList->clear();
+ unsigned int index=0;
+ while(index<list.size())
+ {
+ ui->transferThreadList->addItem(QString::fromStdString(list.at(index)));
+ index++;
+ }
+}
+
+#endif
diff --git a/plugins/CopyEngine/Ultracopier/DebugDialog.h b/plugins/CopyEngine/Ultracopier/DebugDialog.h
new file mode 100644
index 0000000..c84cfaa
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/DebugDialog.h
@@ -0,0 +1,39 @@
+/** \file debugDialog.h
+\brief Define the dialog to have debug information
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGDAILOG_H
+#define DEBUGDAILOG_H
+
+#include "Environment.h"
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+#include <QWidget>
+
+namespace Ui {
+ class debugDialog;
+}
+
+/// \brief class to the dialog to have debug information
+class DebugDialog : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit DebugDialog(QWidget *parent = 0);
+ ~DebugDialog();
+ /// \brief to set the transfer list, limited in result to not slow down the application
+ void setTransferList(const std::vector<std::string> &list);
+ /// \brief show the transfer thread, it show be a thread pool in normal time
+ void setTransferThreadList(const std::vector<std::string> &list);
+ /// \brief show how many transfer is active
+ void setActiveTransfer(const int &activeTransfer);
+ /// \brief show many many inode is manipulated
+ void setInodeUsage(const int &inodeUsage);
+private:
+ Ui::debugDialog *ui;
+};
+
+#endif // ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+
+#endif // DEBUGDAILOG_H
diff --git a/plugins/CopyEngine/Ultracopier/DebugEngineMacro.h b/plugins/CopyEngine/Ultracopier/DebugEngineMacro.h
new file mode 100644
index 0000000..f9b5349
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \brief Macro for the debug log
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #if defined (__FILE__) && defined (__LINE__)
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) emit debugInformation(a,__func__,b,__FILE__,__LINE__)
+ #else
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) emit debugInformation(a,__func__,b)
+ #endif
+#else // ULTRACOPIER_PLUGIN_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins/CopyEngine/Ultracopier/DiskSpace.cpp b/plugins/CopyEngine/Ultracopier/DiskSpace.cpp
new file mode 100644
index 0000000..e9b996d
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/DiskSpace.cpp
@@ -0,0 +1,53 @@
+#include "DiskSpace.h"
+#include "ui_DiskSpace.h"
+#include "StructEnumDefinition_CopyEngine.h"
+
+DiskSpace::DiskSpace(FacilityInterface * facilityEngine,std::vector<Diskspace> list,QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::DiskSpace)
+{
+ Qt::WindowFlags flags = windowFlags();
+ #ifdef Q_OS_LINUX
+ flags=flags & ~Qt::X11BypassWindowManagerHint;
+ #endif
+ flags=flags | Qt::WindowStaysOnTopHint;
+ setWindowFlags(flags);
+
+ ui->setupUi(this);
+ ok=false;
+ int index=0;
+ int size=list.size();
+ QString drives;
+ while(index<size)
+ {
+ drives+=tr("Drives %1 have %2 available but need %3")
+ .arg(QString::fromStdString(list.at(index).drive))
+ .arg(QString::fromStdString(facilityEngine->sizeToString(list.at(index).freeSpace)))
+ .arg(QString::fromStdString(facilityEngine->sizeToString(list.at(index).requiredSpace)));
+ drives+=QStringLiteral("<br />");
+ index++;
+ }
+ ui->drives->setText(drives);
+}
+
+DiskSpace::~DiskSpace()
+{
+ delete ui;
+}
+
+void DiskSpace::on_ok_clicked()
+{
+ ok=true;
+ close();
+}
+
+void DiskSpace::on_cancel_clicked()
+{
+ ok=false;
+ close();
+}
+
+bool DiskSpace::getAction() const
+{
+ return ok;
+}
diff --git a/plugins/CopyEngine/Ultracopier/DiskSpace.h b/plugins/CopyEngine/Ultracopier/DiskSpace.h
new file mode 100644
index 0000000..5a923ab
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/DiskSpace.h
@@ -0,0 +1,29 @@
+#ifndef DISKSPACE_H
+#define DISKSPACE_H
+
+#include <QDialog>
+#include <vector>
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "StructEnumDefinition_CopyEngine.h"
+
+namespace Ui {
+class DiskSpace;
+}
+
+class DiskSpace : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit DiskSpace(FacilityInterface * facilityEngine,std::vector<Diskspace> list,QWidget *parent = 0);
+ ~DiskSpace();
+ bool getAction() const;
+private slots:
+ void on_ok_clicked();
+ void on_cancel_clicked();
+private:
+ Ui::DiskSpace *ui;
+ bool ok;
+};
+
+#endif // DISKSPACE_H
diff --git a/plugins/CopyEngine/Ultracopier/DiskSpace.ui b/plugins/CopyEngine/Ultracopier/DiskSpace.ui
new file mode 100644
index 0000000..10b5c69
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/DiskSpace.ui
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DiskSpace</class>
+ <widget class="QDialog" name="DiskSpace">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>367</width>
+ <height>146</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Disk space</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier/resources/remove.png</normaloff>:/CopyEngine/Ultracopier/resources/remove.png</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>You need more space on this drive to finish this transfer</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTextBrowser" name="drives"/>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="ok">
+ <property name="text">
+ <string>Continue</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="copyEngineResources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/DriveManagement.cpp b/plugins/CopyEngine/Ultracopier/DriveManagement.cpp
new file mode 100644
index 0000000..f25836f
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/DriveManagement.cpp
@@ -0,0 +1,105 @@
+#include "DriveManagement.h"
+
+#include <QDir>
+#include <QFileInfoList>
+#include <QStorageInfo>
+
+#include "../../../cpp11addition.h"
+
+DriveManagement::DriveManagement()
+{
+ tryUpdate();
+ #ifdef Q_OS_WIN32
+ reg1=std::regex("^(\\\\\\\\|//)[^\\\\\\\\/]+(\\\\|/)[^\\\\\\\\/]+");
+ reg2=std::regex("^((\\\\\\\\|//)[^\\\\\\\\/]+(\\\\|/)[^\\\\\\\\/]+).*$");
+ reg3=std::regex("^[a-zA-Z]:[\\\\/]");
+ reg4=std::regex("^([a-zA-Z]:[\\\\/]).*$");
+ #endif
+ /// \warn ULTRACOPIER_DEBUGCONSOLE() don't work here because the sinal slot is not connected!
+}
+
+//get drive of an file or folder
+/// \todo do network drive support for windows
+std::string DriveManagement::getDrive(const std::string &fileOrFolder) const
+{
+ const std::string &inode=QDir::toNativeSeparators(QString::fromStdString(fileOrFolder)).toStdString();
+ int size=mountSysPoint.size();
+ for (int i = 0; i < size; ++i) {
+ if(stringStartWith(inode,mountSysPoint.at(i)))
+ return QDir::toNativeSeparators(QString::fromStdString(mountSysPoint.at(i))).toStdString();
+ }
+ #ifdef Q_OS_WIN32
+ if(std::regex_match(fileOrFolder,reg1))
+ {
+ std::string returnString=fileOrFolder;
+ std::regex_replace(returnString,reg2,"$1");
+ return returnString;
+ }
+ //due to lack of WMI support into mingw, the new drive event is never called, this is a workaround
+ if(std::regex_match(fileOrFolder,reg3))
+ {
+ std::string returnString=fileOrFolder;
+ std::regex_replace(returnString,reg4,"$1");
+ return QDir::toNativeSeparators(QString::fromStdString(returnString)).toUpper().toStdString();
+ }
+ #endif
+ //if unable to locate the right mount point
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"unable to locate the right mount point for: "+fileOrFolder+", mount point: "+stringimplode(mountSysPoint,";"));
+ return std::string();
+}
+
+QByteArray DriveManagement::getDriveType(const std::string &drive) const
+{
+ int index=vectorindexOf(mountSysPoint,drive);
+ if(index!=-1)
+ return driveType.at(index);
+ return QByteArray();
+}
+
+bool DriveManagement::isSameDrive(const std::string &file1,const std::string &file2) const
+{
+ if(mountSysPoint.size()==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"no mount point found");
+ return false;
+ }
+ const std::string &drive1=getDrive(file1);
+ if(drive1.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"drive for the file1 not found: "+file1);
+ return false;
+ }
+ const std::string &drive2=getDrive(file2);
+ if(drive2.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"drive for the file2 not found: "+file2);
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,drive1+" is egal to "+drive2);
+ if(drive1==drive2)
+ return true;
+ else
+ return false;
+}
+
+void DriveManagement::tryUpdate()
+{
+ mountSysPoint.clear();
+ driveType.clear();
+ const QList<QStorageInfo> mountedVolumesList=QStorageInfo::mountedVolumes();
+ int index=0;
+ while(index<mountedVolumesList.size())
+ {
+ mountSysPoint.push_back(QDir::toNativeSeparators(mountedVolumesList.at(index).rootPath()).toStdString());
+ #ifdef Q_OS_WIN32
+ if(mountSysPoint.back()!="A:\\" && mountSysPoint.back()!="A:/" && mountSysPoint.back()!="A:" && mountSysPoint.back()!="A" &&
+ mountSysPoint.back()!="a:\\" && mountSysPoint.back()!="a:/" && mountSysPoint.back()!="a:" && mountSysPoint.back()!="a")
+ driveType.push_back(mountedVolumesList.at(index).fileSystemType());
+ else
+ driveType.push_back(QByteArray());
+ #else
+ driveType.push_back(mountedVolumesList.at(index).fileSystemType());
+ #endif
+ index++;
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier/DriveManagement.h b/plugins/CopyEngine/Ultracopier/DriveManagement.h
new file mode 100644
index 0000000..8013b7c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/DriveManagement.h
@@ -0,0 +1,34 @@
+#ifndef DRIVEMANAGEMENT_H
+#define DRIVEMANAGEMENT_H
+
+#include <QObject>
+#include <QString>
+#include <QStringList>
+#include <QRegularExpression>
+#include <QStorageInfo>
+#include <QTimer>
+
+#include "Environment.h"
+
+class DriveManagement : public QObject
+{
+ Q_OBJECT
+public:
+ explicit DriveManagement();
+ bool isSameDrive(const std::string &file1, const std::string &file2) const;
+ /// \brief get drive of an file or folder
+ std::string getDrive(const std::string &fileOrFolder) const;
+ QByteArray getDriveType(const std::string &drive) const;
+ void tryUpdate();
+protected:
+ std::vector<std::string> mountSysPoint;
+ std::vector<QByteArray> driveType;
+ #ifdef Q_OS_WIN32
+ std::regex reg1,reg2,reg3,reg4;
+ #endif
+signals:
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+};
+
+#endif // DRIVEMANAGEMENT_H
diff --git a/plugins/CopyEngine/Ultracopier/Environment.h b/plugins/CopyEngine/Ultracopier/Environment.h
new file mode 100644
index 0000000..34db2a2
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Environment.h
@@ -0,0 +1,11 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "StructEnumDefinition_CopyEngine.h"
+#include "DebugEngineMacro.h"
+#include "CompilerInfo.h"
diff --git a/plugins/CopyEngine/Ultracopier/FileErrorDialog.cpp b/plugins/CopyEngine/Ultracopier/FileErrorDialog.cpp
new file mode 100644
index 0000000..d88fb90
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FileErrorDialog.cpp
@@ -0,0 +1,163 @@
+#include "FileErrorDialog.h"
+#include "ui_fileErrorDialog.h"
+#include "TransferThread.h"
+
+#include <QString>
+
+bool FileErrorDialog::isInAdmin=false;
+
+FileErrorDialog::FileErrorDialog(QWidget *parent, QFileInfo fileInfo, std::string errorString, const ErrorType &errorType) :
+ QDialog(parent),
+ ui(new Ui::fileErrorDialog)
+{
+ Qt::WindowFlags flags = windowFlags();
+ #ifdef Q_OS_LINUX
+ flags=flags & ~Qt::X11BypassWindowManagerHint;
+ #endif
+ flags=flags | Qt::WindowStaysOnTopHint;
+ setWindowFlags(flags);
+
+ ui->setupUi(this);
+ action=FileError_Cancel;
+ ui->label_error->setText(QString::fromStdString(errorString));
+ if(fileInfo.exists())
+ {
+ ui->label_content_file_name->setText(QString::fromStdString(TransferThread::resolvedName(fileInfo)));
+ if(ui->label_content_file_name->text().isEmpty())
+ {
+ ui->label_content_file_name->setText(fileInfo.absoluteFilePath());
+ ui->label_folder->setVisible(false);
+ ui->label_content_folder->setVisible(false);
+ }
+ else
+ {
+ QString folder=fileInfo.absolutePath();
+ if(folder.size()>80)
+ folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
+ ui->label_content_folder->setText(fileInfo.absolutePath());
+ }
+ ui->label_content_size->setText(QString::number(fileInfo.size()));
+ QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+ if(maxTime<fileInfo.lastModified())
+ {
+ ui->label_modified->setVisible(true);
+ ui->label_content_modified->setVisible(true);
+ ui->label_content_modified->setText(fileInfo.lastModified().toString());
+ }
+ else
+ {
+ ui->label_modified->setVisible(false);
+ ui->label_content_modified->setVisible(false);
+ }
+ if(fileInfo.isDir())
+ {
+ this->setWindowTitle(tr("Error on folder"));
+ ui->label_size->hide();
+ ui->label_content_size->hide();
+ ui->label_file_name->setText(tr("Folder name"));
+ }
+ ui->label_file_destination->setVisible(fileInfo.isSymLink());
+ ui->label_content_file_destination->setVisible(fileInfo.isSymLink());
+ if(fileInfo.isSymLink())
+ ui->label_content_file_destination->setText(fileInfo.symLinkTarget());
+ }
+ else
+ {
+ ui->label_content_file_name->setText(QString::fromStdString(TransferThread::resolvedName(fileInfo)));
+ if(ui->label_content_file_name->text().isEmpty())
+ {
+ ui->label_content_file_name->setText(fileInfo.absoluteFilePath());
+ ui->label_folder->setVisible(false);
+ ui->label_content_folder->setVisible(false);
+ }
+ else
+ ui->label_content_folder->setText(fileInfo.absolutePath());
+
+ ui->label_file_destination->hide();
+ ui->label_content_file_destination->hide();
+ ui->label_size->hide();
+ ui->label_content_size->hide();
+ ui->label_modified->hide();
+ ui->label_content_modified->hide();
+ }
+ if(errorType==ErrorType_Folder || errorType==ErrorType_FolderWithRety)
+ ui->PutToBottom->hide();
+ if(errorType==ErrorType_Folder)
+ ui->Retry->hide();
+
+ ui->Rights->hide();
+ #ifdef ULTRACOPIER_PLUGIN_RIGHTS
+ if(isInAdmin)
+ ui->Rights->hide();
+ #ifdef Q_OS_WIN32
+ if(errorType!=ErrorType_Rights)
+ ui->Rights->hide();
+ #else
+ ui->Rights->hide();
+ #endif
+ #else
+ ui->Rights->hide();
+ #endif
+}
+
+FileErrorDialog::~FileErrorDialog()
+{
+ delete ui;
+}
+
+void FileErrorDialog::changeEvent(QEvent *e)
+{
+ QWidget::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+void FileErrorDialog::on_PutToBottom_clicked()
+{
+ action=FileError_PutToEndOfTheList;
+ this->close();
+}
+
+void FileErrorDialog::on_Retry_clicked()
+{
+ action=FileError_Retry;
+ this->close();
+}
+
+void FileErrorDialog::on_Skip_clicked()
+{
+ action=FileError_Skip;
+ this->close();
+}
+
+void FileErrorDialog::on_Cancel_clicked()
+{
+ action=FileError_Cancel;
+ this->close();
+}
+
+bool FileErrorDialog::getAlways()
+{
+ return ui->checkBoxAlways->isChecked();
+}
+
+FileErrorAction FileErrorDialog::getAction()
+{
+ return action;
+}
+
+void FileErrorDialog::on_checkBoxAlways_clicked()
+{
+ ui->Rights->setEnabled(!ui->checkBoxAlways->isChecked());
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RIGHTS
+void FileErrorDialog::on_Rights_clicked()
+{
+}
+#endif
diff --git a/plugins/CopyEngine/Ultracopier/FileErrorDialog.h b/plugins/CopyEngine/Ultracopier/FileErrorDialog.h
new file mode 100644
index 0000000..133a8b0
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FileErrorDialog.h
@@ -0,0 +1,51 @@
+/** \file fileErrorDialog.h
+\brief Define the dialog error on the file
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QDialog>
+#include <QWidget>
+#include <QString>
+#include <QDateTime>
+#include <QFileInfo>
+#include "Environment.h"
+
+#ifndef FILEERRORDIALOG_H
+#define FILEERRORDIALOG_H
+
+
+
+namespace Ui {
+ class fileErrorDialog;
+}
+
+/// \brief to show error dialog, and ask what do
+class FileErrorDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ /// \brief create the object and pass all the informations to it
+ explicit FileErrorDialog(QWidget *parent,QFileInfo fileInfo,std::string errorString,const ErrorType &errorType);
+ ~FileErrorDialog();
+ /// \brief return the the always checkbox is checked
+ bool getAlways();
+ /// \brief return the action clicked
+ FileErrorAction getAction();
+protected:
+ void changeEvent(QEvent *e);
+ static bool isInAdmin;
+private slots:
+ void on_PutToBottom_clicked();
+ void on_Retry_clicked();
+ void on_Skip_clicked();
+ void on_Cancel_clicked();
+ void on_checkBoxAlways_clicked();
+ #ifdef ULTRACOPIER_PLUGIN_RIGHTS
+ void on_Rights_clicked();
+ #endif
+private:
+ Ui::fileErrorDialog *ui;
+ FileErrorAction action;
+};
+
+#endif // FILEERRORDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier/FileExistsDialog.cpp b/plugins/CopyEngine/Ultracopier/FileExistsDialog.cpp
new file mode 100644
index 0000000..91df1f8
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FileExistsDialog.cpp
@@ -0,0 +1,244 @@
+#include "FileExistsDialog.h"
+#include "ui_fileExistsDialog.h"
+#include "TransferThread.h"
+
+#ifdef Q_OS_WIN32
+#define CURRENTSEPARATOR "\\"
+#else
+#define CURRENTSEPARATOR "/"
+#endif
+
+#include <QRegularExpression>
+#include <QFileInfo>
+#include <QMessageBox>
+
+FileExistsDialog::FileExistsDialog(QWidget *parent, QFileInfo source, QFileInfo destination, std::string firstRenamingRule, std::string otherRenamingRule) :
+ QDialog(parent),
+ ui(new Ui::fileExistsDialog)
+{
+ Qt::WindowFlags flags = windowFlags();
+ #ifdef Q_OS_LINUX
+ flags=flags & ~Qt::X11BypassWindowManagerHint;
+ #endif
+ flags=flags | Qt::WindowStaysOnTopHint;
+ setWindowFlags(flags);
+
+ ui->setupUi(this);
+ action=FileExists_Cancel;
+ destinationInfo=destination;
+ oldName=TransferThread::resolvedName(destination);
+ ui->lineEditNewName->setText(QString::fromStdString(oldName));
+ ui->lineEditNewName->setPlaceholderText(QString::fromStdString(oldName));
+ ui->Overwrite->addAction(ui->actionOverwrite_if_newer);
+ ui->Overwrite->addAction(ui->actionOverwrite_if_not_same_modification_date);
+ ui->label_content_source_size->setText(QString::number(source.size()));
+ ui->label_content_source_modified->setText(source.lastModified().toString());
+ ui->label_content_source_file_name->setText(QString::fromStdString(TransferThread::resolvedName(source)));
+ QString folder=source.absolutePath();
+ if(folder.size()>80)
+ folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
+ ui->label_content_source_folder->setText(folder);
+ ui->label_content_destination_size->setText(QString::number(destination.size()));
+ ui->label_content_destination_modified->setText(destination.lastModified().toString());
+ ui->label_content_destination_file_name->setText(QString::fromStdString(TransferThread::resolvedName(destination)));
+ folder=destination.absolutePath();
+ if(folder.size()>80)
+ folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
+ ui->label_content_destination_folder->setText(folder);
+ QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+ if(maxTime<source.lastModified())
+ {
+ ui->label_source_modified->setVisible(true);
+ ui->label_content_source_modified->setVisible(true);
+ ui->label_content_source_modified->setText(source.lastModified().toString());
+ }
+ else
+ {
+ ui->label_source_modified->setVisible(false);
+ ui->label_content_source_modified->setVisible(false);
+ }
+ if(maxTime<destination.lastModified())
+ {
+ ui->label_destination_modified->setVisible(true);
+ ui->label_content_destination_modified->setVisible(true);
+ ui->label_content_destination_modified->setText(destination.lastModified().toString());
+ }
+ else
+ {
+ ui->label_destination_modified->setVisible(false);
+ ui->label_content_destination_modified->setVisible(false);
+ }
+ if(!source.exists())
+ {
+ ui->label_content_source_size->setVisible(false);
+ ui->label_source_size->setVisible(false);
+ ui->label_source_modified->setVisible(false);
+ ui->label_content_source_modified->setVisible(false);
+ }
+ if(!destination.exists())
+ {
+ ui->label_content_destination_size->setVisible(false);
+ ui->label_destination_size->setVisible(false);
+ ui->label_destination_modified->setVisible(false);
+ ui->label_content_destination_modified->setVisible(false);
+ }
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ on_SuggestNewName_clicked();
+}
+
+FileExistsDialog::~FileExistsDialog()
+{
+ delete ui;
+}
+
+void FileExistsDialog::changeEvent(QEvent *e)
+{
+ QWidget::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+std::string FileExistsDialog::getNewName()
+{
+ if(oldName==ui->lineEditNewName->text().toStdString() || ui->checkBoxAlways->isChecked())
+ return oldName;
+ else
+ return ui->lineEditNewName->text().toStdString();
+}
+
+void FileExistsDialog::on_SuggestNewName_clicked()
+{
+ QFileInfo destinationInfo=this->destinationInfo;
+ QString absolutePath=destinationInfo.absolutePath();
+ QString fileName=QString::fromStdString(TransferThread::resolvedName(destinationInfo));
+ QString suffix="";
+ QString destination;
+ QString newFileName;
+ //resolv the suffix
+ if(fileName.contains(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$"))))
+ {
+ suffix=fileName;
+ suffix.replace(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$")),QStringLiteral("\\2"));
+ fileName.replace(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$")),QStringLiteral("\\1"));
+ }
+ //resolv the new name
+ int num=1;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ newFileName=tr("%1 - copy").arg(fileName);
+ else
+ {
+ newFileName=QString::fromStdString(firstRenamingRule);
+ newFileName.replace("%name%",fileName);
+ }
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ newFileName=tr("%1 - copy (%2)").arg(fileName).arg(num);
+ else
+ {
+ newFileName=QString::fromStdString(otherRenamingRule);
+ newFileName.replace(QStringLiteral("%name%"),fileName);
+ newFileName.replace(QStringLiteral("%number%"),QString::number(num));
+ }
+ }
+ destination=absolutePath+CURRENTSEPARATOR+newFileName+suffix;
+ destinationInfo.setFile(destination);
+ num++;
+ }
+ while(destinationInfo.exists());
+ ui->lineEditNewName->setText(newFileName+suffix);
+}
+
+void FileExistsDialog::on_Rename_clicked()
+{
+ action=FileExists_Rename;
+ this->close();
+}
+
+void FileExistsDialog::on_Overwrite_clicked()
+{
+ action=FileExists_Overwrite;
+ this->close();
+}
+
+void FileExistsDialog::on_Skip_clicked()
+{
+ action=FileExists_Skip;
+ this->close();
+}
+
+void FileExistsDialog::on_Cancel_clicked()
+{
+ action=FileExists_Cancel;
+ this->close();
+}
+
+void FileExistsDialog::on_actionOverwrite_if_newer_triggered()
+{
+ action=FileExists_OverwriteIfNewer;
+ this->close();
+}
+
+void FileExistsDialog::on_actionOverwrite_if_not_same_modification_date_triggered()
+{
+ action=FileExists_OverwriteIfNotSame;
+ this->close();
+}
+
+FileExistsAction FileExistsDialog::getAction()
+{
+ return action;
+}
+
+bool FileExistsDialog::getAlways()
+{
+ return ui->checkBoxAlways->isChecked();
+}
+
+void FileExistsDialog::updateRenameButton()
+{
+ ui->Rename->setEnabled(ui->checkBoxAlways->isChecked() || (!ui->lineEditNewName->text().contains(QRegularExpression("[/\\\\\\*]")) && oldName!=ui->lineEditNewName->text().toStdString() && !ui->lineEditNewName->text().isEmpty()));
+}
+
+void FileExistsDialog::on_checkBoxAlways_toggled(bool checked)
+{
+ Q_UNUSED(checked);
+ updateRenameButton();
+}
+
+void FileExistsDialog::on_lineEditNewName_textChanged(const QString &arg1)
+{
+ Q_UNUSED(arg1);
+ updateRenameButton();
+}
+
+void FileExistsDialog::on_lineEditNewName_returnPressed()
+{
+ updateRenameButton();
+ if(ui->Rename->isEnabled())
+ on_Rename_clicked();
+ else
+ QMessageBox::warning(this,tr("Error"),tr("Try rename with using special characters"));
+}
+
+void FileExistsDialog::on_actionOverwrite_if_older_triggered()
+{
+ action=FileExists_OverwriteIfOlder;
+ this->close();
+}
+
+void FileExistsDialog::on_lineEditNewName_editingFinished()
+{
+ updateRenameButton();
+}
diff --git a/plugins/CopyEngine/Ultracopier/FileExistsDialog.h b/plugins/CopyEngine/Ultracopier/FileExistsDialog.h
new file mode 100644
index 0000000..05ff7e0
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FileExistsDialog.h
@@ -0,0 +1,60 @@
+/** \file fileExistsDialog.h
+\brief Define the dialog when file already exists
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QDialog>
+#include <QWidget>
+#include <QString>
+#include <QDateTime>
+#include <QFileInfo>
+#include <QDir>
+#include "Environment.h"
+
+#ifndef FILEEXISTSDIALOG_H
+#define FILEEXISTSDIALOG_H
+
+namespace Ui {
+ class fileExistsDialog;
+}
+
+/// \brief to show file exists dialog, and ask what do
+class FileExistsDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ /// \brief create the object and pass all the informations to it
+ explicit FileExistsDialog(QWidget *parent,QFileInfo source,QFileInfo destination,std::string firstRenamingRule,std::string otherRenamingRule);
+ ~FileExistsDialog();
+ /// \brief return the the always checkbox is checked
+ bool getAlways();
+ /// \brief return the action clicked
+ FileExistsAction getAction();
+ /// \brief return the new rename is case in manual renaming
+ std::string getNewName();
+protected:
+ void changeEvent(QEvent *e);
+private slots:
+ void on_SuggestNewName_clicked();
+ void on_Rename_clicked();
+ void on_Overwrite_clicked();
+ void on_Skip_clicked();
+ void on_Cancel_clicked();
+ void on_actionOverwrite_if_newer_triggered();
+ void on_actionOverwrite_if_not_same_modification_date_triggered();
+ void updateRenameButton();
+ void on_checkBoxAlways_toggled(bool checked);
+ void on_lineEditNewName_textChanged(const QString &arg1);
+ void on_lineEditNewName_returnPressed();
+ void on_actionOverwrite_if_older_triggered();
+ void on_lineEditNewName_editingFinished();
+private:
+ Ui::fileExistsDialog *ui;
+ FileExistsAction action;
+ std::string oldName;
+ QFileInfo destinationInfo;
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+};
+
+#endif // FILEEXISTSDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier/FileIsSameDialog.cpp b/plugins/CopyEngine/Ultracopier/FileIsSameDialog.cpp
new file mode 100644
index 0000000..3bee3ae
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FileIsSameDialog.cpp
@@ -0,0 +1,194 @@
+#include "FileIsSameDialog.h"
+#include "ui_fileIsSameDialog.h"
+#include "TransferThread.h"
+
+#ifdef Q_OS_WIN32
+#define CURRENTSEPARATOR "\\"
+#else
+#define CURRENTSEPARATOR "/"
+#endif
+
+#include <QRegularExpression>
+#include <QFileInfo>
+#include <QMessageBox>
+
+FileIsSameDialog::FileIsSameDialog(QWidget *parent, QFileInfo fileInfo, std::string firstRenamingRule, std::string otherRenamingRule) :
+ QDialog(parent),
+ ui(new Ui::fileIsSameDialog)
+{
+ Qt::WindowFlags flags = windowFlags();
+ #ifdef Q_OS_LINUX
+ flags=flags & ~Qt::X11BypassWindowManagerHint;
+ #endif
+ flags=flags | Qt::WindowStaysOnTopHint;
+ setWindowFlags(flags);
+
+ ui->setupUi(this);
+ action=FileExists_Cancel;
+ oldName=TransferThread::resolvedName(fileInfo);
+ destinationInfo=fileInfo;
+ ui->lineEditNewName->setText(QString::fromStdString(oldName));
+ ui->lineEditNewName->setPlaceholderText(QString::fromStdString(oldName));
+ ui->label_content_size->setText(QString::number(fileInfo.size()));
+ ui->label_content_modified->setText(fileInfo.lastModified().toString());
+ ui->label_content_file_name->setText(QString::fromStdString(TransferThread::resolvedName(fileInfo)));
+ QString folder=fileInfo.absolutePath();
+ if(folder.size()>80)
+ folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
+ ui->label_content_folder->setText(folder);
+ updateRenameButton();
+ QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+ if(maxTime<fileInfo.lastModified())
+ {
+ ui->label_modified->setVisible(true);
+ ui->label_content_modified->setVisible(true);
+ ui->label_content_modified->setText(fileInfo.lastModified().toString());
+ }
+ else
+ {
+ ui->label_modified->setVisible(false);
+ ui->label_content_modified->setVisible(false);
+ }
+ if(!fileInfo.exists())
+ {
+ ui->label_content_size->setVisible(false);
+ ui->label_size->setVisible(false);
+ ui->label_modified->setVisible(false);
+ ui->label_content_modified->setVisible(false);
+ }
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ on_SuggestNewName_clicked();
+}
+
+FileIsSameDialog::~FileIsSameDialog()
+{
+ delete ui;
+}
+
+void FileIsSameDialog::changeEvent(QEvent *e)
+{
+ QWidget::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+std::string FileIsSameDialog::getNewName()
+{
+ if(oldName==ui->lineEditNewName->text().toStdString() || ui->checkBoxAlways->isChecked())
+ return oldName;
+ else
+ return ui->lineEditNewName->text().toStdString();
+}
+
+void FileIsSameDialog::on_SuggestNewName_clicked()
+{
+ QFileInfo destinationInfo=this->destinationInfo;
+ QString absolutePath=destinationInfo.absolutePath();
+ QString fileName=QString::fromStdString(TransferThread::resolvedName(destinationInfo));
+ QString suffix="";
+ QString destination;
+ QString newFileName;
+ //resolv the suffix
+ if(fileName.contains(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$"))))
+ {
+ suffix=fileName;
+ suffix.replace(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$")),QStringLiteral("\\2"));
+ fileName.replace(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$")),QStringLiteral("\\1"));
+ }
+ //resolv the new name
+ int num=1;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ newFileName=tr("%1 - copy").arg(fileName);
+ else
+ {
+ newFileName=QString::fromStdString(firstRenamingRule);
+ newFileName.replace(QStringLiteral("%name%"),fileName);
+ }
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ newFileName=tr("%1 - copy (%2)").arg(fileName).arg(num);
+ else
+ {
+ newFileName=QString::fromStdString(otherRenamingRule);
+ newFileName.replace(QStringLiteral("%name%"),fileName);
+ newFileName.replace(QStringLiteral("%number%"),QString::number(num));
+ }
+ }
+ destination=absolutePath+CURRENTSEPARATOR+newFileName+suffix;
+ destinationInfo.setFile(destination);
+ num++;
+ }
+ while(destinationInfo.exists());
+ ui->lineEditNewName->setText(newFileName+suffix);
+}
+
+void FileIsSameDialog::on_Rename_clicked()
+{
+ action=FileExists_Rename;
+ this->close();
+}
+
+void FileIsSameDialog::on_Skip_clicked()
+{
+ action=FileExists_Skip;
+ this->close();
+}
+
+void FileIsSameDialog::on_Cancel_clicked()
+{
+ action=FileExists_Cancel;
+ this->close();
+}
+
+FileExistsAction FileIsSameDialog::getAction()
+{
+ return action;
+}
+
+bool FileIsSameDialog::getAlways()
+{
+ return ui->checkBoxAlways->isChecked();
+}
+
+void FileIsSameDialog::updateRenameButton()
+{
+ ui->Rename->setEnabled(ui->checkBoxAlways->isChecked() || (!ui->lineEditNewName->text().contains(QRegularExpression("[/\\\\\\*]")) && oldName!=ui->lineEditNewName->text().toStdString() && !ui->lineEditNewName->text().isEmpty()));
+}
+
+void FileIsSameDialog::on_lineEditNewName_textChanged(const QString &arg1)
+{
+ Q_UNUSED(arg1);
+ updateRenameButton();
+}
+
+void FileIsSameDialog::on_checkBoxAlways_toggled(bool checked)
+{
+ Q_UNUSED(checked);
+ updateRenameButton();
+}
+
+void FileIsSameDialog::on_lineEditNewName_returnPressed()
+{
+ updateRenameButton();
+ if(ui->Rename->isEnabled())
+ on_Rename_clicked();
+ else
+ QMessageBox::warning(this,tr("Error"),tr("Try rename with using special characters"));
+}
+
+void FileIsSameDialog::on_lineEditNewName_editingFinished()
+{
+ updateRenameButton();
+}
diff --git a/plugins/CopyEngine/Ultracopier/FileIsSameDialog.h b/plugins/CopyEngine/Ultracopier/FileIsSameDialog.h
new file mode 100644
index 0000000..5dc0067
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FileIsSameDialog.h
@@ -0,0 +1,57 @@
+/** \file fileIsSameDialog.h
+\brief Define the dialog when file is same
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QDialog>
+#include <QWidget>
+#include <QString>
+#include <QDateTime>
+#include <QFileInfo>
+#include <QDir>
+#include "Environment.h"
+
+#ifndef FILEISSAMEDIALOG_H
+#define FILEISSAMEDIALOG_H
+
+namespace Ui {
+ class fileIsSameDialog;
+}
+
+/// \brief to show file is same dialog, and ask what do
+class FileIsSameDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ /// \brief create the object and pass all the informations to it
+ explicit FileIsSameDialog(QWidget *parent,QFileInfo fileInfo,std::string firstRenamingRule,std::string otherRenamingRule);
+ ~FileIsSameDialog();
+ /// \brief return the the always checkbox is checked
+ bool getAlways();
+ /// \brief return the action clicked
+ FileExistsAction getAction();
+ /// \brief return the new rename is case in manual renaming
+ std::string getNewName();
+protected:
+ void changeEvent(QEvent *e);
+private slots:
+ void on_SuggestNewName_clicked();
+ void on_Rename_clicked();
+ void on_Skip_clicked();
+ void on_Cancel_clicked();
+ void updateRenameButton();
+ void on_lineEditNewName_textChanged(const QString &arg1);
+ void on_checkBoxAlways_toggled(bool checked);
+ void on_lineEditNewName_returnPressed();
+ void on_lineEditNewName_editingFinished();
+private:
+ Ui::fileIsSameDialog *ui;
+ FileExistsAction action;
+ std::string oldName;
+ QFileInfo destinationInfo;
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+
+};
+
+#endif // FILEISSAMEDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier/FilterRules.cpp b/plugins/CopyEngine/Ultracopier/FilterRules.cpp
new file mode 100644
index 0000000..0f6bf2c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FilterRules.cpp
@@ -0,0 +1,193 @@
+#include "FilterRules.h"
+#include "ui_FilterRules.h"
+
+#include <QRegularExpression>
+
+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;
+}
+
+std::string FilterRules::get_search_text()
+{
+ return ui->search->text().toStdString();
+}
+
+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(std::string search_text)
+{
+ ui->search->setText(QString::fromStdString(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 std::string &arg1)
+{
+ Q_UNUSED(arg1);
+ updateChecking();
+}
+
+void FilterRules::updateChecking()
+{
+ QRegularExpression regex;
+ isValid=!ui->search->text().isEmpty();
+ if(isValid)
+ {
+ QString tempString;
+ if(ui->search_type->currentIndex()==0)
+ {
+ tempString=QRegularExpression::escape(ui->search->text());
+ if(tempString.contains('/') || tempString.contains('\\'))
+ isValid=false;
+ }
+ else if(ui->search_type->currentIndex()==1)
+ {
+ tempString=QRegularExpression::escape(ui->search->text());
+ tempString.replace(QStringLiteral("\\*"),QStringLiteral("[^\\\\/]*"));
+ }
+ else if(ui->search_type->currentIndex()==2)
+ {
+ tempString=ui->search->text();
+ if(tempString.startsWith('^') && tempString.endsWith('$'))
+ {
+ ui->need_match_all->setChecked(true);
+ tempString.remove(QRegularExpression(QStringLiteral("^\\^")));
+ tempString.remove(QRegularExpression(QStringLiteral("\\$$")));
+ ui->search->setText(tempString);
+ }
+ }
+ if(isValid)
+ {
+ if(ui->need_match_all->isChecked())
+ tempString=QStringLiteral("^")+tempString+QStringLiteral("$");
+ regex=QRegularExpression(tempString);
+ isValid=regex.isValid();
+ }
+ }
+
+ 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 std::string &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/CopyEngine/Ultracopier/FilterRules.h b/plugins/CopyEngine/Ultracopier/FilterRules.h
new file mode 100644
index 0000000..0838792
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/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();
+ std::string get_search_text();
+ SearchType get_search_type();
+ ApplyOn get_apply_on();
+ bool get_need_match_all();
+ void set_search_text(std::string 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 std::string &arg1);
+ void on_isValid_clicked();
+ void on_testString_textChanged(const std::string &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/CopyEngine/Ultracopier/FilterRules.ui b/plugins/CopyEngine/Ultracopier/FilterRules.ui
new file mode 100644
index 0000000..a4006fe
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/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="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/resources/resources/filter.png</normaloff>:/CopyEngine/resources/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>Whole string must 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 matches 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="copyEngineResources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/Filters.cpp b/plugins/CopyEngine/Ultracopier/Filters.cpp
new file mode 100644
index 0000000..c7b1526
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Filters.cpp
@@ -0,0 +1,460 @@
+#include "Filters.h"
+#include "ui_Filters.h"
+#include "../../../cpp11addition.h"
+
+#include <QRegularExpression>
+
+Filters::Filters(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::Filters)
+{
+ ui->setupUi(this);
+}
+
+Filters::~Filters()
+{
+ delete ui;
+}
+
+void Filters::setFilters(std::vector<std::string> includeStrings,std::vector<std::string> includeOptions,std::vector<std::string> excludeStrings,std::vector<std::string> excludeOptions)
+{
+ if(includeStrings.size()!=includeOptions.size() || excludeStrings.size()!=excludeOptions.size())
+ return;
+ Filters_rules new_item;
+
+ include.clear();
+ unsigned int index=0;
+ while(index<(unsigned int)includeStrings.size())
+ {
+ new_item.search_text=includeStrings.at(index);
+ std::vector<std::string> options=stringsplit(includeOptions.at(index),';');
+ new_item.need_match_all=false;
+ new_item.search_type=SearchType_rawText;
+ new_item.apply_on=ApplyOn_fileAndFolder;
+
+ if(vectorcontainsAtLeastOne(options,std::string("SearchType_simpleRegex")))
+ new_item.search_type=SearchType_simpleRegex;
+ if(vectorcontainsAtLeastOne(options,std::string("SearchType_perlRegex")))
+ new_item.search_type=SearchType_perlRegex;
+ if(vectorcontainsAtLeastOne(options,std::string("ApplyOn_file")))
+ new_item.apply_on=ApplyOn_file;
+ if(vectorcontainsAtLeastOne(options,std::string("ApplyOn_folder")))
+ new_item.apply_on=ApplyOn_folder;
+ if(vectorcontainsAtLeastOne(options,std::string("need_match_all")))
+ new_item.need_match_all=true;
+
+ if(convertToRegex(new_item))
+ include.push_back(new_item);
+
+ index++;
+ }
+
+ exclude.clear();
+ index=0;
+ while(index<excludeStrings.size())
+ {
+ new_item.search_text=excludeStrings.at(index);
+ std::vector<std::string> options=stringsplit(excludeOptions.at(index),';');
+ new_item.need_match_all=false;
+ new_item.search_type=SearchType_rawText;
+ new_item.apply_on=ApplyOn_fileAndFolder;
+
+ if(vectorcontainsAtLeastOne(options,std::string("SearchType_simpleRegex")))
+ new_item.search_type=SearchType_simpleRegex;
+ if(vectorcontainsAtLeastOne(options,std::string("SearchType_perlRegex")))
+ new_item.search_type=SearchType_perlRegex;
+ if(vectorcontainsAtLeastOne(options,std::string("ApplyOn_file")))
+ new_item.apply_on=ApplyOn_file;
+ if(vectorcontainsAtLeastOne(options,std::string("ApplyOn_folder")))
+ new_item.apply_on=ApplyOn_folder;
+ if(vectorcontainsAtLeastOne(options,std::string("need_match_all")))
+ new_item.need_match_all=true;
+
+ if(convertToRegex(new_item))
+ exclude.push_back(new_item);
+
+ index++;
+ }
+
+ reShowAll();
+}
+
+void Filters::reShowAll()
+{
+ ui->inclusion->clear();
+ unsigned int index=0;
+ while(index<(unsigned int)include.size())
+ {
+ std::string entryShow=include.at(index).search_text+" (";
+ std::vector<std::string> optionsToShow;
+ switch(include.at(index).search_type)
+ {
+ case SearchType_rawText:
+ optionsToShow.push_back(tr("Raw text").toStdString());
+ break;
+ case SearchType_simpleRegex:
+ optionsToShow.push_back(tr("Simplified regex").toStdString());
+ break;
+ case SearchType_perlRegex:
+ optionsToShow.push_back(tr("Perl's regex").toStdString());
+ break;
+ default:
+ break;
+ }
+ switch(include.at(index).apply_on)
+ {
+ case ApplyOn_file:
+ optionsToShow.push_back(tr("Only on file").toStdString());
+ break;
+ case ApplyOn_folder:
+ optionsToShow.push_back(tr("Only on folder").toStdString());
+ break;
+ default:
+ break;
+ }
+ if(include.at(index).need_match_all)
+ optionsToShow.push_back(tr("Full match").toStdString());
+ entryShow+=stringimplode(optionsToShow,",");
+ entryShow+=")";
+ ui->inclusion->addItem(new QListWidgetItem(QString::fromStdString(entryShow)));
+ index++;
+ }
+ ui->exclusion->clear();
+ index=0;
+ while(index<(unsigned int)exclude.size())
+ {
+ std::string entryShow=exclude.at(index).search_text+" (";
+ std::vector<std::string> optionsToShow;
+ switch(exclude.at(index).search_type)
+ {
+ case SearchType_rawText:
+ optionsToShow.push_back(tr("Raw text").toStdString());
+ break;
+ case SearchType_simpleRegex:
+ optionsToShow.push_back(tr("Simplified regex").toStdString());
+ break;
+ case SearchType_perlRegex:
+ optionsToShow.push_back(tr("Perl's regex").toStdString());
+ break;
+ default:
+ break;
+ }
+ switch(exclude.at(index).apply_on)
+ {
+ case ApplyOn_file:
+ optionsToShow.push_back(tr("Only on file").toStdString());
+ break;
+ case ApplyOn_folder:
+ optionsToShow.push_back(tr("Only on folder").toStdString());
+ break;
+ default:
+ break;
+ }
+ if(exclude.at(index).need_match_all)
+ optionsToShow.push_back(tr("Full match").toStdString());
+ entryShow+=stringimplode(optionsToShow,",");
+ entryShow+=")";
+ ui->exclusion->addItem(new QListWidgetItem(QString::fromStdString(entryShow)));
+ index++;
+ }
+}
+
+std::vector<Filters_rules> Filters::getInclude() const
+{
+ return include;
+}
+
+std::vector<Filters_rules> Filters::getExclude() const
+{
+ return exclude;
+}
+
+void Filters::newLanguageLoaded()
+{
+ ui->retranslateUi(this);
+ reShowAll();
+}
+
+void Filters::updateFilters()
+{
+ std::vector<std::string> includeStrings,includeOptions,excludeStrings,excludeOptions;
+ unsigned int index=0;
+ while(index<(unsigned int)include.size())
+ {
+ includeStrings.push_back(include.at(index).search_text);
+ std::vector<std::string> optionsToShow;
+
+ switch(include.at(index).search_type)
+ {
+ case SearchType_rawText:
+ optionsToShow.push_back("SearchType_rawText");
+ break;
+ case SearchType_simpleRegex:
+ optionsToShow.push_back("SearchType_simpleRegex");
+ break;
+ case SearchType_perlRegex:
+ optionsToShow.push_back("SearchType_perlRegex");
+ break;
+ default:
+ break;
+ }
+ switch(include.at(index).apply_on)
+ {
+ case ApplyOn_file:
+ optionsToShow.push_back("ApplyOn_file");
+ break;
+ case ApplyOn_fileAndFolder:
+ optionsToShow.push_back("ApplyOn_fileAndFolder");
+ break;
+ case ApplyOn_folder:
+ optionsToShow.push_back("ApplyOn_folder");
+ break;
+ default:
+ break;
+ }
+ if(include.at(index).need_match_all)
+ optionsToShow.push_back(tr("Full match").toStdString());
+ includeOptions.push_back(stringimplode(optionsToShow,";"));
+ index++;
+ }
+ index=0;
+ while(index<(unsigned int)exclude.size())
+ {
+ excludeStrings.push_back(exclude.at(index).search_text);
+ std::vector<std::string> optionsToShow;
+
+ switch(exclude.at(index).search_type)
+ {
+ case SearchType_rawText:
+ optionsToShow.push_back("SearchType_rawText");
+ break;
+ case SearchType_simpleRegex:
+ optionsToShow.push_back("SearchType_simpleRegex");
+ break;
+ case SearchType_perlRegex:
+ optionsToShow.push_back("SearchType_perlRegex");
+ break;
+ default:
+ break;
+ }
+ switch(exclude.at(index).apply_on)
+ {
+ case ApplyOn_file:
+ optionsToShow.push_back("ApplyOn_file");
+ break;
+ case ApplyOn_fileAndFolder:
+ optionsToShow.push_back("ApplyOn_fileAndFolder");
+ break;
+ case ApplyOn_folder:
+ optionsToShow.push_back("ApplyOn_folder");
+ break;
+ default:
+ break;
+ }
+ if(exclude.at(index).need_match_all)
+ optionsToShow.push_back(tr("Full match").toStdString());
+ excludeOptions.push_back(stringimplode(optionsToShow,";"));
+ index++;
+ }
+ emit sendNewFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ emit haveNewFilters();
+}
+
+bool Filters::convertToRegex(Filters_rules &item)
+{
+ bool isValid=!item.search_text.empty();
+ if(isValid)
+ {
+ std::regex regex;
+ std::string tempString;
+ if(item.search_type==SearchType_rawText)
+ {
+ tempString=QRegularExpression::escape(QString::fromStdString(item.search_text)).toStdString();
+ if(tempString.find('/') != std::string::npos || tempString.find('\\') != std::string::npos)
+ isValid=false;
+ }
+ else if(item.search_type==SearchType_simpleRegex)
+ {
+ tempString=QRegularExpression::escape(QString::fromStdString(item.search_text)).toStdString();
+ stringreplaceAll(tempString,"\\*","[^\\\\/]*");
+ }
+ else if(item.search_type==SearchType_perlRegex)
+ {
+ tempString=item.search_text;
+ if(stringStartWith(tempString,'^') && stringEndsWith(tempString,'$'))
+ {
+ item.need_match_all=true;
+ if(stringStartWith(tempString,'^'))
+ tempString=tempString.substr(1,tempString.size()-1);
+ if(stringEndsWith(tempString,'$'))
+ tempString=tempString.substr(0,tempString.size()-1);
+ item.search_text=tempString;
+ }
+ }
+ if(isValid)
+ {
+ if(item.need_match_all==true)
+ tempString="^"+tempString+"$";
+ regex=std::regex(tempString);
+ //isValid=regex.isValid();
+ 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.erase(exclude.cbegin()+index);
+ removedEntry=true;
+ }
+ else
+ index++;
+ }
+ if(removedEntry)
+ {
+ reShowAll();
+ updateFilters();
+ }
+}
+
+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.erase(include.cbegin()+index);
+ removedEntry=true;
+ }
+ else
+ index++;
+ }
+ if(removedEntry)
+ {
+ reShowAll();
+ updateFilters();
+ }
+}
+
+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.push_back(new_item);
+ reShowAll();
+ updateFilters();
+ }
+}
+
+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.push_back(new_item);
+ reShowAll();
+ updateFilters();
+ }
+}
+
+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.at(index).apply_on);
+ dialog.set_need_match_all(exclude.at(index).need_match_all);
+ dialog.set_search_text(exclude.at(index).search_text);
+ dialog.set_search_type(exclude.at(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.erase(exclude.cbegin()+index);
+ editedEntry=true;
+ }
+ }
+ index++;
+ }
+ if(editedEntry)
+ {
+ reShowAll();
+ updateFilters();
+ }
+}
+
+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.at(index).apply_on);
+ dialog.set_need_match_all(exclude.at(index).need_match_all);
+ dialog.set_search_text(exclude.at(index).search_text);
+ dialog.set_search_type(exclude.at(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.erase(exclude.cbegin()+index);
+ editedEntry=true;
+ }
+ }
+ index++;
+ }
+ if(editedEntry)
+ {
+ reShowAll();
+ updateFilters();
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier/Filters.h b/plugins/CopyEngine/Ultracopier/Filters.h
new file mode 100644
index 0000000..6645afc
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Filters.h
@@ -0,0 +1,45 @@
+#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(std::vector<std::string> includeStrings, std::vector<std::string> includeOptions, std::vector<std::string> excludeStrings, std::vector<std::string> excludeOptions);
+ void reShowAll();
+ std::vector<Filters_rules> getInclude() const;
+ std::vector<Filters_rules> getExclude() const;
+ void newLanguageLoaded();
+private:
+ Ui::Filters *ui;
+ std::vector<Filters_rules> include;
+ std::vector<Filters_rules> exclude;
+ void updateFilters();
+ bool convertToRegex(Filters_rules &item);
+signals:
+ void sendNewFilters(const std::vector<std::string> &includeStrings,const std::vector<std::string> &includeOptions,const std::vector<std::string> &excludeStrings,const std::vector<std::string> &excludeOptions) const;
+ void haveNewFilters() const;
+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/CopyEngine/Ultracopier/Filters.ui b/plugins/CopyEngine/Ultracopier/Filters.ui
new file mode 100644
index 0000000..33822af
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/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>:/CopyEngine/Ultracopier/resources/filter.png</normaloff>:/CopyEngine/Ultracopier/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 filters</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>:/CopyEngine/Ultracopier/resources/add.png</normaloff>:/CopyEngine/Ultracopier/resources/add.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="edit_exclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier/resources/edit.png</normaloff>:/CopyEngine/Ultracopier/resources/edit.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="remove_exclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier/resources/remove.png</normaloff>:/CopyEngine/Ultracopier/resources/remove.png</iconset>
+ </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 filters</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>:/CopyEngine/Ultracopier/resources/add.png</normaloff>:/CopyEngine/Ultracopier/resources/add.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="edit_inclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier/resources/edit.png</normaloff>:/CopyEngine/Ultracopier/resources/edit.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="remove_inclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier/resources/remove.png</normaloff>:/CopyEngine/Ultracopier/resources/remove.png</iconset>
+ </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/CopyEngine/Ultracopier/FolderExistsDialog.cpp b/plugins/CopyEngine/Ultracopier/FolderExistsDialog.cpp
new file mode 100644
index 0000000..d05a715
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FolderExistsDialog.cpp
@@ -0,0 +1,205 @@
+#include "FolderExistsDialog.h"
+#include "ui_folderExistsDialog.h"
+#include "TransferThread.h"
+
+#ifdef Q_OS_WIN32
+#define CURRENTSEPARATOR "\\"
+#else
+#define CURRENTSEPARATOR "/"
+#endif
+
+#include <QMessageBox>
+#include <QFileInfo>
+#include <QMessageBox>
+
+FolderExistsDialog::FolderExistsDialog(QWidget *parent, QFileInfo source, bool isSame, QFileInfo destination, std::string firstRenamingRule, std::string otherRenamingRule) :
+ QDialog(parent),
+ ui(new Ui::folderExistsDialog)
+{
+ Qt::WindowFlags flags = windowFlags();
+ #ifdef Q_OS_LINUX
+ flags=flags & ~Qt::X11BypassWindowManagerHint;
+ #endif
+ flags=flags | Qt::WindowStaysOnTopHint;
+ setWindowFlags(flags);
+
+ ui->setupUi(this);
+ action=FolderExists_Cancel;
+ oldName=TransferThread::resolvedName(destination);
+ ui->lineEditNewName->setText(QString::fromStdString(oldName));
+ ui->lineEditNewName->setPlaceholderText(QString::fromStdString(oldName));
+ ui->label_content_source_modified->setText(source.lastModified().toString());
+ ui->label_content_source_folder_name->setText(source.fileName());
+ QString folder=source.absolutePath();
+ if(folder.size()>80)
+ folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
+ ui->label_content_source_folder->setText(folder);
+ if(ui->label_content_source_folder_name->text().isEmpty())
+ {
+ ui->label_source_folder_name->hide();
+ ui->label_content_source_folder_name->hide();
+ }
+ if(isSame)
+ {
+ this->destinationInfo=source;
+ ui->label_source->hide();
+ ui->label_destination->hide();
+ ui->label_destination_modified->hide();
+ ui->label_destination_folder_name->hide();
+ ui->label_destination_folder->hide();
+ ui->label_content_destination_modified->hide();
+ ui->label_content_destination_folder_name->hide();
+ ui->label_content_destination_folder->hide();
+ }
+ else
+ {
+ this->destinationInfo=destination;
+ this->setWindowTitle(tr("Folder already exists"));
+ ui->label_content_destination_modified->setText(destination.lastModified().toString());
+ ui->label_content_destination_folder_name->setText(destination.fileName());
+ QString folder=destination.absolutePath();
+ if(folder.size()>80)
+ folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
+ ui->label_content_destination_folder->setText(folder);
+ if(ui->label_content_destination_folder_name->text().isEmpty())
+ {
+ ui->label_destination_folder_name->hide();
+ ui->label_content_destination_folder_name->hide();
+ }
+ }
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ on_SuggestNewName_clicked();
+}
+
+FolderExistsDialog::~FolderExistsDialog()
+{
+ delete ui;
+}
+
+void FolderExistsDialog::changeEvent(QEvent *e)
+{
+ QDialog::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+std::string FolderExistsDialog::getNewName()
+{
+ if(oldName==ui->lineEditNewName->text().toStdString() || ui->checkBoxAlways->isChecked())
+ return "";
+ else
+ return ui->lineEditNewName->text().toStdString();
+}
+
+void FolderExistsDialog::on_SuggestNewName_clicked()
+{
+ QFileInfo destinationInfo=this->destinationInfo;
+ QString absolutePath=destinationInfo.absolutePath();
+ QString fileName=QString::fromStdString(TransferThread::resolvedName(destinationInfo));
+ QString suffix;
+ QString destination;
+ QString newFileName;
+ //resolv the suffix
+ if(fileName.contains(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$"))))
+ {
+ suffix=fileName;
+ suffix.replace(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$")),QStringLiteral("\\2"));
+ fileName.replace(QRegularExpression(QStringLiteral("^(.*)(\\.[a-z0-9]+)$")),QStringLiteral("\\1"));
+ }
+ //resolv the new name
+ int num=1;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ newFileName=tr("%1 - copy").arg(fileName);
+ else
+ {
+ newFileName=QString::fromStdString(firstRenamingRule);
+ newFileName.replace(QStringLiteral("%name%"),fileName);
+ }
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ newFileName=tr("%1 - copy (%2)").arg(fileName).arg(num);
+ else
+ {
+ newFileName=QString::fromStdString(otherRenamingRule);
+ newFileName.replace(QStringLiteral("%name%"),fileName);
+ newFileName.replace(QStringLiteral("%number%"),QString::number(num));
+ }
+ }
+ destination=absolutePath+CURRENTSEPARATOR+newFileName+suffix;
+ destinationInfo.setFile(destination);
+ num++;
+ }
+ while(destinationInfo.exists());
+ ui->lineEditNewName->setText(newFileName+suffix);
+}
+
+void FolderExistsDialog::on_Rename_clicked()
+{
+ action=FolderExists_Rename;
+ this->close();
+}
+
+void FolderExistsDialog::on_Skip_clicked()
+{
+ action=FolderExists_Skip;
+ this->close();
+}
+
+void FolderExistsDialog::on_Cancel_clicked()
+{
+ action=FolderExists_Cancel;
+ this->close();
+}
+
+FolderExistsAction FolderExistsDialog::getAction()
+{
+ return action;
+}
+
+bool FolderExistsDialog::getAlways()
+{
+ return ui->checkBoxAlways->isChecked();
+}
+
+void FolderExistsDialog::on_Merge_clicked()
+{
+ action=FolderExists_Merge;
+ this->close();
+}
+
+void FolderExistsDialog::on_lineEditNewName_editingFinished()
+{
+ updateRenameButton();
+}
+
+void FolderExistsDialog::on_lineEditNewName_returnPressed()
+{
+ updateRenameButton();
+ if(ui->Rename->isEnabled())
+ on_Rename_clicked();
+ else
+ QMessageBox::warning(this,tr("Error"),tr("Try rename with using special characters"));
+}
+
+void FolderExistsDialog::on_lineEditNewName_textChanged(const std::string &arg1)
+{
+ Q_UNUSED(arg1);
+ updateRenameButton();
+}
+
+void FolderExistsDialog::updateRenameButton()
+{
+ ui->Rename->setEnabled(ui->checkBoxAlways->isChecked() || (!ui->lineEditNewName->text().contains(QRegularExpression("[/\\\\\\*]")) && oldName!=ui->lineEditNewName->text().toStdString() && !ui->lineEditNewName->text().isEmpty()));
+}
diff --git a/plugins/CopyEngine/Ultracopier/FolderExistsDialog.h b/plugins/CopyEngine/Ultracopier/FolderExistsDialog.h
new file mode 100644
index 0000000..a3bcf67
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/FolderExistsDialog.h
@@ -0,0 +1,57 @@
+/** \file folderExistsDialog.h
+\brief Define the dialog when file exists
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef FOLDERISSAMEDIALOG_H
+#define FOLDERISSAMEDIALOG_H
+
+#include <QDialog>
+#include <QFileInfo>
+#include <QString>
+#include <QDateTime>
+#include <QDir>
+
+#include "Environment.h"
+
+namespace Ui {
+ class folderExistsDialog;
+}
+
+/// \brief to show file exists dialog, and ask what do
+class FolderExistsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ /// \brief create the object and pass all the informations to it
+ explicit FolderExistsDialog(QWidget *parent,QFileInfo source,bool isSame,QFileInfo destination,std::string firstRenamingRule,std::string otherRenamingRule);
+ ~FolderExistsDialog();
+ /// \brief return the the always checkbox is checked
+ bool getAlways();
+ /// \brief return the action clicked
+ FolderExistsAction getAction();
+ /// \brief return the new rename is case in manual renaming
+ std::string getNewName();
+protected:
+ void changeEvent(QEvent *e);
+private slots:
+ void updateRenameButton();
+ void on_SuggestNewName_clicked();
+ void on_Rename_clicked();
+ void on_Skip_clicked();
+ void on_Cancel_clicked();
+ void on_Merge_clicked();
+ void on_lineEditNewName_editingFinished();
+ void on_lineEditNewName_returnPressed();
+ void on_lineEditNewName_textChanged(const std::string &arg1);
+private:
+ Ui::folderExistsDialog *ui;
+ FolderExistsAction action;
+ std::string oldName;
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+ QFileInfo destinationInfo;
+};
+
+#endif // FOLDERISSAMEDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier/Languages/ar/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/ar/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/ar/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/de/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/de/translation.ts
new file mode 100644
index 0000000..cad2890
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/de/translation.ts
@@ -0,0 +1,1290 @@
+<?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="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation>Auf dieser Plattform nicht unterstützt</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation>Datum der letzten Änderung ist falsch</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translatorcomment> </translatorcomment>
+ <translation>Datum des letzten Zugriffs ist falsch</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation>Unbekannter Fehler: %1</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation>Unbekannter Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation>Pfad Konvertierungsfehler</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation>Verschiebemodus - Sie können nicht kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation>Kopiermodus - Sie können nicht verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation>Ziel</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation>Aktuelles Ziel: &quot;%1&quot; benutzen?</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation>Der Modus wurde vorher erzwungen. Interner Fehler - Bitte bei mir melden! </translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation>Fragen</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation>Überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation>Fusionieren</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation>Umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation>Ans Ende verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation>Überschreiben</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation>Überschreiben, falls verschieden</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation>Überschreiben, falls neuer</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation>Überschreiben, falls älter</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation>Automatisch</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation>Sequentiell</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation>Parallel</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation>Fehlerhafte Optionen</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>Optionen nicht geladen - Kein Zugriff auf Filter</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation>Fragen</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation>Überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation>Fusionieren</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation>Umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation>Ans Ende verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation>Überschreiben</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation>Überschreiben, falls verschieden</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation>Überschreiben, falls neuer</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation>Überschreiben, falls älter</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation>Automatisch</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation>Sequentiell</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation>Parallel</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation>Fehlerhafte Optionen</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>Option nicht geladen - Kein Zugriff auf Filter</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation>Option nicht geladen - Kann nicht auf Filter zugreifen</translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation>Speicherplatz</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation>Zu wenig Speicherplatz auf diesem Laufwerk</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation>Fortsetzen</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation>Laufwerk %1: %2 verfügbar %3 benötigt</translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation>Ordnerfehler</translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation>Ordnername</translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation>%1 - Kopie</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - Kopie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation>Versuche Umbenennung mit Sonderzeichen</translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation>%1 - kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - kopieren (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation>Versuche Umbenennung mit Sonderzeichen</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>Perls 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 Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation>Die Test-Zeichenfolge stimmt mit RegEx überein</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>Überprüfen</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>Test-Zeichenfolge:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>Filter-Dialog</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation>Ganze Zeichenfolge muss übereinstimmen</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>Die RegEx ist gültig</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 filters</source>
+ <translation>Ausschließungs-Filter</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation>Einschließungs-Filter</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation>Keiner = Alle einschließen</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation>Roh-Text</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation>Vereinfachte RegEx</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perls RegEx</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation>Nur auf Datei</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation>Nur auf Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation>Volle Übereinstimmung</translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation>Ordner existiert bereits</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation>%1 - Kopie</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - Kopie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation>Versuche Umbenennung mit Sonderzeichen</translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation>Falscher Modus: %1 - Kann Element nicht verschieben oder kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation>Konnte die Transferliste: %1 nicht speichern</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation>Lesefehler, oder Dateigröße=0</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>Falscher Header: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation>Die Transferliste ist im gemischten Modus, aber diese Instanz ist nicht im selben Modus</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1506"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation>Die Transferliste ist im Kopiermodus, aber diese Instanz ist nicht im selben Modus</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1512"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation>Die Transferliste ist im Verschiebe-Modus, aber diese Instanz ist nicht im selben Modus</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation>Bei der Zeilenanalyse sind Fehler aufgetreten</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>Transferliste: %1 kann nicht geöffnet werden</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation>Der Ordner kann nicht erstellt werden</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation>Quell-Ordner existiert nicht</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation>Kann den Ordner nicht temporär umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation>Kann den Ordner nicht endgültig verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation>Kann den Ordner nicht verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation>Kann nicht löschen</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation>Interner Fehler - Bitte bei mir melden!</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation>Interner Fehler beim Lesen der Quelldatei: Blockgröße außerhalb des zulässigen Bereichs</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation>Die Quelldatei kann nicht gelesen werden: </translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>Datei während des Lesevorgangs abgeschnitten, Daten wurden möglicherweise verändert</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% - Kopie</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% - Kopie (%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 - Kopie</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="43"/>
+ <location filename="../../RenamingRules.cpp" line="73"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - Kopie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Umbennungsregeln</translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation>Ordner der schwarzen Liste</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation>%1 - Kopie</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - Kopie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation>Dies ist kein Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation>Ordner existiert bereits</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation>Der Ordner kann nicht gelesen werden</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation>Problem mit der Namen-Encodierung</translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation>Datei nicht gefunden</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished">Interner Fehler: Bereits geöffnet</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished">Laufwerk %1</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished">Unbekannter Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished">Stammverzeichnis</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - Kopie</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - Kopie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished">Quelle existiert nicht</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished">Quelldatei existiert nicht</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished">Prüfsummen sind verschieden</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished">Interner Fehler: Ubertragene Größe ungleich</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished">Ordner kann nicht erstellt werden</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation>Versuche Umbenennung mit Sonderzeichen</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished">Andere Datei befindet sich am selben Ort</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished">Interner Fehler: Ziel ist nicht geschlossen</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished">Interner Fehler: Puffer ist nicht leer</translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation>Pfad-Auflösungsfehler (leerer Pfad)</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation>Interner Fehler - Bitte bei mir melden!</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation>Quelldatei kann nicht gelesen werden: </translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation>Datenabbruch beim Lesen, Daten wurden möglicherweise verändert</translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation>Übertragung</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation>Verschiebe den ganzen Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation>Übertrage die Dateirechte</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation>Datum der Dateien beibehalten</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation>Übertragung automatisch starten</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation>Leistung drosseln</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation>Genau nach Reihenfolge</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation>Fehler und Kollision</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation>Bei Ordnerfehlern:</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation>Bei Dateifehlern:</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation>Bei Dateikollisionen:</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation>Bei Ordnerkollisionen:</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation>Prüfen ob Zielordner vorhanden ist</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation>Umbennungsregeln</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation>Unvollständig übertragene Dateien löschen</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation>Original-Ziel umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation>Überprüfung</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation>Prüfsumme</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation>Nur nach einem Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation>Ignorieren falls unmöglich</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation>Prüfsummen vergleichen</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation>Leistung</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation>Paralleler Puffer</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation>Blockgröße</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation>Sequentieller Puffer</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation>OS-Puffer aktivieren</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation>OS-Puffer nur verwenden, wenn kleiner als</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation>Übertragungs-Algorithmus</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation>Parallelisieren wenn kleiner als</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation>Inode Threads</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation>Verschiedenes</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation>Auf freien Speicherplatz überprüfen</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation>Wählen</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation>Filter</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation>Dateifehler</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation>Größe</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation>Geändert</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation>Dateiname</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation>Ziel</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation>Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Aktion immer ausführen</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation>Mit erweiterten Rechten versuchen</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation>Ans Ende verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation>Wiederholen</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation>Über&amp;springen</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation>Abbrechen (&amp;C)</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="170"/>
+ <source>Size</source>
+ <translation>Größe</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation>Geändert</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation>Dateiname</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation>Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Neuen &amp;Namen vorschlagen</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Aktion immer ausführen</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation>Überschreiben, falls Änderungsdatum verschieden</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation>Umbenennen (&amp;R)</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation>Überschreiben (&amp;O)</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation>Über&amp;springen</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation>Abbrechen (&amp;C)</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation>Überschreiben, falls neuer</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation>Überschreiben, falls älter</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation>Größe</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation>Geändert</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation>Dateiname</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation>Quelle und Ziel sind gleich</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation>Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Neuen &amp;Namen vorschlagen</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Aktion immer ausführen</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation>Umbenennen (&amp;R)</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation>Über&amp;springen</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation>Abbrechen (&amp;C)</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <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="14"/>
+ <source>The source and destination is identical</source>
+ <translation>Quelle und Ziel sind identisch</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation>Geändert</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation>Ordnername</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation>Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Neuen &amp;Namen vorschlagen</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Aktion immer ausführen</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation>Umbenennen (&amp;R)</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation>Fusionieren</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation>Überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation>Abbrechen (&amp;C)</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/el/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/el/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/el/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/en/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/en/translation.ts
new file mode 100644
index 0000000..2c9ce27
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/en/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="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>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/es/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/es/translation.ts
new file mode 100644
index 0000000..9cb6abe
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/es/translation.ts
@@ -0,0 +1,1289 @@
+<?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="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation>No es compatible con esta plataforma</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation>Fecha de última modificación es incorrecto</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation>Fecha de último acceso es incorrecto</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation>Error desconocido: %1</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation>Error desconocido</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation>Error de conversión de Sendero</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation>El motor se ve obligado a moverse, no se puede copiar con ella</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation>El motor se ve obligado a copiar, no te puedes mover con él</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation>Destino</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation>Utilice el destino &quot;%1&quot; actual?</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation>El modo se ha visto obligado previamente. Este es un error interno, por favor repórtelo</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation>Pedir</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation>Unir</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation>Ponga al final</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation>Sobrescribir</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation>Sobrescribir si es diferente</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation>Sobrescribir si nuevo</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation>Sobrescribir si es mayor</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation>Automático</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation>Secuencial</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation>Paralelo</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation>error Opciones</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>Opciones del motor no está cargado. No es posible acceder a los filtros</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation>Pedir</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation>Unir</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation>Ponga al final</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation>Sobrescribir</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation>Sobrescribir si es diferente</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation>Sobrescribir si nuevo</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation>Sobrescribir si es mayor</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation>Automático</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation>Secuencial</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation>Paralelo</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation>error Opciones</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>Opciones del motor no está cargado. No es posible acceder a los filtros</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <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>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation>Espacio en disco</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation>Necesita más espacio en esta unidad para terminar esta transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation>Continuar</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation>Drives %1 tienen %2 disponible, pero necesitan %3</translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation>Error en la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation>Nombre de la carpeta</translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation>Trate de cambiar el nombre con el uso de caracteres especiales</translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation>Trate de cambiar el nombre con el uso de caracteres especiales</translation>
+ </message>
+</context>
+<context>
+ <name>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="125"/>
+ <source>The test string matches with the regex</source>
+ <translation>La cadena de prueba coincide con la expresión regular</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="95"/>
+ <source>Whole string must match</source>
+ <translation>Todo cadena debe coincidir</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>
+</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 filters</source>
+ <translation>Filtros de exclusión</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation>Filtros de inclusión</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="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation>texto Fuente</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation>Simplificado regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl&apos;s regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation>Sólo en el archivo</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation>Sólo en la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation>Partido completo</translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation>Carpeta ya existe</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation>Trate de cambiar el nombre con el uso de caracteres especiales</translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <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="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation>Problema al leer el archivo o archivos de tamaño es 0</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>Encabezado incorrecto: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation>Algunos errores han sido encontrados durante el análisis de línea</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <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="142"/>
+ <source>Unable to create the folder</source>
+ <translation>No se puede crear la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation>La carpeta de origen no existe</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation>No es posible cambiar el nombre de la carpeta temporal</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation>No se puede hacer el movimiento final real de la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation>No se puede mover la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation>No se puede eliminar</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation>Error interno, por favor informe de ello!</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation>Error interno de leer el archivo de origen: tamaño de bloque fuera de rango</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <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="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation>Carpeta de la lista negra</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation>Esto no es una carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation>La carpeta no existe</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation>La carpeta no se puede leer</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation>Problema con codificación de nombres</translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation>Archivo no encontrado</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished">Error interno: Ya la apertura</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished">Drive %1</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished">Desconocido carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished">raíz</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished">La fuente no existe</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished">El archivo de origen no existe</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished">Las sumas de comprobación no coinciden</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished">Error interno: El tamaño transferido no coincide</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished">Incapaz de hacer la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation>Trate de cambiar el nombre con el uso de caracteres especiales</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished">Otro archivo existe en el mismo lugar</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished">Error interno: El destino no está cerrado</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished">Error interno: El buffer no está vacío</translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation>Error de resolución de ruta (camino vacío)</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation>Error interno, por favor informe de ello!</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <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="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation>Archivo truncado durante lectura, posible cambio de datos</translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation>Transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation>Mueva la carpeta completa</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation>Transferencia de los derechos de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation>Mantener la fecha de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation>Inicio automático de la transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation>Si comprueba Menos rendimiento</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation>Siga el orden estricto</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation>Error y de la colisión</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation>Cuando el error carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation>Cuando archivo error</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation>Cuando archivo colisión</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation>Cuando la colisión carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation>Compruebe si existe la carpeta de destino</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation>Reglas de Cambio de nombre</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation>Eliminar archivos parcialmente transferidos</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation>Cambie el nombre del destino original</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation>Controlar</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation>Suma de comprobación</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation>Sólo después de un error</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation>No haga caso si no es posible</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation>Verifique checksums</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation>Rendimiento</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation>Búfer paralelo</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation>Tamaño del bloque</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation>Tampón secuencial</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation>Habilitar el OS de amortiguación</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation>OS de amortiguación sólo si menor que</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation>Algoritmo de transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation>Paralelice si más pequeño que</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation>Temas inodo</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation>Misc</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation>Compruebe el espacio en disco</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation>Busque</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation>Filtros</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation>Error con el archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation>Tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation>Modificado</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation>Nombre de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation>Destino</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation>Carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Siempre realice esta acción</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation>Pruebe con privilegios elevados</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation>Ponga a abajo</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation>Reintentar</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation>Cancelar</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="170"/>
+ <source>Size</source>
+ <translation>Tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation>Modificado</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation>Nombre de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation>Carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Sugerir nuevo &amp;nombre</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Siempre realice esta acción</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation>Sobrescribir si la fecha de modificación difiere</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation>&amp;Sobrescribir</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation>Ca&amp;ncelar</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation>Sobrescribir si nuevo</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation>Sobrescribir si es mayor</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation>Tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation>Modificado</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation>Nombre de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation>El origen y el destino son los mismos</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation>Carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Sugerir nuevo nombre</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Siempre realice esta acción</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <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="14"/>
+ <source>The source and destination is identical</source>
+ <translation>La fuente y el destino es idéntica</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation>Modificado</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation>Nombre de la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation>Carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Sugerir nuevo nombre</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Siempre realice esta acción</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation>Unir</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/fr/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/fr/translation.ts
new file mode 100644
index 0000000..13ac433
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/fr/translation.ts
@@ -0,0 +1,1294 @@
+<?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="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation>Non supporté sur cette plateforme</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation>Date de dernière modification du fichier incorrecte</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation>Date du dernier accès au fichier incorrecte</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation>Erreur inconnue: %1</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation>Erreur inconnue</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation>Erreur de conversion de chemain</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation>Le moteur est forcé en déplacement, vous ne pouvez pas copier avec</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation>Le moteur est forcé en copie, vous ne pouvez pas déplacer avec</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation>Destination</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation>Utiliser la destination actuelle &quot;%1&quot;?</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation>Le mode a été forcé. C&apos;est une erreur interne, merci de la repporter</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation>Demander</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation>Fusionner</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation>Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation>Mettre à la fin</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation>Écraser</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation>Écraser si différent</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation>Écraser si plus récent</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation>Écraser si plus vieux</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation>Automatique</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation>Séquentiel</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation>Parallèle</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation>Erreur d&apos;options</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>Le moteur d&apos;options n&apos;est pas chargé. Impossible d&apos;accédé aux filtres</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation>Demander</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation>Fusionner</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation>Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation>Mettre à la fin</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation>Écraser</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation>Écraser si différent</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation>Écraser si plus récent</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation>Écraser si plus vieux</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation>Automatique</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation>Séquentiel</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation>Parallèle</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation>Erreur d&apos;options</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>Le moteur d&apos;options n&apos;est pas chargé. Impossible d&apos;accédé aux filtres</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation>Moteur d&apos;options non chargé, impossible d&apos;accéder aux filtres</translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation>Espace disque</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation>Vous avez besoin de plus d&apos;espace pour finir ce transfert</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation>Continuer</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation>Lecteur %1 as %2 disponible mais à besoin de %3</translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation>Erreur sur un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation>Nom de répertoire</translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation>Essaie de renommage avec caratéres interdits</translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation>Essaie de renommage avec caratéres interdits</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 brut</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation>Regex simplifiée</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="125"/>
+ <source>The test string matches with the regex</source>
+ <translation>La chaine de texte corresponds avec la regex</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 test:</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="95"/>
+ <source>Whole string must match</source>
+ <translation>Toute la chaine doit correspondre</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>La regex est valid</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 filters</source>
+ <translation>Filtres d&apos;exclusion</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation>Filtres 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="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation>Texte brute</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation>Regex simplifié</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Regex perl</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation>Appliquer sur fichier</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation>Appliquer sur dossier</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation>Correspondance totale</translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation>Dossier déjà existant</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation>Essaie de renommage avec caratéres interdits</translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation>Impossible de sauvegarder la liste de transfert: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation>Problem durant la lecture, ou taille de fichier est 0</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>Mauvais en-tête: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation>La liste de transfert est en mode mixte, mais l&apos;instance n&apos;est pas dans ce mode</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1506"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation>La liste de transfert est en mode copie, mais l&apos;instance n&apos;est pas dans ce mode</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1512"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation>La liste de transfert est en mode déplacement, mais l&apos;instance n&apos;est pas dans ce mode</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation>Certaine erreur ont été trouvé durant l&apos;analise de la line</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>Impossible d&apos;ouvrir la list de transfert: %1</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation>Impossible de créer le répertoire</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation>Le dossier source n&apos;éxiste pas</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation>Impossible de renommer le dossier</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation>Impossible de faire le déplacement final du dossier</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation>Impossible de déplacer le dossier</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation>Impossible de supprimer</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation>Erreur interne, merci de la reporter!</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation>Erreur interne lisant le fichier source: taille de block hors de la plage</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation>Impossible de lire le fichier source: </translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translatorcomment>La taille du fichier a diminué durant -&gt; changé le texte original</translatorcomment>
+ <translation>Fichier a diminué durant la lecture, possible changement de données</translation>
+ </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>Second 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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation>Dossier banis</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation>N&apos;est pas un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation>Le répertoire n&apos;existe pas</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation>Le répertoire n&apos;est pas lisible</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation>Problém d&apos;encodage</translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation>Fichier non trouvé</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation>Lecteur %1</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation>Dossier inconnu</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation>racine</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation>La source n&apos;existe pas</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation>Le fichier source n&apos;existe pas</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation>Les sommes de controle ne correspondent pas</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation>Erreur interne: La taille transféré ne corresponds pas</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation>Impossible de créer le dossier</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation>Essaie de renommage avec caratéres interdits</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation>Mauvaise date de modification ou impossible de l&apos;avoir, vous pouvez désactivé le transfert de celui-ci</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation>Erreur interne: Déjà ouvert</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation>Un autre fichier exists à la même place</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation>Erreur interne: La destination n&apos;est pas fermé</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation>Erreur interne: Le buffer n&apos;est pas vide</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation>Impossible de changer la date</translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation>Erreur de résolution de chemain (chemain vide)</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation>Erreur interne, merci de la reporter!</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation>Impossible de lire le fichier source: </translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation>Fichier rétréci pendant la lecture, possible changement de données</translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation>Transfert</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation>Déplacer le dossier complet</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation>Transférer les droits des fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation>Garder la date du fichier</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation>Démarrer automatiquement le transfert</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation>Moins de performance si coché</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation>Suivre l&apos;ordre strict</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation>Erreur et collision</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation>En cas d&apos;erreur de répertoire</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation>En cas d&apos;erreur de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation>En cas de collision de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation>Lors d&apos;une collision de dossier</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation>Vérifier si le répertoire de destination existe</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation>Règles de renommage</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation>Supprimer les transferts partiels</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation>Renommer la destination originale</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation>Controle</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation>Somme de contrôle</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation>Seulement après erreur</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation>Ignorer si impossible</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation>Vérifier les sommes de contrôles</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation>Performance</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation>Buffer paralléle</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation>Ko</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation>Taille de bloc</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation>Buffer séquentiel</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation>Activer le tampon de l&apos;OS</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation>Tampon de l&apos;OS seulement si plus petit que</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation>Algorithme de transfert</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation>Parallèlise si plus petit que</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation>Thread d&apos;inode</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation>Plus de cpu mais meilleur organisation sur le disque</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation>Ordonner la liste</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation>Divers</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation>Vérifier l&apos;espace disque</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation>Utiliser ce dossier quand la destination n&apos;est pas défini</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation>Parcourir</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation>Filtres</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation>Erreur avec un fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation>Destination</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation>Dossier</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Toujours faire cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation>Essayer avec des priviléges suppérieurs</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation>Mettre à la fin</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation>Réessayer</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</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="170"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation>Dossier</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Toujours faire cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation>Écraser si les dates différes</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation>&amp;Écraser</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation>Écraser si plus récent</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation>Écraser si plus vieux</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation>La source et la destination sont identique</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation>Dossier</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Toujours faire cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <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="14"/>
+ <source>The source and destination is identical</source>
+ <translation>La source et la destination sont identique</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation>Nom de répertoire</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation>Dossier</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Toujours faire cette action</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation>Fusionner</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/hi/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/hi/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/hi/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/hu/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/hu/translation.ts
new file mode 100644
index 0000000..eaa968d
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/hu/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="hu">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation>Nem támogatott ezen a platformon</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation>A módosítás utolsó dátuma hibás</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation>A hozzáférés utolsó dátuma hibása</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation>Ismeretlen hiba: %1</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation>Útvonal konvertálási hiba</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation>Ismeretlen hiba</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation>A motort mozgatásra kényszerítik, nem másolhatsz vele</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation>A motort másolásra kényszerítik, nem mozgathatsz vele</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation>Cél</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation>Használja a jelenlegi célt: &quot;%1&quot;?</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation>Ezt a módot már korábban kényszerítették. Belső hiba történt, kérlek jelentsd be</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation>Kérdezzen rá</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation>Kihagy</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation>Összeolvaszt</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation>Nevezze át</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation>Helyezze a végére</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation>Felülír</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation>Felülír, ha különbözik</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation>Felülír, ha újabb</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation>Felülír, ha régebbi</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation>Automatikus</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation>Szekvenciális</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation>Párhuzamos</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation>Beállítási hiba</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>A beállítási motor nincs betöltve. A szűrők elérése nem lehetséges</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation>Kérdezzen rá</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation>Kihagy</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation>Összeolvaszt</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation>Nevezze át</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation>Helyezze a végére</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation>Felülír</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation>Felülír, ha különbözik</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation>Felülír, ha újabb</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation>Felülír, ha régebbi</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation>Automatikus</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation>Szekvenciális</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation>Párhuzamos</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation>Beállítási hiba</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>A beállítási motor nincs betöltve. A szűrők elérése nem lehetséges</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation>A beállítási motor nincs betöltve, a szűrők elérése nem lehetséges</translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation>Lemezterület</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation>Több szabad helyre van szükséged ezen a lemezen az átvitel befejezéséhez</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation>Folytatás</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation>Mégse</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation>%1 meghajtón %2 hely van, de %3 szükséges</translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation>Hiba a mappával</translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation>Mappa neve</translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation>%1 - másolás</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - másolás (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation>Átnevezés speciális karakterek használatával</translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation>%1 - másolás</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - másolás (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation>Átnevezés speciális karakterek használatával</translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>Szűrők üzenet</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation>Keresés:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation>Keresés típusa:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation>Nyers szöveg</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation>Egyszerűsített regex</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl regex</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation>Alkalmazás ezen:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation>Fájl</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation>Mappa</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation>Fájl és mappa</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation>A teljes szövegnek egyeznie kell</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation>A tesztszöveg megegyezik a regexszel</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>Ellenőrzés</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>A regex érvényes</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>Próbaszöveg:</translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation>Szűrők</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation>Kizáró szűrők</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation>Használt szűrők</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation>Nincs = Mindet használ</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation>Nyers szöveg</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation>Egyszerűsített regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation>Csak fájlon</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation>Csak mappán</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation>Teljes egyezés</translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation>Mappa már létezik</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation>%1 - másolás</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - másolás (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation>Átnevezés speciális karakterek használatával</translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation>Elem másolása vagy mozgatás nem lehetséges a hibás kényszerített módban: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation>Átviteli lista mentése nem lehetséges: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation>Hiba a fájl olvasásánál vagy a fálméret 0</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>Hibás fejléc: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation>Az átviteli lista kevert módban van, de ez a példány nincs</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1506"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation>Az átviteli lista másolás módban van, de ez a példány nincs</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1512"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation>Az átviteli lista mozgatás módban van, de ez a példány nincs</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation>Néhány hiba történt a sorelemzés során</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>Az átviteli lista megnyitása nem lehetséges: %1</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation>Mappa létrehozása nem lehetséges</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation>Eltávolítás nem lehetséges</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation>Belső hiba, kérlek jelentsd!</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation>Belső hiba történt a forrásfájl olvasásakor: a blokkméret tartományon kívüli</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation>A forrásfájl olvasása nem lehetséges:</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>A fájl olvasás során megcsonkult, valószínűleg adatváltozás miatt</translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Átnevezési szabályok</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="26"/>
+ <source>First renaming</source>
+ <translation>Első átnevezés</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation>%name% - másolás</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;Változók: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; az eredeti fájlnévhez&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation>Második átnevezés</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation>%name% - másolás (%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;Változók: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; az eredeti fájlnévhez&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; az extra számhoz&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 - másolás</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="43"/>
+ <location filename="../../RenamingRules.cpp" line="73"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - másolás (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation>Feketelistás mappa</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation>%1 - másolás</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - másolás (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation>Ez nem mappa</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation>A mappa létezik</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation>A mappa nem olvasható</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation>Probléma a névkódolással</translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation>Fájl nem található</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished">%1 meghajtó</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished">Ismeretlen mappa</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished">gyökér</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - másolás</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - másolás (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished">A forrás nem létezik</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished">Mappaművelet nem lehetséges</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation>Átnevezés speciális karakterek használatával</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished">A forrásfájl nem létezik</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished">Egy másik fájl létezik ugyanazon a helyen</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished">A checksumok nem egyeznek meg</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished">Belső hiba: a cél nincs bezárva</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished">Belső hiba: az átvitt méret nem egyezik meg</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished">Belső hiba: a puffer nem üres</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation>Útvonal feloldási hiba (Üres útvonal)</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation>Belső hiba, kérlek jelentsd!</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation>A forrásfájl olvasása nem lehetséges:</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation>Fájl megsérült az olvasás közben, valószínűleg adatváltozás</translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation>Átvitel</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation>Mozgassa át az egész mappát</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation>Fájljogok átadása</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation>Fájl dátumának megtartása</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation>Átvitel automatikus indítása</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation>Kisebb teljesítmény, ha be van jelölve</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation>Kövesse a szigorú sorrendet</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation>Hiba és ütközés</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation>Mappa hiba esetén</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation>Fájl hiba esetén</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation>Fájl ütközés esetén</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation>Mappa ütközés esetén</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation>Célmappa létezésének ellenőrzése</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation>Átnevezési szabályok</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation>Részben átvitt fájlok törlése</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation>Eredeti cél átnevezése</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation>Irányítás</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation>Checksum</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation>Csak hiba után</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation>Hagyja ki, ha nem lehetséges</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation>Checksumok ellenőrzése</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation>Teljesítmény</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation>Párhuzamos puffer</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation>Blokkméret</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation>Szekvenciális puffer</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation>OS puffer engedélyezése</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation>OS buffer csak akkor, ha kisebb mint</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation>Átviteli algoritmus</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation>Párhuzamosítás, ha kisebb mint</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation>Inode szálak</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation>Egyéb</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation>Lemezterület ellenőrzése</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation>Tallózás</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation>Szűrők</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation>Hiba a fájllal</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation>Méret</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation>Módosítva</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation>Fájlnév</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation>Cél</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation>Mappa</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Mindig hajtsa végre ezt a műveletet</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation>Próbálja meg emelt jogosultsággal</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation>Tegye legalulra</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation>Újra</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Kihagy</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation>M&amp;égse</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation>A fájl létezik</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Forrás</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Cél</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation>Méret</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation>Módosítva</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation>Fájlnév</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation>Mappa</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Új &amp;név ajánlása</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Mindig hajtsa végre ezt a műveletet</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation>Felülír, ha a módosítás dátuma különbözik</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation>Felülír, ha régebbi</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Átnevez</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation>&amp;Felülír</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Kihagy</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Mégse</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation>Felülír, ha újabb</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation>Méret</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation>Módosítva</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation>Fájlnév</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation>A forrás és a cél megegyezik</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation>Mappa</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Új &amp;név javasolása</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Mindig hajtsa végre ezt a műveletet</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Átnevez</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Kihagy</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation>M&amp;égse</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Forrás</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Cél</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation>Módosítva</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation>Mappa neve</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Új &amp;név javasolása</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation>A forrás és a cél megegyezik</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation>Mappa</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp;Mindig hajtsa végre ezt a műveletet</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Átnevez</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation>Összeolvaszt</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation>Kihagy</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation>M&amp;égse</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/id/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/id/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/id/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/it/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/it/translation.ts
new file mode 100644
index 0000000..8a95cd4
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/it/translation.ts
@@ -0,0 +1,1299 @@
+<?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="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation>Non supportato su questa piattaforma</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation>La data dell&apos;ultima modifica è errata</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation>La data dell&apos;ultimo accesso è errata</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation>Percorso dell&apos;errore di conversione</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation>Impossibile copiare, il motore per la copia forzerà lo spostamento</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation>Impossibile effettuare lo spostamento, il motore per la copia forzerà la copia</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished">Cartella di destinazione</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation>Chiedi</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation>Salta</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation>Unisci</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation>Rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation>Metti in coda</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation>Sovrascrivi</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation>Sovrascrivi se differente</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation>Sovrascrivi se più recente</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation>Sovrascrivi se meno recente</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation>Automatico</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation>Sequenziale</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation>Parallelo</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation>Opzioni di errore</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation>Chiedi</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation>Salta</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation>Unisci</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation>Rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation>Metti in coda</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation>Sovrascrivi</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation>Sovrascrivi se differente</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation>Sovrascrivi se più recente</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation>Sovrascrivi se meno recente</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation>Automatico</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation>Sequenziale</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation>Parallelo</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation>Opzioni di errore</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation>Le opzioni del motore per la copia non vengono caricate, impossibile accedere ai filtri</translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation>Spazio su disco</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation>Continua</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation>Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation>L&apos;unità %1 ha %2 disponibili, ma necessita di %3</translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation>Errore nella cartella</translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation>Nome della cartella</translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation>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>Regex semplificato</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Regex in Perl</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>Cartelle</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="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>Verifica</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>Stringa di verifica:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>Finestra dei filtri</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>La regex è valida</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 filters</source>
+ <translation>Filtri di esclusione</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translatorcomment>o filtri per l&apos;inserimento?</translatorcomment>
+ <translation>Filtri di inclusione</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translatorcomment>o Nessuno = Includi tutti oppure Nessuno = Inserisci tutti oppure bisogna lasiare none?</translatorcomment>
+ <translation>Nessuno = Tutti inclusi</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation>Testo raw</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation>Regex semplificato</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Regex in Perl</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation>Solo su file</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translatorcomment>o cartella al singolare?</translatorcomment>
+ <translation>Solo su cartelle</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation>Corrispondenza completa</translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation>Cartella già presente</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation>Impossibile spostare o copiare elementi in modalità forzata anomala: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation>Impossibile salvare la lista dei trasferimenti: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translatorcomment>Header si riferisce all&apos;intestazione?</translatorcomment>
+ <translation>Intestazione sbagliata: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation>La lista dei trasferimenti è in modalità mista, ma questa istanza non è in questa modalità</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1506"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation>La lista dei trasferimenti è in modalità di copia, ma questa istanza non è in questa modalità</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1512"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation>La lista dei trasferimenti è in modalità di spostamento, ma questa istanza non è in questa modalità</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>Impossibile aprire la lista dei trasferimenti: %1</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation>Impossibile creare la cartella</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation>Impossibile eliminare</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation>Errore interno, pregasi di segnalarlo!</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation>Impossibile leggere il file di origine: </translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>File troncato durante la lettura, possibili variazioni di dati</translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="26"/>
+ <source>First renaming</source>
+ <translatorcomment>o Prima ridenominazione?</translatorcomment>
+ <translation>Prima rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translatorcomment>%name% non dovrà essere tradotto</translatorcomment>
+ <translation>Copia di %name%</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>o per il nome originale del file</translatorcomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;variabili: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; per il nome del file di origine&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translatorcomment>o Seconda ridenominazione?</translatorcomment>
+ <translation>Seconda rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translatorcomment>%name% e %number% non dovranno essere tradotti</translatorcomment>
+ <translation>Copia di %name% (%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>%name% e %number% non dovranno essere tradotti</translatorcomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;variabili: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; per il nome del file di origine&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; per il numero progressivo&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>Regole di rinomina</translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation>Questa non è una cartella</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation>La cartella non è leggibile</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation>Problema con la codifica del nome</translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation>File non trovato</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished">Unità %1</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished">root</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished">Impossibile creare la cartella</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished">Nello stesso percorso è presente un altro file</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished">Errore interno: la cartella di destinazione non è chiusa</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished">Errore interno: il buffer non è vuoto</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished">Impossibile cambiare la data</translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation>Errore interno, pregasi di segnalarlo!</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation>Impossibile leggere il file di origine: </translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation>Trasferisci</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation>Spostare l&apos;intera cartella</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation>Trasferire le autorizzazioni dei file</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation>Mantenere la data del file</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation>Se selezionato si avranno prestazioni ridotte</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation>Seguire rigorosamente l&apos;ordine</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation>Errori di coincidenze</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation>Quando si verifica un errore nelle cartelle</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation>Quando si verifica un errore nei file</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation>Quando i file coincidono</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation>Quando le cartelle coincidono</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation>Controllare se la cartella di destinazione esiste</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation>Regole di rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation>Eliminare i file parzialmente trasferiti</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation>Rinominare la destinazione all&apos;origine</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation>Controllare</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation>Codice di controllo (Checksum)</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation>Solo dopo l&apos;errore</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation>Ignora se non corrisponde</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation>Prestazioni</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation>Buffer parallelo</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation>Dimensione del blocco</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation>Buffer sequenziale</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation>Attivare il buffer del sistema operativo</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation>Buffer del sistema operativo solo se inferiore a</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation>Algoritmo di trasferimento </translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation>Affiancare se inferiore a</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation>Inode threads</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation>Varie</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation>Controllare lo spazio su disco</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation>Sfoglia</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation>Filtri</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation>Dimensione</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation>Modificato</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation>Nome del file</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation>Cartella di destinazione</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation>Cartelle</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation>Mettere in coda</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation>Riprova</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Salta</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annulla</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation>Il file è già presente</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Cartella di origine</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Cartella di destinazione</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation>Dimensione</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation>Modificato</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation>Nome del file</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation>Cartelle</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggerisci un nuovo &amp;nome</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation>&amp;Sovrascrivi</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Salta</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation>Sovrascrivi se più recente</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation>Sovrascrivi se meno recente</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation>Dimensione</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation>Modificato</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation>Nome del file</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation>Cartelle</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggerisci nuovo &amp;nome</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Salta</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annulla</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Cartella di origine</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Cartella di destinazione</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation>Modificato</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation>Nome della cartella</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation>Cartelle</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggerisci nuovo &amp;nome</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation>Unisci</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation>Salta</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annulla</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/ja/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/ja/translation.ts
new file mode 100644
index 0000000..5c68ad9
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/ja/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="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>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/ko/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/ko/translation.ts
new file mode 100644
index 0000000..ea7d584
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/ko/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ko_KR">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation>이 플랫폼에서 지원되지 않습니다</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation>마지막 수정 날짜가 잘못되었습니다</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation>마지막 엑세스 날짜가 잘못되었습니다</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished">대상</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished">확인</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished">건너뛰기</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished">합치기</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished">이름 바꾸기</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished">더 최신이면 덮어씌우기</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished">확인</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished">건너뛰기</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished">합치기</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished">이름 바꾸기</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished">더 최신이면 덮어씌우기</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished">폴더 이름</translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished">오류</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished">오류</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished">오류</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation>폴더를 생성할 수 없습니다</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation>원본 파일 읽기 불가:</translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="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>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished">폴더를 읽을 수 없습니다</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished">원본 파일 읽기 불가:</translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished">파일 권한 전송</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished">파일 날짜 보존</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished">폴더 오류시</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished">폴더 충돌시</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished">대상 폴드 존재시 확인</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished">KB</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished">블럭 크기</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>오류</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation>크기</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation>수정 날짜</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation>파일 이름</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished">대상</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation>아래에 놓기</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation>재시도</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;건너뛰기</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;취소</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation>파일이 존재합니다</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>원본</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>대상</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation>크기</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation>수정 날짜</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation>파일 이름</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation>새 &amp;이름 제안</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;이름 바꾸기</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation>&amp;덮어씌우기</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;건너뛰기</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;취소</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation>더 최신이면 덮어씌우기</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation>크기</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation>수정 날짜</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation>파일 이름</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation>새 &amp;이름 제안</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;이름 바꾸기</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;건너뛰기</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;취소</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>원본</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>대상</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation>수정 날짜</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation>폴더 이름</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation>새 &amp;이름 제안</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;이름 바꾸기</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation>합치기</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation>건너뛰기</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;취소</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/nl/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/nl/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/nl/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/no/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/no/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/no/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/pl/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/pl/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/pl/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/pt/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/pt/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/pt/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/ru/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/ru/translation.ts
new file mode 100644
index 0000000..abaf3bb
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/ru/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru" sourcelanguage="en">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation>Не поддерживается на этой платформе</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation>Дата обновления неправильно</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation>Дата последнего доступа не так</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished">Двигатель вынуждены покинуть свои дома, вы не можете скопировать с ним</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished">Двигатель вынужден копии, вы не можете двигаться вместе с ним</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished">назначение</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished">просить</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished">пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished">слияние</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished">переименовать</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished">Заменить, если новее</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished">Опции ошибке</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished">просить</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished">пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished">слияние</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished">переименовать</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished">Заменить, если новее</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished">Опции ошибке</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished">Параметры двигателя не загружается, не может получить доступ к фильтрам</translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished">Ошибка в папку</translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished">имя папки</translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - копия</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - копия (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished">ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - копия</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - копия (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished">ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation>Поиск по сайту:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation>Тип поиска:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation>Сырой текст</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation>упрощенный regex</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl&apos;s regex</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation>Нанесите на:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation>файл</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation>папка</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation>Файлов и папок</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>контроль</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>Испытание строки:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>Фильтры диалогового</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>Регулярное действует</translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation>Фильтры</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation>Ни = Включить все</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation>Сырой текст</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation>Упрощенная регулярных выражений</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl&apos;s regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation>Только на файл</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation>Только на папку</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation>Полный матч</translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished">Папка уже существует</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - копия</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - копия (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished">ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation>Невозможно сделать, чтобы скопировать или переместить элемент в неправильном форсированном режиме: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation>Невозможно сохранить трансфер: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>Неправильный заголовок: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation>Трансфер в смешанном режиме, но этот экземпляр не в этом режиме</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1506"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation>Передача списка в режиме копирования, но этот экземпляр не в этом режиме</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1512"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation>Трансфер в режим перемещения, но этот экземпляр не в этом режиме</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>Не удается открыть трансфер: %1</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation>Невозможно создать папку</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation>Невозможно прочитать исходный файл: </translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>Файл усечены во время чтения, возможность изменения данных</translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="26"/>
+ <source>First renaming</source>
+ <translation>Первое переименование</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation>%name% - копия</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;Переменные: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; по оригинальному названию файла&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation>Второе переименование</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation>%name% - копия (%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;Переменные: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; по оригинальному названию файла&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; за дополнительный номер&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 - копия</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="43"/>
+ <location filename="../../RenamingRules.cpp" line="73"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - копия (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Переименование правила</translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - копия</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - копия (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished">Папки не читается</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished">%1 - копия</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished">%1 - копия (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation>Невозможно прочитать исходный файл: </translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished">Передача файлов прав</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished">Держите дату файла</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished">Когда папка ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished">Когда папка столкновения</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished">Убедитесь, что папка существует</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished">Переименование правила</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished">Контрольная</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished">Только после того, как ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished">Игнорировать, если невозможно</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished">KB</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished">размер блока</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished">Включить OS буфер</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished">ОС буфер, только если меньше</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished">Фильтры</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation>размер</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation>модифицированный</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation>имя файла</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished">назначение</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished">папка</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation>Положить в нижней</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation>Повторить</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation>пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation>отменить</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation>Файл существует</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>источник</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>назначение</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation>размер</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation>модифицированный</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation>имя файла</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished">папка</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Предложить новое имя</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation>переименовать</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation>переписывать</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation>пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation>отменить</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation>Заменить, если новее</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation>размер</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation>модифицированный</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation>имя файла</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished">папка</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Предложить новое имя</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation>переименовать</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation>пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation>отменить</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>источник</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>назначение</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation>модифицированный</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation>имя папки</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished">папка</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Предложить новое имя</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation>переименовать</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation>слияние</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation>пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation>отменить</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/th/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/th/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/th/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/tr/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/tr/translation.ts
new file mode 100644
index 0000000..a00b0cd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/tr/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <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>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/zh/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/zh/translation.ts
new file mode 100644
index 0000000..5c68ad9
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Languages/zh/translation.ts
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="26"/>
+ <location filename="../../AvancedQFile.cpp" line="57"/>
+ <location filename="../../AvancedQFile.cpp" line="88"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="40"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="71"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="121"/>
+ <source>Unknown error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="187"/>
+ <source>Unknown error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="133"/>
+ <source>Path conversion error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="429"/>
+ <location filename="../../CopyEngine.cpp" line="451"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="462"/>
+ <location filename="../../CopyEngine.cpp" line="484"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="508"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="732"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1062"/>
+ <location filename="../../CopyEngine.cpp" line="1065"/>
+ <location filename="../../CopyEngine.cpp" line="1070"/>
+ <location filename="../../CopyEngine.cpp" line="1074"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1063"/>
+ <location filename="../../CopyEngine.cpp" line="1067"/>
+ <location filename="../../CopyEngine.cpp" line="1071"/>
+ <location filename="../../CopyEngine.cpp" line="1075"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1066"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1068"/>
+ <location filename="../../CopyEngine.cpp" line="1080"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1072"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1076"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1077"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1078"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1079"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1082"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1083"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1084"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1185"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="418"/>
+ <location filename="../../CopyEngineFactory.cpp" line="421"/>
+ <location filename="../../CopyEngineFactory.cpp" line="426"/>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="419"/>
+ <location filename="../../CopyEngineFactory.cpp" line="423"/>
+ <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="422"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="424"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="428"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="432"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <source>Sequential</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Parallel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="491"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="530"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="147"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="232"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="111"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="121"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="188"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="93"/>
+ <location filename="../../Filters.cpp" line="131"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="96"/>
+ <location filename="../../Filters.cpp" line="134"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="99"/>
+ <location filename="../../Filters.cpp" line="137"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="107"/>
+ <location filename="../../Filters.cpp" line="145"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="110"/>
+ <location filename="../../Filters.cpp" line="148"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="116"/>
+ <location filename="../../Filters.cpp" line="154"/>
+ <location filename="../../Filters.cpp" line="216"/>
+ <location filename="../../Filters.cpp" line="255"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="122"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="132"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="193"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1458"/>
+ <location filename="../../ListThread.cpp" line="2390"/>
+ <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="1465"/>
+ <location filename="../../ListThread.cpp" line="2397"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1481"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1488"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1497"/>
+ <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="1506"/>
+ <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="1512"/>
+ <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="1575"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1583"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="142"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="155"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="183"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="206"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="233"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="93"/>
+ <location filename="../../MkPath.cpp" line="276"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="55"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="184"/>
+ <source>Internal error reading the source file:block size out of range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="192"/>
+ <location filename="../../ReadThread.cpp" line="408"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="233"/>
+ <location filename="../../ReadThread.cpp" line="456"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="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>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="274"/>
+ <source>Blacklisted folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="404"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="348"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="414"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="452"/>
+ <source>This is not a folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="454"/>
+ <source>The folder does exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="456"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="467"/>
+ <source>Problem with name encoding</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="243"/>
+ <location filename="../../TransferThread.cpp" line="672"/>
+ <location filename="../../TransferThread.cpp" line="744"/>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="344"/>
+ <location filename="../../TransferThread.cpp" line="361"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="416"/>
+ <location filename="../../TransferThread.cpp" line="439"/>
+ <source>Internal error: Already opening</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="581"/>
+ <source>Drive %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="583"/>
+ <source>Unknown folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="587"/>
+ <source>root</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="640"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="650"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="710"/>
+ <location filename="../../TransferThread.cpp" line="825"/>
+ <source>The source file doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="750"/>
+ <location filename="../../TransferThread.cpp" line="837"/>
+ <source>Unable to do the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="786"/>
+ <source>The source doesn&apos;t exist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="831"/>
+ <source>Another file exists at same place</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1133"/>
+ <source>The checksums do not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1223"/>
+ <source>Internal error: The destination is not closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1238"/>
+ <source>Internal error: The size transfered doesn&apos;t match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1249"/>
+ <source>Internal error: The buffer is not empty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="1314"/>
+ <location filename="../../TransferThread.cpp" line="1332"/>
+ <location filename="../../TransferThread.cpp" line="1347"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="227"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="80"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="269"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="672"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="697"/>
+ <source>File truncated during read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="35"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="51"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="61"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="74"/>
+ <source>Autostart the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="81"/>
+ <location filename="../../copyEngineOptions.ui" line="101"/>
+ <source>Less performance if checked</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="104"/>
+ <source>Follow the strict order</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="130"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="136"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="146"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="172"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="232"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="263"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="270"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="290"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="303"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="334"/>
+ <source>Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="340"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="349"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="356"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="373"/>
+ <source>Verify checksums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="405"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="411"/>
+ <source>Parallel buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="418"/>
+ <location filename="../../copyEngineOptions.ui" line="431"/>
+ <location filename="../../copyEngineOptions.ui" line="444"/>
+ <location filename="../../copyEngineOptions.ui" line="481"/>
+ <location filename="../../copyEngineOptions.ui" line="550"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="460"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="467"/>
+ <source>Sequential buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="474"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="497"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="504"/>
+ <source>Transfer algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="543"/>
+ <source>Parallelize if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="573"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="580"/>
+ <location filename="../../copyEngineOptions.ui" line="590"/>
+ <source>More cpu, but better organisation on the disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="593"/>
+ <source>Order the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="609"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="615"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="625"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="637"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="659"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier/ListThread.cpp b/plugins/CopyEngine/Ultracopier/ListThread.cpp
new file mode 100644
index 0000000..8d47326
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/ListThread.cpp
@@ -0,0 +1,2399 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QMutexLocker>
+#include "../../../cpp11addition.h"
+
+ListThread::ListThread(FacilityInterface * facilityInterface)
+{
+ moveToThread(this);
+ start(HighPriority);
+ this->facilityInterface = facilityInterface;
+ putInPause = false;
+ sourceDriveMultiple = false;
+ destinationDriveMultiple = false;
+ destinationFolderMultiple = false;
+ stopIt = false;
+ bytesToTransfer = 0;
+ bytesTransfered = 0;
+ idIncrementNumber = 1;
+ actualRealByteTransfered = 0;
+ numberOfTransferIntoToDoList = 0;
+ numberOfInodeOperation = 0;
+ putAtBottom = 0;
+ maxSpeed = 0;
+ inodeThreads = 1;
+ renameTheOriginalDestination = false;
+ doRightTransfer = false;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ rsync = false;
+ #endif
+ keepDate = false;
+ checkDiskSpace = true;
+ blockSize = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*1024;
+ sequentialBuffer = ULTRACOPIER_PLUGIN_DEFAULT_SEQUENTIAL_NUMBER_OF_BLOCK;
+ parallelBuffer = ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ blockSizeAfterSpeedLimitation = blockSize;
+ #endif
+ osBufferLimit = 512;
+ alwaysDoThisActionForFileExists = FileExists_NotSet;
+ doChecksum = false;
+ checksumIgnoreIfImpossible = true;
+ checksumOnlyOnError = true;
+ osBuffer = false;
+ osBufferLimited = false;
+ forcedMode = false;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ clockForTheCopySpeed = NULL;
+ multiForBigSpeed = 0;
+ #endif
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ connect(&timerUpdateDebugDialog,&QTimer::timeout,this,&ListThread::timedUpdateDebugDialog);
+ timerUpdateDebugDialog.start(ULTRACOPIER_PLUGIN_DEBUG_WINDOW_TIMER);
+ #endif
+ connect(this, &ListThread::tryCancel, this,&ListThread::cancel, Qt::QueuedConnection);
+ connect(this, &ListThread::askNewTransferThread, this,&ListThread::createTransferThread, Qt::QueuedConnection);
+ connect(&mkPathQueue, &MkPath::firstFolderFinish, this,&ListThread::mkPathFirstFolderFinish, Qt::QueuedConnection);
+ connect(&mkPathQueue, &MkPath::errorOnFolder, this,&ListThread::mkPathErrorOnFolder, Qt::QueuedConnection);
+ connect(this, &ListThread::send_syncTransferList, this,&ListThread::syncTransferList_internal, Qt::QueuedConnection);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(&mkPathQueue, &MkPath::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection);
+ connect(&driveManagement,&DriveManagement::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection);
+ #endif // ULTRACOPIER_PLUGIN_DEBUG
+
+ emit askNewTransferThread();
+ mkpathTransfer.release();
+}
+
+ListThread::~ListThread()
+{
+ emit tryCancel();
+ waitCancel.acquire();
+ quit();
+ wait();
+}
+
+//transfer is finished
+void ListThread::transferInodeIsClosed()
+{
+ numberOfInodeOperation--;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ TransferThread *temp_transfer_thread=qobject_cast<TransferThread *>(QObject::sender());
+ if(temp_transfer_thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
+ return;
+ }
+ bool isFound=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ int countLocalParse=0;
+ #endif
+ if(temp_transfer_thread->getStat()!=TransferStat_Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not idle!");
+ return;
+ }
+ int int_for_internal_loop=0;
+ const int &loop_size=actionToDoListTransfer.size();
+ while(int_for_internal_loop<loop_size)
+ {
+ if(actionToDoListTransfer.at(int_for_internal_loop).id==temp_transfer_thread->transferId)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] have finish, put at idle; for id: %2").arg(int_for_internal_loop).arg(temp_transfer_thread->transferId).toStdString());
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::RemoveItem;
+ newAction.userAction.moveAt=0;
+ newAction.addAction=actionToDoTransferToItemOfCopyList(actionToDoListTransfer.at(int_for_internal_loop));
+ newAction.userAction.position=int_for_internal_loop;
+ actionDone.push_back(newAction);
+ /// \todo check if item is at the right thread
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+int_for_internal_loop);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
+ if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
+ updateTheStatus();
+
+ //add the current size of file, to general size because it's finish
+ copiedSize=temp_transfer_thread->copiedSize();
+ if(copiedSize>(qint64)temp_transfer_thread->transferSize)
+ {
+ oversize=copiedSize-temp_transfer_thread->transferSize;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"add oversize of: "+std::to_string(oversize));
+ bytesToTransfer+=oversize;
+ bytesTransfered+=oversize;
+ }
+ bytesTransfered+=temp_transfer_thread->transferSize;
+
+ if(temp_transfer_thread->haveStartTime)
+ {
+ timeToTransfer.push_back(std::pair<uint64_t,uint32_t>(temp_transfer_thread->transferSize,temp_transfer_thread->startTransferTime.elapsed()));
+ temp_transfer_thread->haveStartTime=false;
+ }
+ temp_transfer_thread->transferId=0;
+ temp_transfer_thread->transferSize=0;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ countLocalParse++;
+ #endif
+ isFound=true;
+ if(actionToDoListTransfer.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionToDoListTransfer==0");
+ actionToDoListInode.insert(actionToDoListInode.cbegin(),actionToDoListInode_afterTheTransfer.cbegin(),actionToDoListInode_afterTheTransfer.cend());
+ actionToDoListInode_afterTheTransfer.clear();
+ doNewActions_inode_manipulation();
+ }
+ break;
+ }
+ int_for_internal_loop++;
+ }
+ if(isFound)
+ deleteTransferThread();
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QStringLiteral("unable to found item into the todo list, id: %1, index: %2").arg(temp_transfer_thread->transferId).arg(int_for_internal_loop).toStdString());
+ temp_transfer_thread->transferId=0;
+ temp_transfer_thread->transferSize=0;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("countLocalParse: %1, actionToDoList.size(): %2").arg(countLocalParse).arg(actionToDoListTransfer.size()).toStdString());
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(countLocalParse!=1)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"countLocalParse != 1");
+ #endif
+ doNewActions_inode_manipulation();
+}
+
+/** \brief put the current file at bottom in case of error
+\note ONLY IN CASE OF ERROR */
+void ListThread::transferPutAtBottom()
+{
+ TransferThread *transfer=qobject_cast<TransferThread *>(QObject::sender());
+ if(transfer==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
+ return;
+ }
+ bool isFound=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ int countLocalParse=0;
+ #endif
+ unsigned int indexAction=0;
+ while(indexAction<actionToDoListTransfer.size())
+ {
+ if(actionToDoListTransfer.at(indexAction).id==transfer->transferId)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Put at the end: "+std::to_string(transfer->transferId));
+ //push for interface at the end
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=transfer->transferId;
+ newAction.userAction.position=actionToDoListTransfer.size()-1;
+ actionDone.push_back(newAction);
+ //do the wait stat
+ actionToDoListTransfer[indexAction].isRunning=false;
+ //move at the end
+ actionToDoListTransfer.push_back(actionToDoListTransfer.at(indexAction));
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+indexAction);
+ //reset the thread list stat
+ transfer->transferId=0;
+ transfer->transferSize=0;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ countLocalParse++;
+ #endif
+ isFound=true;
+ break;
+ }
+ indexAction++;
+ }
+ if(!isFound)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QStringLiteral("unable to found item into the todo list, id: %1, index: %2").arg(transfer->transferId).toStdString());
+ transfer->transferId=0;
+ transfer->transferSize=0;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"countLocalParse: "+std::to_string(countLocalParse));
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(countLocalParse!=1)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"countLocalParse != 1");
+ #endif
+ transfer->skip();
+}
+
+//set the copy info and options before runing
+void ListThread::setRightTransfer(const bool doRightTransfer)
+{
+ mkPathQueue.setRightTransfer(doRightTransfer);
+ this->doRightTransfer=doRightTransfer;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setRightTransfer(doRightTransfer);
+ index++;
+ }
+}
+
+//set keep date
+void ListThread::setKeepDate(const bool keepDate)
+{
+ mkPathQueue.setKeepDate(keepDate);
+ this->keepDate=keepDate;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setKeepDate(keepDate);
+ index++;
+ }
+}
+
+//set block size in KB
+void ListThread::setBlockSize(const int blockSize)
+{
+ this->blockSize=blockSize*1024;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setBlockSize(this->blockSize);
+ index++;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ setSpeedLimitation(maxSpeed);
+ #endif
+}
+
+//set auto start
+void ListThread::setAutoStart(const bool autoStart)
+{
+ this->autoStart=autoStart;
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+/// \brief set rsync
+void ListThread::setRsync(const bool rsync)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set rsync: "+std::to_string(rsync));
+ this->rsync=rsync;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setRsync(rsync);
+ index++;
+ }
+ for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setRsync(rsync);
+}
+#endif
+
+//set check destination folder
+void ListThread::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+{
+ this->checkDestinationFolderExists=checkDestinationFolderExists;
+ for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
+}
+
+void ListThread::fileTransfer(const QFileInfo &sourceFileInfo,const QFileInfo &destinationFileInfo,const Ultracopier::CopyMode &mode)
+{
+ if(stopIt)
+ return;
+ addToTransfer(sourceFileInfo,destinationFileInfo,mode);
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::haveSameSource(const std::vector<std::string> &sources)
+{
+ if(stopIt)
+ return false;
+ if(sourceDriveMultiple)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sourceDriveMultiple");
+ return false;
+ }
+ if(sourceDrive.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sourceDrive.isEmpty()");
+ return true;
+ }
+ unsigned int index=0;
+ while(index<sources.size())
+ {
+ if(driveManagement.getDrive(sources.at(index))!=sourceDrive)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sources.at(index))!=sourceDrive");
+ return false;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"seam have same source");
+ return true;
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::haveSameDestination(const std::string &destination)
+{
+ if(stopIt)
+ return false;
+ if(destinationDriveMultiple)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDriveMultiple");
+ return false;
+ }
+ if(destinationDrive.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDrive.isEmpty()");
+ return true;
+ }
+ if(driveManagement.getDrive(destination)!=destinationDrive)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination!=destinationDrive");
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"seam have same destination");
+ return true;
+}
+
+/// \return empty if multiple or no destination
+std::string ListThread::getUniqueDestinationFolder() const
+{
+ if(stopIt)
+ return std::string();
+ if(destinationFolderMultiple)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDriveMultiple");
+ return std::string();
+ }
+ return destinationFolder;
+}
+
+ScanFileOrFolder * ListThread::newScanThread(Ultracopier::CopyMode mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start with: "+std::to_string(mode));
+
+ //create new thread because is auto-detroyed
+ scanFileOrFolderThreadsPool.push_back(new ScanFileOrFolder(mode));
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::finishedTheListing, this,&ListThread::scanThreadHaveFinishSlot, Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::fileTransfer, this,&ListThread::fileTransfer, Qt::QueuedConnection);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection);
+ #endif
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::newFolderListing, this,&ListThread::newFolderListing);
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::addToMovePath, this,&ListThread::addToMovePath, Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::addToRealMove, this,&ListThread::addToRealMove, Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::addToMkPath, this,&ListThread::addToMkPath, Qt::QueuedConnection);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::addToRmForRsync, this,&ListThread::addToRmForRsync, Qt::QueuedConnection);
+ #endif
+
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::errorOnFolder, this,&ListThread::errorOnFolder, Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::folderAlreadyExists, this,&ListThread::folderAlreadyExists, Qt::QueuedConnection);
+
+ connect(this,&ListThread::send_updateMount, scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::set_updateMount, Qt::QueuedConnection);
+
+ scanFileOrFolderThreadsPool.back()->setFilters(include,exclude);
+ scanFileOrFolderThreadsPool.back()->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
+ scanFileOrFolderThreadsPool.back()->setMoveTheWholeFolder(moveTheWholeFolder);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ scanFileOrFolderThreadsPool.back()->setRsync(rsync);
+ #endif
+ if(scanFileOrFolderThreadsPool.size()==1)
+ updateTheStatus();
+ scanFileOrFolderThreadsPool.back()->setRenamingRules(firstRenamingRule,otherRenamingRule);
+ return scanFileOrFolderThreadsPool.back();
+}
+
+void ListThread::scanThreadHaveFinishSlot()
+{
+ scanThreadHaveFinish();
+}
+
+void ListThread::scanThreadHaveFinish(bool skipFirstRemove)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"listing thread have finish, skipFirstRemove: "+std::to_string(skipFirstRemove));
+ if(!skipFirstRemove)
+ {
+ ScanFileOrFolder * senderThread = qobject_cast<ScanFileOrFolder *>(QObject::sender());
+ if(senderThread==NULL)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"sender pointer null (plugin copy engine)");
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start the next thread, scanFileOrFolderThreadsPool.size(): "+std::to_string(scanFileOrFolderThreadsPool.size()));
+ delete senderThread;
+ vectorremoveOne(scanFileOrFolderThreadsPool,senderThread);
+ if(scanFileOrFolderThreadsPool.empty())
+ updateTheStatus();
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start the next thread, scanFileOrFolderThreadsPool.size(): "+std::to_string(scanFileOrFolderThreadsPool.size()));
+ if(scanFileOrFolderThreadsPool.size()>0)
+ {
+ //then start the next listing threads
+ if(scanFileOrFolderThreadsPool.front()->isFinished())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Start listing thread");
+ scanFileOrFolderThreadsPool.front()->start();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"The listing thread is already running");
+ }
+ else
+ autoStartAndCheckSpace();
+}
+
+void ListThread::autoStartAndCheckSpace()
+{
+ if(needMoreSpace())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Need more space");
+ return;
+ }
+ autoStartIfNeeded();
+}
+
+void ListThread::autoStartIfNeeded()
+{
+ if(autoStart)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Auto start the copy");
+ startGeneralTransfer();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Put the copy engine in pause");
+ putInPause=true;
+ emit isInPause(true);
+ }
+}
+
+void ListThread::startGeneralTransfer()
+{
+ doNewActions_inode_manipulation();
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::newCopy(const std::vector<std::string> &sources,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+stringimplode(sources,";")+", destination: "+destination);
+ ScanFileOrFolder * scanFileOrFolderThread = newScanThread(Ultracopier::Copy);
+ if(scanFileOrFolderThread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get new thread");
+ return false;
+ }
+ scanFileOrFolderThread->addToList(sources,destination);
+ scanThreadHaveFinish(true);
+ detectDrivesOfCurrentTransfer(sources,destination);
+ return true;
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::newMove(const std::vector<std::string> &sources,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ ScanFileOrFolder * scanFileOrFolderThread = newScanThread(Ultracopier::Move);
+ if(scanFileOrFolderThread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get new thread");
+ return false;
+ }
+ scanFileOrFolderThread->addToList(sources,destination);
+ scanThreadHaveFinish(true);
+ detectDrivesOfCurrentTransfer(sources,destination);
+ return true;
+}
+
+void ListThread::detectDrivesOfCurrentTransfer(const std::vector<std::string> &sources,const std::string &destination)
+{
+ /* code to detect volume/mount point to group by windows */
+ if(!sourceDriveMultiple)
+ {
+ unsigned int index=0;
+ while(index<sources.size())
+ {
+ const std::string &tempDrive=driveManagement.getDrive(sources.at(index));
+ //if have not already source, set the source
+ if(sourceDrive.empty())
+ sourceDrive=tempDrive;
+ //if have previous source and the news source is not the same
+ if(sourceDrive!=tempDrive)
+ {
+ sourceDriveMultiple=true;
+ break;
+ }
+ index++;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source informations, sourceDrive: %1, sourceDriveMultiple: %2").arg(QString::fromStdString(sourceDrive)).arg(sourceDriveMultiple).toStdString());
+ if(!destinationDriveMultiple)
+ {
+ const std::string &tempDrive=driveManagement.getDrive(destination);
+ //if have not already destination, set the destination
+ if(destinationDrive.empty())
+ destinationDrive=tempDrive;
+ //if have previous destination and the news destination is not the same
+ if(destinationDrive!=tempDrive)
+ destinationDriveMultiple=true;
+ }
+ if(!destinationFolderMultiple)
+ {
+ //if have not already destination, set the destination
+ if(destinationFolder.empty())
+ destinationFolder=destination;
+ //if have previous destination and the news destination is not the same
+ if(destinationFolder!=destination)
+ destinationFolderMultiple=true;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("destination informations, destinationDrive: %1, destinationDriveMultiple: %2").arg(QString::fromStdString(destinationDrive)).arg(destinationDriveMultiple).toStdString());
+}
+
+void ListThread::setCollisionAction(const FileExistsAction &alwaysDoThisActionForFileExists)
+{
+ this->alwaysDoThisActionForFileExists=alwaysDoThisActionForFileExists;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ index++;
+ }
+}
+
+/** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+void ListThread::syncTransferList()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit send_syncTransferList();
+}
+
+//set the folder local collision
+void ListThread::setFolderCollision(const FolderExistsAction &alwaysDoThisActionForFolderExists)
+{
+ this->alwaysDoThisActionForFolderExists=alwaysDoThisActionForFolderExists;
+}
+
+bool ListThread::getReturnBoolToCopyEngine() const
+{
+ return returnBoolToCopyEngine;
+}
+
+std::pair<quint64, quint64> ListThread::getReturnPairQuint64ToCopyEngine() const
+{
+ return returnPairQuint64ToCopyEngine;
+}
+
+Ultracopier::ItemOfCopyList ListThread::getReturnItemOfCopyListToCopyEngine() const
+{
+ return returnItemOfCopyListToCopyEngine;
+}
+
+void ListThread::set_doChecksum(bool doChecksum)
+{
+ this->doChecksum=doChecksum;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->set_doChecksum(doChecksum);
+ index++;
+ }
+}
+
+void ListThread::set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible)
+{
+ this->checksumIgnoreIfImpossible=checksumIgnoreIfImpossible;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+ index++;
+ }
+}
+
+void ListThread::set_checksumOnlyOnError(bool checksumOnlyOnError)
+{
+ this->checksumOnlyOnError=checksumOnlyOnError;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->set_checksumOnlyOnError(checksumOnlyOnError);
+ index++;
+ }
+}
+
+void ListThread::set_osBuffer(bool osBuffer)
+{
+ this->osBuffer=osBuffer;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->set_osBuffer(osBuffer);
+ index++;
+ }
+}
+
+void ListThread::set_osBufferLimited(bool osBufferLimited)
+{
+ this->osBufferLimited=osBufferLimited;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->set_osBufferLimited(osBufferLimited);
+ index++;
+ }
+}
+
+void ListThread::realByteTransfered()
+{
+ quint64 totalRealByteTransfered=0;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ totalRealByteTransfered+=transferThreadList.at(index)->realByteTransfered();
+ index++;
+ }
+ emit send_realBytesTransfered(totalRealByteTransfered);
+}
+
+void ListThread::pause()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Seam already in pause!");
+ return;
+ }
+ putInPause=true;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->pause();
+ index++;
+ }
+ emit isInPause(true);
+}
+
+void ListThread::resume()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(!putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Seam already resumed!");
+ return;
+ }
+ putInPause=false;
+ startGeneralTransfer();
+ doNewActions_start_transfer();
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->resume();
+ index++;
+ }
+ emit isInPause(false);
+}
+
+void ListThread::skip(const uint64_t &id)
+{
+ skipInternal(id);
+}
+
+bool ListThread::skipInternal(const uint64_t &id)
+{
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ if(transferThreadList.at(index)->transferId==id)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"skip one transfer: "+std::to_string(id));
+ transferThreadList.at(index)->skip();
+ return true;
+ }
+ index++;
+ }
+ int int_for_internal_loop=0;
+ const int &loop_size=actionToDoListTransfer.size();
+ while(int_for_internal_loop<loop_size)
+ {
+ if(actionToDoListTransfer.at(int_for_internal_loop).id==id)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] remove at not running, for id: %2").arg(int_for_internal_loop).arg(id).toStdString());
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::RemoveItem;
+ newAction.userAction.moveAt=1;
+ newAction.addAction=actionToDoTransferToItemOfCopyList(actionToDoListTransfer.at(int_for_internal_loop));
+ newAction.userAction.position=int_for_internal_loop;
+ actionDone.push_back(newAction);
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+int_for_internal_loop);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
+ if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
+ updateTheStatus();
+ return true;
+ }
+ int_for_internal_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"skip transfer not found: "+std::to_string(id));
+ return false;
+}
+
+//executed in this thread
+void ListThread::cancel()
+{
+ if(stopIt)
+ {
+ waitCancel.release();
+ return;
+ }
+ stopIt=true;
+ int index=0;
+ int loop_size=transferThreadList.size();
+ while(index<loop_size)
+ {
+ transferThreadList.at(index)->stop();
+ index++;
+ }
+ index=0;
+ loop_size=scanFileOrFolderThreadsPool.size();
+ while(index<loop_size)
+ {
+ scanFileOrFolderThreadsPool.at(index)->stop();
+ delete scanFileOrFolderThreadsPool.at(index);//->deleteLayer();
+ scanFileOrFolderThreadsPool[index]=NULL;
+ index++;
+ }
+ scanFileOrFolderThreadsPool.clear();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ if(clockForTheCopySpeed!=NULL)
+ {
+ clockForTheCopySpeed->stop();
+ delete clockForTheCopySpeed;
+ clockForTheCopySpeed=NULL;
+ }
+ #endif
+ checkIfReadyToCancel();
+}
+
+void ListThread::checkIfReadyToCancel()
+{
+ if(!stopIt)
+ return;
+ int index=0;
+ int loop_size=transferThreadList.size();
+ while(index<loop_size)
+ {
+ if(transferThreadList.at(index)!=NULL)
+ {
+ if(transferThreadList.at(index)->transferId!=0)
+ return;
+ delete transferThreadList.at(index);//->deleteLayer();
+ transferThreadList[index]=NULL;
+ transferThreadList.erase(transferThreadList.cbegin()+index);
+ loop_size=transferThreadList.size();
+ index--;
+ }
+ index++;
+ }
+ actionToDoListTransfer.clear();
+ actionToDoListInode.clear();
+ actionToDoListInode_afterTheTransfer.clear();
+ actionDone.clear();
+ progressionList.clear();
+ returnListItemOfCopyListToCopyEngine.clear();
+ quit();
+ waitCancel.release();
+ emit canBeDeleted();
+}
+
+//speedLimitation in KB/s
+bool ListThread::setSpeedLimitation(const int64_t &speedLimitation)
+{
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"maxSpeed in KB/s: "+std::to_string(speedLimitation));
+
+ if(speedLimitation>1024*1024)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"speedLimitation out of range");
+ return false;
+ }
+ maxSpeed=speedLimitation;
+
+ multiForBigSpeed=0;
+ if(maxSpeed>0)
+ {
+ blockSizeAfterSpeedLimitation=blockSize;
+
+ //try resolv the interval
+ int newInterval;//in ms
+ do
+ {
+ multiForBigSpeed++;
+ //at max speed, is out of range for int, it's why quint64 is used
+ newInterval=(((quint64)blockSize*(quint64)multiForBigSpeed*1000/* *1000 because interval is into ms, not s*/)/((quint64)maxSpeed*(quint64)1024));
+ if(newInterval<0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated newInterval wrong");
+ return false;
+ }
+ }
+ while(newInterval<ULTRACOPIER_PLUGIN_MINTIMERINTERVAL);
+
+ if(newInterval<=0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated newInterval wrong");
+ return false;
+ }
+ //wait time too big, then shrink the block size and set interval to max size
+ if(newInterval>ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"wait time too big, then shrink the block size and set interval to max size");
+ newInterval=ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL;
+ multiForBigSpeed=1;
+ blockSizeAfterSpeedLimitation=(this->maxSpeed*1024*newInterval)/1000;
+
+ if(blockSizeAfterSpeedLimitation<10)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated block size wrong");
+ return false;
+ }
+
+ //set the new block size into the thread
+ const int &loop_size=transferThreadList.size();
+ int int_for_loop=0;
+ while(int_for_loop<loop_size)
+ {
+ if(!transferThreadList.at(int_for_loop)->setBlockSize(blockSizeAfterSpeedLimitation))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the block size");
+ int_for_loop++;
+ }
+ }
+
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("fixed speed with new block size and new interval in BlockSize: %1, multiForBigSpeed: %2, newInterval: %3, maxSpeed: %4")
+ .arg(blockSizeAfterSpeedLimitation)
+ .arg(multiForBigSpeed)
+ .arg(newInterval)
+ .arg(maxSpeed)
+ .toStdString()
+ );
+
+ clockForTheCopySpeed->setInterval(newInterval);
+ if(clockForTheCopySpeed!=NULL)
+ clockForTheCopySpeed->start();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"clockForTheCopySpeed == NULL at this point");
+ }
+ else
+ {
+ if(clockForTheCopySpeed!=NULL)
+ clockForTheCopySpeed->stop();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"clockForTheCopySpeed == NULL at this point");
+ int int_for_loop=0;
+ const int &loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ transferThreadList.at(int_for_loop)->setBlockSize(blockSize);
+ int_for_loop++;
+ }
+ }
+ int int_for_loop=0;
+ const int &loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ transferThreadList.at(int_for_loop)->setMultiForBigSpeed(multiForBigSpeed);
+ int_for_loop++;
+ }
+
+ return true;
+ #else
+ Q_UNUSED(speedLimitation);
+ return false;
+ #endif
+}
+
+void ListThread::updateTheStatus()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ sendActionDone();
+ bool updateTheStatus_listing=scanFileOrFolderThreadsPool.size()>0;
+ bool updateTheStatus_copying=actionToDoListTransfer.size()>0 || actionToDoListInode.size()>0 || actionToDoListInode_afterTheTransfer.size()>0;
+ Ultracopier::EngineActionInProgress updateTheStatus_action_in_progress;
+ if(updateTheStatus_copying && updateTheStatus_listing)
+ updateTheStatus_action_in_progress=Ultracopier::CopyingAndListing;
+ else if(updateTheStatus_listing)
+ updateTheStatus_action_in_progress=Ultracopier::Listing;
+ else if(updateTheStatus_copying)
+ updateTheStatus_action_in_progress=Ultracopier::Copying;
+ else
+ updateTheStatus_action_in_progress=Ultracopier::Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit actionInProgess("+std::to_string(updateTheStatus_action_in_progress)+")");
+ emit actionInProgess(updateTheStatus_action_in_progress);
+}
+
+//set data local to the thread
+void ListThread::setAlwaysFileExistsAction(const FileExistsAction &alwaysDoThisActionForFileExists)
+{
+ this->alwaysDoThisActionForFileExists=alwaysDoThisActionForFileExists;
+ int int_for_loop=0;
+ const int &loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ transferThreadList.at(int_for_loop)->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ int_for_loop++;
+ }
+}
+
+//mk path to do
+uint64_t ListThread::addToMkPath(const QFileInfo& source,const QFileInfo& destination, const int& inode)
+{
+ if(stopIt)
+ return 0;
+ if(inode!=0 && (!keepDate && !doRightTransfer))
+ return 0;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
+ ActionToDoInode temp;
+ temp.type = ActionType_MkPath;
+ temp.id = generateIdNumber();
+ temp.source = source;
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+ return temp.id;
+}
+
+//add rm path to do
+void ListThread::addToMovePath(const QFileInfo& source, const QFileInfo &destination, const int& inodeToRemove)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2, inodeToRemove: %3").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).arg(inodeToRemove).toStdString());
+ ActionToDoInode temp;
+ temp.type = ActionType_MovePath;
+ temp.id = generateIdNumber();
+ temp.size = inodeToRemove;
+ temp.source = source;
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+}
+
+void ListThread::addToRealMove(const QFileInfo& source,const QFileInfo& destination)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
+ ActionToDoInode temp;
+ temp.type = ActionType_RealMove;
+ temp.id = generateIdNumber();
+ temp.size = 0;
+ temp.source = source;
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+//rsync rm
+void ListThread::addToRmForRsync(const QFileInfo& destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inode: "+destination.absoluteFilePath().toStdString());
+ ActionToDoInode temp;
+ temp.type = ActionType_RmSync;
+ temp.id = generateIdNumber();
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+}
+#endif
+
+//send action done
+void ListThread::sendActionDone()
+{
+ if(!actionDone.empty())
+ {
+ emit newActionOnList(actionDone);
+ actionDone.clear();
+ }
+ if(!timeToTransfer.empty())
+ {
+ emit doneTime(timeToTransfer);
+ timeToTransfer.clear();
+ }
+}
+
+//send progression
+void ListThread::sendProgression()
+{
+ if(actionToDoListTransfer.empty())
+ return;
+ oversize=0;
+ currentProgression=0;
+ int int_for_loop=0;
+ const int &loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ TransferThread * temp_transfer_thread=transferThreadList.at(int_for_loop);
+ switch(temp_transfer_thread->getStat())
+ {
+ case TransferStat_Transfer:
+ case TransferStat_PostTransfer:
+ case TransferStat_Checksum:
+ case TransferStat_PostOperation:
+ {
+ copiedSize=temp_transfer_thread->copiedSize();
+
+ //for the general progression
+ currentProgression+=copiedSize;
+
+ //the oversize (when the file is bigger after/during the copy then what was during the listing)
+ if(copiedSize>(qint64)temp_transfer_thread->transferSize)
+ localOverSize=copiedSize-temp_transfer_thread->transferSize;
+ else
+ localOverSize=0;
+
+ //the current size copied
+ totalSize=temp_transfer_thread->transferSize+localOverSize;
+ std::pair<uint64_t,uint64_t> progression=temp_transfer_thread->progression();
+ tempItem.currentRead=progression.first;
+ tempItem.currentWrite=progression.second;
+ tempItem.id=temp_transfer_thread->transferId;
+ tempItem.total=totalSize;
+ progressionList.push_back(tempItem);
+
+ //add the oversize to the general progression
+ oversize+=localOverSize;
+ }
+ break;
+ default:
+ break;
+ }
+ int_for_loop++;
+ }
+ emit pushFileProgression(progressionList);
+ progressionList.clear();
+ emit pushGeneralProgression(bytesTransfered+currentProgression,bytesToTransfer+oversize);
+ realByteTransfered();
+}
+
+//send the progression, after full reset of the interface (then all is empty)
+void ListThread::syncTransferList_internal()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit syncReady();
+ actionDone.clear();
+ //do list operation
+ TransferThread *transferThread;
+ const int &loop_size=actionToDoListTransfer.size();
+ int loop_sub_size=transferThreadList.size();
+ //this loop to have at max inodeThreads*inodeThreads, not inodeThreads*transferThreadList.size()
+ int int_for_internal_loop;
+ for(int int_for_loop=0; int_for_loop<loop_size; ++int_for_loop) {
+ const ActionToDoTransfer &item=actionToDoListTransfer.at(int_for_loop);
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::PreOperation;
+ newAction.addAction.id = item.id;
+ newAction.addAction.sourceFullPath = item.source.absoluteFilePath().toStdString();
+ newAction.addAction.sourceFileName = item.source.fileName().toStdString();
+ newAction.addAction.destinationFullPath = item.destination.absoluteFilePath().toStdString();
+ newAction.addAction.destinationFileName = item.destination.fileName().toStdString();
+ newAction.addAction.size = item.size;
+ newAction.addAction.mode = item.mode;
+ actionDone.push_back(newAction);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, size: %2, name: %3, size2: %4").arg(item.id).arg(item.size).arg(item.source.absoluteFilePath()).arg(newAction.addAction.size).toStdString());
+ if(item.isRunning)
+ {
+ for(int_for_internal_loop=0; int_for_internal_loop<loop_sub_size; ++int_for_internal_loop) {
+ transferThread=transferThreadList.at(int_for_internal_loop);
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::PreOperation;
+ newAction.addAction.id = item.id;
+ newAction.addAction.sourceFullPath = item.source.absoluteFilePath().toStdString();
+ newAction.addAction.sourceFileName = item.source.fileName().toStdString();
+ newAction.addAction.destinationFullPath = item.destination.absoluteFilePath().toStdString();
+ newAction.addAction.destinationFileName = item.destination.fileName().toStdString();
+ newAction.addAction.size = item.size;
+ newAction.addAction.mode = item.mode;
+ actionDone.push_back(newAction);
+ if(transferThread->getStat()!=TransferStat_PreOperation)
+ {
+ Ultracopier::ReturnActionOnCopyList newAction;
+ switch(transferThread->getStat())
+ {
+ case TransferStat_Transfer:
+ newAction.type=Ultracopier::Transfer;
+ break;
+ /*case TransferStat_PostTransfer:
+ newAction.type=Ultracopier::PostOperation;
+ break;*/
+ case TransferStat_PostOperation:
+ newAction.type=Ultracopier::PostOperation;
+ break;
+ default:
+ break;
+ }
+ newAction.addAction.id = item.id;
+ actionDone.push_back(newAction);
+ }
+ }
+ }
+ }
+}
+
+//add file transfer to do
+uint64_t ListThread::addToTransfer(const QFileInfo& source,const QFileInfo& destination,const Ultracopier::CopyMode& mode)
+{
+ if(stopIt)
+ return 0;
+ //add to transfer list
+ numberOfTransferIntoToDoList++;
+ quint64 size=0;
+ if(!source.isSymLink())
+ size=source.size();
+ const std::string &drive=driveManagement.getDrive(destination.absoluteFilePath().toStdString());
+ if(!drive.empty())//can be a network drive
+ if(mode!=Ultracopier::Move || drive!=driveManagement.getDrive(source.absoluteFilePath().toStdString()))
+ {
+ if(requiredSpace.find(drive)!=requiredSpace.cend())
+ {
+ requiredSpace[drive]+=size;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("space needed add: %1, space needed: %2, on: %3").arg(size).arg(requiredSpace.at(drive)).arg(QString::fromStdString(drive)).toStdString());
+ }
+ else
+ {
+ requiredSpace[drive]=size;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("set space %1 needed, on: %2").arg(size).arg(QString::fromStdString(drive)).toStdString());
+ }
+ }
+ bytesToTransfer+= size;
+ ActionToDoTransfer temp;
+ temp.id = generateIdNumber();
+ temp.size = size;
+ temp.source = source;
+ temp.destination= destination;
+ temp.mode = mode;
+ temp.isRunning = false;
+ actionToDoListTransfer.push_back(temp);
+ //push the new transfer to interface
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::AddingItem;
+ newAction.addAction=actionToDoTransferToItemOfCopyList(temp);
+ actionDone.push_back(newAction);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2, add entry: %3, size: %4, size2: %5, isSymLink: %6").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).arg(temp.id).arg(temp.size).arg(size).arg(source.isSymLink()).toStdString());
+ return temp.id;
+}
+
+Ultracopier::ItemOfCopyList ListThread::actionToDoTransferToItemOfCopyList(const ListThread::ActionToDoTransfer &actionToDoTransfer)
+{
+ Ultracopier::ItemOfCopyList itemOfCopyList;
+ itemOfCopyList.id = actionToDoTransfer.id;
+ itemOfCopyList.sourceFullPath = actionToDoTransfer.source.absoluteFilePath().toStdString();
+ itemOfCopyList.sourceFileName = actionToDoTransfer.source.fileName().toStdString();
+ itemOfCopyList.destinationFullPath = actionToDoTransfer.destination.absoluteFilePath().toStdString();
+ itemOfCopyList.destinationFileName = actionToDoTransfer.destination.fileName().toStdString();
+ itemOfCopyList.size = actionToDoTransfer.size;
+ itemOfCopyList.mode = actionToDoTransfer.mode;
+ return itemOfCopyList;
+}
+
+//generate id number
+uint64_t ListThread::generateIdNumber()
+{
+ idIncrementNumber++;
+ if(idIncrementNumber>(((quint64)1024*1024)*1024*1024*2))
+ idIncrementNumber=0;
+ return idIncrementNumber;
+}
+
+//warning the first entry is accessible will copy
+void ListThread::removeItems(const std::vector<uint64_t> &ids)
+{
+ for(unsigned int i=0;i<ids.size();i++)
+ skipInternal(ids.at(i));
+}
+
+//put on top
+void ListThread::moveItemsOnTop(std::vector<uint64_t> ids)
+{
+ if(actionToDoListTransfer.size()<=1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //do list operation
+ int indexToMove=0;
+ for (unsigned int i=0; i<actionToDoListTransfer.size(); ++i) {
+ if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
+ {
+ vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(indexToMove));
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=indexToMove;
+ newAction.userAction.position=i;
+ actionDone.push_back(newAction);
+ ActionToDoTransfer temp=actionToDoListTransfer.at(i);
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+i);
+ actionToDoListTransfer.insert(actionToDoListTransfer.cbegin()+indexToMove,temp);
+ indexToMove++;
+ if(ids.empty())
+ return;
+ }
+ }
+ sendActionDone();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//move up
+void ListThread::moveItemsUp(std::vector<uint64_t> ids)
+{
+ if(actionToDoListTransfer.size()<=1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionReal=0;
+ bool haveGoodPosition=false;
+ for (unsigned int i=0; i<actionToDoListTransfer.size(); ++i) {
+ if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
+ {
+ if(haveGoodPosition)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(i-1));
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionReal;
+ newAction.userAction.position=i;
+ actionDone.push_back(newAction);
+ ActionToDoTransfer temp1=actionToDoListTransfer.at(i);
+ ActionToDoTransfer temp2=actionToDoListTransfer.at(lastGoodPositionReal);
+ actionToDoListTransfer[i]=temp2;
+ actionToDoListTransfer[lastGoodPositionReal]=temp1;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Try move up false, item "+std::to_string(i));
+ vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
+ if(ids.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
+ return;
+ }
+ }
+ else
+ {
+ lastGoodPositionReal=i;
+ haveGoodPosition=true;
+ }
+ }
+ sendActionDone();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//move down
+void ListThread::moveItemsDown(std::vector<uint64_t> ids)
+{
+ if(actionToDoListTransfer.size()<=1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionReal=0;
+ bool haveGoodPosition=false;
+ for (int i=actionToDoListTransfer.size()-1; i>=0; --i) {
+ if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
+ {
+ if(haveGoodPosition)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(i+1));
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionReal;
+ newAction.userAction.position=i;
+ actionDone.push_back(newAction);
+ ActionToDoTransfer temp1=actionToDoListTransfer.at(i);
+ ActionToDoTransfer temp2=actionToDoListTransfer.at(lastGoodPositionReal);
+ actionToDoListTransfer[i]=temp2;
+ actionToDoListTransfer[lastGoodPositionReal]=temp1;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Try move up false, item "+std::to_string(i));
+ }
+ vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
+ if(ids.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
+ return;
+ }
+ }
+ else
+ {
+ lastGoodPositionReal=i;
+ haveGoodPosition=true;
+ }
+ }
+ sendActionDone();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//put on bottom
+void ListThread::moveItemsOnBottom(std::vector<uint64_t> ids)
+{
+ if(actionToDoListTransfer.size()<=1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionReal=actionToDoListTransfer.size()-1;
+ for (int i=lastGoodPositionReal; i>=0; --i) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Check action on item "+std::to_string(i));
+ if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(lastGoodPositionReal));
+ vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionReal;
+ newAction.userAction.position=i;
+ actionDone.push_back(newAction);
+ ActionToDoTransfer temp=actionToDoListTransfer.at(i);
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+i);
+ actionToDoListTransfer.insert(actionToDoListTransfer.cbegin()+lastGoodPositionReal,temp);
+ lastGoodPositionReal--;
+ if(ids.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
+ return;
+ }
+ }
+ }
+ sendActionDone();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+/** \brief give the forced mode, to export/import transfer list */
+void ListThread::forceMode(const Ultracopier::CopyMode &mode)
+{
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(mode==Ultracopier::Move)
+ setRsync(false);
+ #endif
+ if(mode==Ultracopier::Copy)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Force mode to copy");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Force mode to move");
+ this->mode=mode;
+ forcedMode=true;
+}
+
+void ListThread::exportTransferList(const std::string &fileName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QFile transferFile(QString::fromStdString(fileName));
+ if(transferFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
+ {
+ transferFile.write(QStringLiteral("Ultracopier;Transfer-list;").toUtf8());
+ if(!forcedMode)
+ transferFile.write(QStringLiteral("Transfer;").toUtf8());
+ else
+ {
+ if(mode==Ultracopier::Copy)
+ transferFile.write(QStringLiteral("Copy;").toUtf8());
+ else
+ transferFile.write(QStringLiteral("Move;").toUtf8());
+ }
+ transferFile.write(QStringLiteral("Ultracopier\n").toUtf8());
+ bool haveError=false;
+ int size=actionToDoListTransfer.size();
+ for (int index=0;index<size;++index) {
+ if(actionToDoListTransfer.at(index).mode==Ultracopier::Copy)
+ {
+ if(!forcedMode || mode==Ultracopier::Copy)
+ {
+ if(forcedMode)
+ transferFile.write(QStringLiteral("%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
+ else
+ transferFile.write(QStringLiteral("Copy;%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
+ }
+ else
+ haveError=true;
+ }
+ else if(actionToDoListTransfer.at(index).mode==Ultracopier::Move)
+ {
+ if(!forcedMode || mode==Ultracopier::Move)
+ {
+ if(forcedMode)
+ transferFile.write(QStringLiteral("%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
+ else
+ transferFile.write(QStringLiteral("Move;%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
+ }
+ else
+ haveError=true;
+ }
+ }
+ if(haveError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
+ emit errorTransferList(tr("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
+ }
+ transferFile.close();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ emit errorTransferList(tr("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ return;
+ }
+}
+
+void ListThread::importTransferList(const std::string &fileName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QFile transferFile(QString::fromStdString(fileName));
+ if(transferFile.open(QIODevice::ReadOnly))
+ {
+ std::string content;
+ QByteArray data=transferFile.readLine(64);
+ if(data.size()<=0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Problem reading file, or file-size is 0");
+ emit errorTransferList(tr("Problem reading file, or file-size is 0").toStdString());
+ return;
+ }
+ content=QString::fromUtf8(data).toStdString();
+ if(content!="Ultracopier;Transfer-list;Transfer;Ultracopier\n" && content!="Ultracopier;Transfer-list;Copy;Ultracopier\n" && content!="Ultracopier;Transfer-list;Move;Ultracopier\n")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong header: "+content);
+ emit errorTransferList(tr("Wrong header: \"%1\"").arg(QString::fromStdString(content)).toStdString());
+ return;
+ }
+ bool transferListMixedMode=false;
+ if(content=="Ultracopier;Transfer-list;Transfer;Ultracopier\n")
+ {
+ if(forcedMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The transfer list is in mixed mode, but this instance is not");
+ emit errorTransferList(tr("The transfer list is in mixed mode, but this instance is not in this mode").toStdString());
+ return;
+ }
+ else
+ transferListMixedMode=true;
+ }
+ if(content=="Ultracopier;Transfer-list;Copy;Ultracopier\n" && (forcedMode && mode==Ultracopier::Move))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The transfer list is in copy mode, but this instance is not: forcedMode: %1, mode: %2").arg(forcedMode).arg(mode).toStdString());
+ emit errorTransferList(tr("The transfer list is in copy mode, but this instance is not in this mode").toStdString());
+ return;
+ }
+ if(content=="Ultracopier;Transfer-list;Move;Ultracopier\n" && (forcedMode && mode==Ultracopier::Copy))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The transfer list is in move mode, but this instance is not: forcedMode: %1, mode: %2").arg(forcedMode).arg(mode).toStdString());
+ emit errorTransferList(tr("The transfer list is in move mode, but this instance is not in this mode").toStdString());
+ return;
+ }
+
+ bool updateTheStatus_copying=actionToDoListTransfer.size()>0 || actionToDoListInode.size()>0 || actionToDoListInode_afterTheTransfer.size()>0;
+ Ultracopier::EngineActionInProgress updateTheStatus_action_in_progress;
+ if(updateTheStatus_copying)
+ updateTheStatus_action_in_progress=Ultracopier::CopyingAndListing;
+ else
+ updateTheStatus_action_in_progress=Ultracopier::Listing;
+ emit actionInProgess(updateTheStatus_action_in_progress);
+
+ bool errorFound=false;
+ std::regex correctLine;
+ if(transferListMixedMode)
+ correctLine=std::regex("^(Copy|Move);[^;]+;[^;]+[\n\r]*$");
+ else
+ correctLine=std::regex("^[^;]+;[^;]+[\n\r]*$");
+ std::vector<std::string> args;
+ Ultracopier::CopyMode tempMode;
+ do
+ {
+ data=transferFile.readLine(65535*2);
+ if(data.size()>0)
+ {
+ content=std::string(data.constData(),data.size());
+ //do the import here
+ if(std::regex_match(content,correctLine))
+ {
+ stringreplaceAll(content,"\n","");
+ args=stringsplit(content,';');
+ if(forcedMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("New data to import in forced mode: %2,%3")
+ .arg(QString::fromStdString(args.at(0)))
+ .arg(QString::fromStdString(args.at(1)))
+ .toStdString());
+ addToTransfer(QFileInfo(QString::fromStdString(args.at(0))),QFileInfo(QString::fromStdString(args.at(1))),mode);
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("New data to import: %1,%2,%3")
+ .arg(QString::fromStdString(args.at(0)))
+ .arg(QString::fromStdString(args.at(1)))
+ .arg(QString::fromStdString(args.at(2)))
+ .toStdString());
+ if(args.at(0)=="Copy")
+ tempMode=Ultracopier::Copy;
+ else
+ tempMode=Ultracopier::Move;
+ addToTransfer(QFileInfo(QString::fromStdString(args.at(1))),QFileInfo(QString::fromStdString(args.at(2))),tempMode);
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong line syntax: "+content);
+ errorFound=true;
+ }
+ }
+ }
+ while(data.size()>0);
+ transferFile.close();
+ if(errorFound)
+ emit warningTransferList(tr("Some errors have been found during the line parsing").toStdString());
+
+ updateTheStatus();//->sendActionDone(); into this
+ autoStartAndCheckSpace();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable to open the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ emit errorTransferList(tr("Unable to open the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ return;
+ }
+}
+
+int ListThread::getNumberOfTranferRuning() const
+{
+ int numberOfTranferRuning=0;
+ const int &loop_size=transferThreadList.size();
+ //lunch the transfer in WaitForTheTransfer
+ int int_for_loop=0;
+ while(int_for_loop<loop_size)
+ {
+ if(transferThreadList.at(int_for_loop)->getStat()==TransferStat_Transfer && transferThreadList.at(int_for_loop)->transferId!=0 && transferThreadList.at(int_for_loop)->transferSize>=parallelizeIfSmallerThan)
+ numberOfTranferRuning++;
+ int_for_loop++;
+ }
+ return numberOfTranferRuning;
+}
+
+//return
+bool ListThread::needMoreSpace() const
+{
+ if(!checkDiskSpace)
+ return false;
+ std::vector<Diskspace> diskspace_list;
+ for( auto& spaceDrive : requiredSpace ) {
+ const QString &drive=QString::fromStdString(spaceDrive.first);
+ #ifdef Q_OS_WIN32
+ if(spaceDrive.first!="A:\\" && spaceDrive.first!="A:/" && spaceDrive.first!="A:" && spaceDrive.first!="A" && spaceDrive.first!="a:\\" && spaceDrive.first!="a:/" && spaceDrive.first!="a:" && spaceDrive.first!="a")
+ {
+ #endif
+ QStorageInfo storageInfo(drive);
+ storageInfo.refresh();
+ const qint64 &availableSpace=storageInfo.bytesAvailable();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ const qint64 &bytesFree=storageInfo.bytesFree();
+ #endif
+
+ if(availableSpace<0 ||
+ //workaround for all 0 value in case of bug from Qt
+ (availableSpace==0 && storageInfo.bytesTotal()==0)
+ )
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("availableSpace: %1, space needed: %2, on: %3, bytesFree: %4").arg(availableSpace).arg(spaceDrive.second).arg(drive).arg(bytesFree).toStdString());
+ }
+ else if(spaceDrive.second>(quint64)availableSpace)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("availableSpace: %1, space needed: %2, on: %3, bytesFree: %4").arg(availableSpace).arg(spaceDrive.second).arg(drive).arg(bytesFree).toStdString());
+ #ifdef Q_OS_WIN32
+ //if(drive.contains(QRegularExpression("^[a-zA-Z]:[\\\\/]")))
+ if(drive.contains(QRegularExpression("^[a-zA-Z]:")))
+ #endif
+ {
+ Diskspace diskspace;
+ diskspace.drive=spaceDrive.first;
+ diskspace.freeSpace=availableSpace;
+ diskspace.requiredSpace=spaceDrive.second;
+ diskspace_list.push_back(diskspace);
+ }
+ #ifdef Q_OS_WIN32
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"not local drive");
+ #endif
+ }
+ #ifdef Q_OS_WIN32
+ }
+ #endif
+ }
+ if(!diskspace_list.empty())
+ emit missingDiskSpace(diskspace_list);
+ return ! diskspace_list.empty();
+}
+
+//do new actions
+void ListThread::doNewActions_start_transfer()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, numberOfTranferRuning: %2").arg(actionToDoListTransfer.size()).arg(getNumberOfTranferRuning()).toStdString());
+ if(stopIt || putInPause)
+ return;
+ int numberOfTranferRuning=getNumberOfTranferRuning();
+ const int &loop_size=transferThreadList.size();
+ //lunch the transfer in WaitForTheTransfer
+ int int_for_loop=0;
+ while(int_for_loop<loop_size)
+ {
+ if(transferThreadList.at(int_for_loop)->getStat()==TransferStat_WaitForTheTransfer)
+ {
+ if(transferThreadList.at(int_for_loop)->transferSize>=parallelizeIfSmallerThan)
+ {
+ if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)
+ {
+ transferThreadList.at(int_for_loop)->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ }
+ else
+ transferThreadList.at(int_for_loop)->startTheTransfer();
+ }
+ int_for_loop++;
+ }
+ int_for_loop=0;
+ while(int_for_loop<loop_size)
+ {
+ if(transferThreadList.at(int_for_loop)->getStat()==TransferStat_PreOperation)
+ {
+ if(transferThreadList.at(int_for_loop)->transferSize>=parallelizeIfSmallerThan)
+ {
+ if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)
+ {
+ transferThreadList.at(int_for_loop)->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ }
+ else
+ transferThreadList.at(int_for_loop)->startTheTransfer();
+ }
+ int_for_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+}
+
+/** \brief lunch the pre-op or inode op
+ 1) locate the next next item to do into the both list
+ 1a) optimisation posible on the mkpath/rmpath
+ 2) determine what need be lunched
+ 3) lunch it, rerun the 2)
+ */
+void ListThread::doNewActions_inode_manipulation()
+{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionToDoList.size(): "+std::to_string(actionToDoListTransfer.size()));
+ #endif
+ if(stopIt)
+ checkIfReadyToCancel();
+ if(stopIt || putInPause)
+ return;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ #endif
+ //lunch the pre-op or inode op
+ TransferThread *currentTransferThread;
+ int int_for_loop=0;
+ int int_for_internal_loop=0;
+ int int_for_transfer_thread_search=0;
+ actionToDoListTransfer_count=actionToDoListTransfer.size();
+ actionToDoListInode_count=actionToDoListInode.size();
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ //search the next transfer action to do
+ while(int_for_loop<actionToDoListTransfer_count)
+ {
+ if(!actionToDoListTransfer.at(int_for_loop).isRunning)
+ {
+ //search the next inode action to do
+ while(int_for_internal_loop<actionToDoListInode_count)
+ {
+ if(!actionToDoListInode.at(int_for_internal_loop).isRunning)
+ {
+ if(actionToDoListTransfer.at(int_for_loop).id<actionToDoListInode.at(int_for_internal_loop).id)
+ {
+ //do the tranfer action in the next code
+ break;
+ }
+ else
+ {
+ //do the inode action
+ #include "ListThread_InodeAction.cpp"
+ }
+ }
+ int_for_internal_loop++;
+ }
+ ActionToDoTransfer& currentActionToDoTransfer=actionToDoListTransfer[int_for_loop];
+ //do the tranfer action
+ while(int_for_transfer_thread_search<loop_sub_size_transfer_thread_search)
+ {
+ /**
+ transferThreadList.at(int_for_transfer_thread_search)->transferId==0) /!\ important!
+ Because the other thread can have call doNewAction before than this thread have the finish event parsed!
+ I this case it lose all data
+ */
+ currentTransferThread=transferThreadList.at(int_for_transfer_thread_search);
+ if(currentTransferThread->getStat()==TransferStat_Idle && currentTransferThread->transferId==0) // /!\ important!
+ {
+ std::string drive=driveManagement.getDrive(actionToDoListTransfer.at(int_for_internal_loop).destination.absoluteFilePath().toStdString());
+ if(requiredSpace.find(drive)!=requiredSpace.cend() && (actionToDoListTransfer.at(int_for_internal_loop).mode!=Ultracopier::Move || drive!=driveManagement.getDrive(actionToDoListTransfer.at(int_for_internal_loop).source.absoluteFilePath().toStdString())))
+ {
+ requiredSpace[drive]-=actionToDoListTransfer.at(int_for_internal_loop).size;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("space needed removed: %1, space needed: %2, on: %3").arg(actionToDoListTransfer.at(int_for_internal_loop).size).arg(requiredSpace.at(drive)).arg(QString::fromStdString(drive)).toStdString());
+ }
+ currentTransferThread->transferId=currentActionToDoTransfer.id;
+ currentTransferThread->transferSize=currentActionToDoTransfer.size;
+ if(!currentTransferThread->setFiles(
+ currentActionToDoTransfer.source,
+ currentActionToDoTransfer.size,
+ currentActionToDoTransfer.destination,
+ currentActionToDoTransfer.mode
+ ))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] id: %2 is idle, but seam busy at set name: %3").arg(int_for_loop).arg(currentTransferThread->transferId).arg(currentActionToDoTransfer.destination.absoluteFilePath()).toStdString());
+ break;
+ }
+ currentActionToDoTransfer.isRunning=true;
+
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] id: %2 is idle, use it for %3").arg(int_for_loop).arg(currentTransferThread->transferId).arg(currentActionToDoTransfer.destination.absoluteFilePath()).toStdString());
+
+ /// \note wrong position? Else write why it's here
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::PreOperation;
+ newAction.addAction.id = currentActionToDoTransfer.id;
+ newAction.addAction.sourceFullPath = currentActionToDoTransfer.source.absoluteFilePath().toStdString();
+ newAction.addAction.sourceFileName = currentActionToDoTransfer.source.fileName().toStdString();
+ newAction.addAction.destinationFullPath = currentActionToDoTransfer.destination.absoluteFilePath().toStdString();
+ newAction.addAction.destinationFileName = currentActionToDoTransfer.destination.fileName().toStdString();
+ newAction.addAction.size = currentActionToDoTransfer.size;
+ newAction.addAction.mode = currentActionToDoTransfer.mode;
+ actionDone.push_back(newAction);
+ int_for_transfer_thread_search++;
+ numberOfInodeOperation++;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ break;
+ }
+ int_for_transfer_thread_search++;
+ }
+ if(int_for_internal_loop==loop_sub_size_transfer_thread_search)
+ {
+ /// \note Can be normal when all thread is not initialized
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"unable to found free thread to do the transfer");
+ #endif
+ break;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ if(numberOfInodeOperation>=inodeThreads)
+ break;
+ if(followTheStrictOrder)
+ break;
+ }
+ int_for_loop++;
+ }
+ //search the next inode action to do
+ int_for_internal_loop=0;
+ while(int_for_internal_loop<actionToDoListInode_count)
+ {
+ if(!actionToDoListInode.at(int_for_internal_loop).isRunning)
+ {
+ //do the inode action
+ #include "ListThread_InodeAction.cpp"
+ }
+ int_for_internal_loop++;
+ }
+ //error checking
+ if(actionToDoListInode_count>inodeThreads)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The index have been detected as out of max range: %1>%2").arg(actionToDoListInode_count).arg(inodeThreads).toStdString());
+ return;
+ }
+}
+
+//restart transfer if it can
+void ListThread::restartTransferIfItCan()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ TransferThread *transfer=qobject_cast<TransferThread *>(QObject::sender());
+ if(transfer==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
+ return;
+ }
+ int numberOfTranferRuning=getNumberOfTranferRuning();
+ if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER && transfer->getStat()==TransferStat_WaitForTheTransfer)
+ transfer->startTheTransfer();
+ doNewActions_start_transfer();
+}
+
+/// \brief update the transfer stat
+void ListThread::newTransferStat(const TransferStat &stat,const quint64 &id)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"TransferStat: "+std::to_string(stat));
+ Ultracopier::ReturnActionOnCopyList newAction;
+ switch(stat)
+ {
+ case TransferStat_Idle:
+ return;
+ break;
+ case TransferStat_PreOperation:
+ return;
+ break;
+ case TransferStat_WaitForTheTransfer:
+ return;
+ break;
+ case TransferStat_Transfer:
+ newAction.type=Ultracopier::Transfer;
+ break;
+ case TransferStat_PostTransfer:
+ case TransferStat_PostOperation:
+ newAction.type=Ultracopier::PostOperation;
+ break;
+ case TransferStat_Checksum:
+ newAction.type=Ultracopier::CustomOperation;
+ break;
+ default:
+ return;
+ break;
+ }
+ newAction.addAction.id = id;
+ actionDone.push_back(newAction);
+}
+
+void ListThread::set_osBufferLimit(const unsigned int &osBufferLimit)
+{
+ this->osBufferLimit=osBufferLimit;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->set_osBufferLimit(osBufferLimit);
+ index++;
+ }
+}
+
+void ListThread::set_setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("include.size(): %1, exclude.size(): %2").arg(include.size()).arg(exclude.size()).toStdString());
+ this->include=include;
+ this->exclude=exclude;
+ unsigned int index=0;
+ while(index<scanFileOrFolderThreadsPool.size())
+ {
+ scanFileOrFolderThreadsPool.at(index)->setFilters(include,exclude);
+ index++;
+ }
+}
+
+void ListThread::set_sendNewRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule)
+{
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ emit send_sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+void ListThread::set_updateMount()
+{
+ driveManagement.tryUpdate();
+ emit send_updateMount();
+}
+
+void ListThread::mkPathFirstFolderFinish()
+{
+ int int_for_loop=0;
+ const int &loop_size=actionToDoListInode.size();
+ while(int_for_loop<loop_size)
+ {
+ if(actionToDoListInode.at(int_for_loop).isRunning)
+ {
+ if(actionToDoListInode.at(int_for_loop).type==ActionType_MkPath)
+ {
+ //to send to the log
+ emit mkPath(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("stop mkpath: %1").arg(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath()).toStdString());
+ actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_loop);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
+ if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
+ updateTheStatus();
+ numberOfInodeOperation--;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ doNewActions_inode_manipulation();
+ return;
+ }
+ if(actionToDoListInode.at(int_for_loop).type==ActionType_MovePath || actionToDoListInode.at(int_for_loop).type==ActionType_RealMove
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ || actionToDoListInode.at(int_for_loop).type==ActionType_RmSync
+ #endif
+ )
+ {
+ //to send to the log
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(actionToDoListInode.at(int_for_loop).type!=ActionType_RmSync)
+ emit mkPath(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath().toStdString());
+ #else
+ emit mkPath(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath().toStdString());
+ #endif
+ emit rmPath(actionToDoListInode.at(int_for_loop).source.absoluteFilePath().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("stop mkpath: %1").arg(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath()).toStdString());
+ actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_loop);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
+ if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
+ updateTheStatus();
+ numberOfInodeOperation--;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ doNewActions_inode_manipulation();
+ return;
+ }
+
+ }
+ int_for_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to found item into the todo list");
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+
+void ListThread::timedUpdateDebugDialog()
+{
+ std::vector<std::string> newList;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ QString stat;
+ switch(transferThreadList.at(index)->getStat())
+ {
+ case TransferStat_Idle:
+ stat="Idle";
+ break;
+ case TransferStat_PreOperation:
+ stat="PreOperation";
+ break;
+ case TransferStat_WaitForTheTransfer:
+ stat="WaitForTheTransfer";
+ break;
+ case TransferStat_Transfer:
+ stat="Transfer";
+ break;
+ case TransferStat_PostOperation:
+ stat="PostOperation";
+ break;
+ case TransferStat_PostTransfer:
+ stat="PostTransfer";
+ break;
+ case TransferStat_Checksum:
+ stat="Checksum";
+ break;
+ default:
+ stat=QStringLiteral("??? (%1)").arg(transferThreadList.at(index)->getStat());
+ break;
+ }
+ newList.push_back(QStringLiteral("%1) (%3,%4) %2")
+ .arg(index)
+ .arg(stat)
+ .arg(transferThreadList.at(index)->readingLetter())
+ .arg(transferThreadList.at(index)->writingLetter())
+ .toStdString()
+ );
+ index++;
+ }
+ std::vector<std::string> newList2;
+ index=0;
+ const int &loop_size=actionToDoListTransfer.size();
+ while(index<loop_size)
+ {
+ newList2.push_back(QStringLiteral("%1 %2 %3")
+ .arg(actionToDoListTransfer.at(index).source.absoluteFilePath())
+ .arg(actionToDoListTransfer.at(index).size)
+ .arg(actionToDoListTransfer.at(index).destination.absoluteFilePath())
+ .toStdString()
+ );
+ if(index>((inodeThreads+ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)*2+1))
+ {
+ newList2.push_back("...");
+ break;
+ }
+ index++;
+ }
+ emit updateTheDebugInfo(newList,newList2,numberOfInodeOperation);
+}
+
+#endif
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::fileAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame)
+{
+ emit send_fileAlreadyExists(source,destination,isSame,qobject_cast<TransferThread *>(sender()));
+}
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::errorOnFile(const QFileInfo &fileInfo, const std::string &errorString, const ErrorType &errorType)
+{
+ TransferThread * transferThread=qobject_cast<TransferThread *>(sender());
+ if(transferThread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Thread locating error");
+ return;
+ }
+ ErrorLogEntry errorLogEntry;
+ errorLogEntry.source=transferThread->getSourceInode();
+ errorLogEntry.destination=transferThread->getDestinationInode();
+ errorLogEntry.mode=transferThread->getMode();
+ errorLogEntry.error=errorString;
+ errorLog.push_back(errorLogEntry);
+ emit errorToRetry(transferThread->getSourcePath(),transferThread->getDestinationPath(),errorString);
+ emit send_errorOnFile(fileInfo,errorString,transferThread,errorType);
+}
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame)
+{
+ emit send_folderAlreadyExists(source,destination,isSame,qobject_cast<ScanFileOrFolder *>(sender()));
+}
+
+/// \note Can be call without queue because all call will be serialized
+/// \todo all this part
+void ListThread::errorOnFolder(const QFileInfo &fileInfo,const std::string &errorString,const ErrorType &errorType)
+{
+ emit send_errorOnFolder(fileInfo,errorString,qobject_cast<ScanFileOrFolder *>(sender()),errorType);
+}
+
+//to run the thread
+void ListThread::run()
+{
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ clockForTheCopySpeed=new QTimer();
+ #endif
+
+ exec();
+}
+
+void ListThread::getNeedPutAtBottom(const QFileInfo &fileInfo, const std::string &errorString, TransferThread *thread, const ErrorType &errorType)
+{
+ if(actionToDoListTransfer.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"can't try put at bottom if empty");
+ this->alwaysDoThisActionForFileExists=FileExists_NotSet;
+ putAtBottom=0;
+ emit haveNeedPutAtBottom(false,fileInfo,errorString,thread,errorType);
+ return;
+ }
+ bool needPutAtBottom=(putAtBottom<(quint32)actionToDoListTransfer.size());
+ if(!needPutAtBottom)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Reset put at bottom");
+ this->alwaysDoThisActionForFileExists=FileExists_NotSet;
+ putAtBottom=0;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Put at bottom for later try");
+ thread->putAtBottom();
+ putAtBottom++;
+ return;
+ }
+ emit haveNeedPutAtBottom(needPutAtBottom,fileInfo,errorString,thread,errorType);
+}
+
+/// \to create transfer thread
+void ListThread::createTransferThread()
+{
+ if(stopIt)
+ return;
+ if(transferThreadList.size()>=(unsigned int)inodeThreads)
+ return;
+ transferThreadList.push_back(new TransferThread());
+ TransferThread * last=transferThreadList.back();
+ last->transferId=0;
+ last->transferSize=0;
+ last->setRightTransfer(doRightTransfer);
+ last->setKeepDate(keepDate);
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ if(!last->setBlockSize(blockSizeAfterSpeedLimitation))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the block size: "+std::to_string(blockSizeAfterSpeedLimitation));
+ #else
+ if(!last->setBlockSize(blockSize))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the block size: "+std::to_string(blockSize));
+ #endif
+ if(!last->setSequentialBuffer(sequentialBuffer))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the sequentialBuffer: "+std::to_string(sequentialBuffer));
+ if(!last->setBlockSize(parallelBuffer))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the parallelBuffer: "+std::to_string(parallelBuffer));
+ last->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ last->setMultiForBigSpeed(multiForBigSpeed);
+ #endif
+ last->set_doChecksum(doChecksum);
+ last->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+ last->set_checksumOnlyOnError(checksumOnlyOnError);
+ last->set_osBuffer(osBuffer);
+ last->set_osBufferLimited(osBufferLimited);
+ last->set_osBufferLimit(osBufferLimit);
+ last->setDeletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ last->setRsync(rsync);
+ #endif
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(last,&TransferThread::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection);
+ #endif // ULTRACOPIER_PLUGIN_DEBUG
+ connect(last,&TransferThread::errorOnFile, this,&ListThread::errorOnFile, Qt::QueuedConnection);
+ connect(last,&TransferThread::fileAlreadyExists, this,&ListThread::fileAlreadyExists, Qt::QueuedConnection);
+ connect(last,&TransferThread::tryPutAtBottom, this,&ListThread::transferPutAtBottom, Qt::QueuedConnection);
+ connect(last,&TransferThread::readStopped, this,&ListThread::doNewActions_start_transfer, Qt::QueuedConnection);
+ connect(last,&TransferThread::preOperationStopped, this,&ListThread::doNewActions_start_transfer, Qt::QueuedConnection);
+ connect(last,&TransferThread::postOperationStopped, this,&ListThread::transferInodeIsClosed, Qt::QueuedConnection);
+ connect(last,&TransferThread::checkIfItCanBeResumed, this,&ListThread::restartTransferIfItCan, Qt::QueuedConnection);
+ connect(last,&TransferThread::pushStat, this,&ListThread::newTransferStat, Qt::QueuedConnection);
+
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ //speed limitation
+ connect(clockForTheCopySpeed, &QTimer::timeout, last, &TransferThread::timeOfTheBlockCopyFinished, Qt::QueuedConnection);
+ #endif
+
+ connect(this,&ListThread::send_sendNewRenamingRules, last,&TransferThread::setRenamingRules, Qt::QueuedConnection);
+
+ connect(this,&ListThread::send_setTransferAlgorithm, last,&TransferThread::setTransferAlgorithm, Qt::QueuedConnection);
+ connect(this,&ListThread::send_parallelBuffer, last,&TransferThread::setParallelBuffer, Qt::QueuedConnection);
+ connect(this,&ListThread::send_sequentialBuffer, last,&TransferThread::setSequentialBuffer, Qt::QueuedConnection);
+ connect(this,&ListThread::send_updateMount, last,&TransferThread::set_updateMount, Qt::QueuedConnection);
+
+ last->start();
+ last->setObjectName(QStringLiteral("transfer %1").arg(transferThreadList.size()-1));
+ last->setMkpathTransfer(&mkpathTransfer);
+ last->setRenamingRules(firstRenamingRule,otherRenamingRule);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ last->setId(transferThreadList.size()-1);
+ #endif
+ if(transferThreadList.size()>=(unsigned int)inodeThreads)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"create the last of the "+std::to_string(inodeThreads)+" transferThread");
+ return;
+ }
+ if(stopIt)
+ return;
+ doNewActions_inode_manipulation();
+ emit askNewTransferThread();
+}
+
+void ListThread::deleteTransferThread()
+{
+ int loop_size=transferThreadList.size();
+ if(loop_size>inodeThreads)
+ {
+ int index=0;
+ while(index<loop_size && loop_size>inodeThreads)
+ {
+ if(transferThreadList.at(index)->getStat()==TransferStat_Idle && transferThreadList.at(index)->transferId==0)
+ {
+ transferThreadList.at(index)->stop();
+ delete transferThreadList.at(index);//->deleteLayer();
+ transferThreadList[index]=NULL;
+ transferThreadList.erase(transferThreadList.cbegin()+index);
+ loop_size--;
+ }
+ else
+ index++;
+ }
+ if(loop_size==inodeThreads)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inodeThreads is lowered to the right value: "+std::to_string(inodeThreads));
+ }
+}
+
+void ListThread::setTransferAlgorithm(const TransferAlgorithm &transferAlgorithm)
+{
+ if(transferAlgorithm==TransferAlgorithm_Sequential)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Sequential");
+ else if(transferAlgorithm==TransferAlgorithm_Automatic)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Automatic");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Parallel");
+ emit send_setTransferAlgorithm(transferAlgorithm);
+}
+
+void ListThread::setParallelBuffer(int parallelBuffer)
+{
+ if(parallelBuffer<1 || parallelBuffer>ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"wrong number of block: "+std::to_string(parallelBuffer));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"in number of block: "+std::to_string(parallelBuffer));
+ this->parallelBuffer=parallelBuffer;
+ emit send_parallelBuffer(parallelBuffer);
+}
+
+void ListThread::setSequentialBuffer(int sequentialBuffer)
+{
+ if(sequentialBuffer<1 || sequentialBuffer>ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"wrong number of block: "+std::to_string(sequentialBuffer));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"in number of block: "+std::to_string(sequentialBuffer));
+ this->sequentialBuffer=sequentialBuffer;
+ emit send_sequentialBuffer(sequentialBuffer);
+}
+
+void ListThread::setParallelizeIfSmallerThan(const unsigned int &parallelizeIfSmallerThan)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"parallelizeIfSmallerThan in Bytes: "+std::to_string(parallelizeIfSmallerThan));
+ this->parallelizeIfSmallerThan=parallelizeIfSmallerThan;
+}
+
+void ListThread::setMoveTheWholeFolder(const bool &moveTheWholeFolder)
+{
+ for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setMoveTheWholeFolder(moveTheWholeFolder);
+ this->moveTheWholeFolder=moveTheWholeFolder;
+}
+
+void ListThread::setFollowTheStrictOrder(const bool &followTheStrictOrder)
+{
+ this->followTheStrictOrder=followTheStrictOrder;
+}
+
+void ListThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
+{
+ this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setDeletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
+ index++;
+ }
+}
+
+void ListThread::setInodeThreads(const int &inodeThreads)
+{
+ if(inodeThreads<1 || inodeThreads>32)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"inodeThreads is out of ranges: "+std::to_string(inodeThreads));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inodeThreads: "+std::to_string(inodeThreads));
+ this->inodeThreads=inodeThreads;
+ createTransferThread();
+ deleteTransferThread();
+}
+
+void ListThread::setRenameTheOriginalDestination(const bool &renameTheOriginalDestination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"renameTheOriginalDestination: "+std::to_string(renameTheOriginalDestination));
+ this->renameTheOriginalDestination=renameTheOriginalDestination;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setRenameTheOriginalDestination(renameTheOriginalDestination);
+ index++;
+ }
+}
+
+void ListThread::setCheckDiskSpace(const bool &checkDiskSpace)
+{
+ this->checkDiskSpace=checkDiskSpace;
+}
+
+void ListThread::setCopyListOrder(const bool &order)
+{
+ this->copyListOrder=order;
+ for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setCopyListOrder(this->copyListOrder);
+}
+
+void ListThread::exportErrorIntoTransferList(const std::string &fileName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QFile transferFile(QString::fromStdString(fileName));
+ if(transferFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
+ {
+ transferFile.write(QStringLiteral("Ultracopier;Transfer-list;").toUtf8());
+ if(!forcedMode)
+ transferFile.write(QStringLiteral("Transfer;").toUtf8());
+ else
+ {
+ if(mode==Ultracopier::Copy)
+ transferFile.write(QStringLiteral("Copy;").toUtf8());
+ else
+ transferFile.write(QStringLiteral("Move;").toUtf8());
+ }
+ transferFile.write(QStringLiteral("Ultracopier\n").toUtf8());
+ bool haveError=false;
+ int size=errorLog.size();
+ for (int index=0;index<size;++index) {
+ if(errorLog.at(index).mode==Ultracopier::Copy)
+ {
+ if(!forcedMode || mode==Ultracopier::Copy)
+ {
+ if(forcedMode)
+ transferFile.write(QStringLiteral("%1;%2\n").arg(errorLog.at(index).source.absoluteFilePath()).arg(errorLog.at(index).destination.absoluteFilePath()).toUtf8());
+ else
+ transferFile.write(QStringLiteral("Copy;%1;%2\n").arg(errorLog.at(index).source.absoluteFilePath()).arg(errorLog.at(index).destination.absoluteFilePath()).toUtf8());
+ }
+ else
+ haveError=true;
+ }
+ else if(errorLog.at(index).mode==Ultracopier::Move)
+ {
+ if(!forcedMode || mode==Ultracopier::Move)
+ {
+ if(forcedMode)
+ transferFile.write(QStringLiteral("%1;%2\n").arg(errorLog.at(index).source.absoluteFilePath()).arg(errorLog.at(index).destination.absoluteFilePath()).toUtf8());
+ else
+ transferFile.write(QStringLiteral("Move;%1;%2\n").arg(errorLog.at(index).source.absoluteFilePath()).arg(errorLog.at(index).destination.absoluteFilePath()).toUtf8());
+ }
+ else
+ haveError=true;
+ }
+ }
+ if(haveError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable do to move or copy item into wrong forced mode: "+transferFile.errorString().toStdString());
+ emit errorTransferList(tr("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
+ }
+ transferFile.close();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to save the transfer list: "+transferFile.errorString().toStdString());
+ emit errorTransferList(tr("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ return;
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier/ListThread.h b/plugins/CopyEngine/Ultracopier/ListThread.h
new file mode 100644
index 0000000..48e7142
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/ListThread.h
@@ -0,0 +1,432 @@
+/** \file ListThread.h
+\brief Define the list thread, and management to the action to do
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef LISTTHREAD_H
+#define LISTTHREAD_H
+
+#include <QThread>
+#include <QObject>
+#include <string>
+#include <vector>
+#include <unordered_map>
+#include <QFileInfo>
+#include <QSemaphore>
+#include <QTextStream>
+#include <QFile>
+#include <QTimer>
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "ScanFileOrFolder.h"
+#include "TransferThread.h"
+#include "MkPath.h"
+#include "Environment.h"
+#include "DriveManagement.h"
+
+/// \brief Define the list thread, and management to the action to do
+class ListThread : public QThread
+{
+ Q_OBJECT
+public:
+ explicit ListThread(FacilityInterface * facilityInterface);
+ ~ListThread();
+
+ //duplication copy detection
+ /** \brief compare the current sources of the copy, with the passed arguments
+ * \param sources the sources list to compares with the current sources list
+ * \return true if have same sources, else false (or empty) */
+ bool haveSameSource(const std::vector<std::string> &sources);
+ /** \brief compare the current destination of the copy, with the passed arguments
+ * \param destination the destination to compares with the current destination
+ * \return true if have same destination, else false (or empty) */
+ bool haveSameDestination(const std::string &destination);
+ /// \return empty if multiple or no destination
+ std::string getUniqueDestinationFolder() const;
+ //external soft like file browser have send copy/move list to do
+ /** \brief send copy with destination
+ * \param sources the sources list to copy
+ * \param destination the destination to copy
+ * \return true if the copy have been accepted */
+ bool newCopy(const std::vector<std::string> &sources,const std::string &destination);
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \param destination the destination to move
+ * \return true if the move have been accepted */
+ bool newMove(const std::vector<std::string> &sources,const std::string &destination);
+ /** \brief to set drives detected
+ * specific to this copy engine */
+ /// \brief to set the collision action
+ void setCollisionAction(const FileExistsAction &alwaysDoThisActionForFileExists);
+ /** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+ void syncTransferList();
+ /// \brief to store one action to do
+ struct ActionToDoTransfer
+ {
+ uint64_t id;
+ uint64_t size;///< Used to set: used in case of transfer or remainingInode for drop folder
+ QFileInfo source;///< Used to set: source for transfer, folder to create, folder to drop
+ QFileInfo destination;
+ Ultracopier::CopyMode mode;
+ bool isRunning;///< store if the action si running
+ //TransferThread * transfer; // -> see transferThreadList
+ };
+ std::vector<ActionToDoTransfer> actionToDoListTransfer;
+ /// \brief to store one action to do
+ struct ActionToDoInode
+ {
+ ActionType type;///< \see ActionType
+ uint64_t id;
+ int64_t size;///< Used to set: used in case of transfer or remainingInode for drop folder
+ QFileInfo source;///< Keep to copy the right/date, to remove (for move)
+ QFileInfo destination;///< Used to set: folder to create, folder to drop
+ bool isRunning;///< store if the action si running
+ };
+ std::vector<ActionToDoInode> actionToDoListInode;
+ std::vector<ActionToDoInode> actionToDoListInode_afterTheTransfer;
+ int numberOfInodeOperation;
+ struct ErrorLogEntry
+ {
+ QFileInfo source;
+ QFileInfo destination;
+ std::string error;
+ Ultracopier::CopyMode mode;
+ };
+ std::vector<ErrorLogEntry> errorLog;
+ //dir operation thread queue
+ MkPath mkPathQueue;
+ //to get the return value from copyEngine
+ bool getReturnBoolToCopyEngine() const;
+ std::pair<quint64,quint64> getReturnPairQuint64ToCopyEngine() const;
+ Ultracopier::ItemOfCopyList getReturnItemOfCopyListToCopyEngine() const;
+
+ void set_doChecksum(bool doChecksum);
+ void set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible);
+ void set_checksumOnlyOnError(bool checksumOnlyOnError);
+ void set_osBuffer(bool osBuffer);
+ void set_osBufferLimited(bool osBufferLimited);
+ void autoStartIfNeeded();
+public slots:
+ //action on the copy
+ /// \brief put the transfer in pause
+ void pause();
+ /// \brief resume the transfer
+ void resume();
+ /** \brief skip one transfer entry
+ * \param id id of the file to remove */
+ void skip(const uint64_t &id);
+ /** \brief skip as interanl one transfer entry
+ * \param id id of the file to remove */
+ bool skipInternal(const uint64_t &id);
+ /// \brief cancel all the transfer
+ void cancel();
+ //edit the transfer list
+ /** \brief remove the selected item
+ * \param ids ids is the id list of the selected items */
+ void removeItems(const std::vector<uint64_t> &ids);
+ /** \brief move on top of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnTop(std::vector<uint64_t> ids);
+ /** \brief move up the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsUp(std::vector<uint64_t> ids);
+ /** \brief move down the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsDown(std::vector<uint64_t> ids);
+ /** \brief move on bottom of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnBottom(std::vector<uint64_t> ids);
+
+ /** \brief give the forced mode, to export/import transfer list */
+ void forceMode(const Ultracopier::CopyMode &mode);
+ /// \brief export the transfer list into a file
+ void exportTransferList(const std::string &fileName);
+ /// \brief import the transfer list into a file
+ void importTransferList(const std::string &fileName);
+
+ /// \brief set the folder local collision
+ void setFolderCollision(const FolderExistsAction &alwaysDoThisActionForFolderExists);
+ /** \brief to set the speed limitation
+ * -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const int64_t &speedLimitation);
+ /// \brief set the copy info and options before runing
+ void setRightTransfer(const bool doRightTransfer);
+ /// \brief set keep date
+ void setKeepDate(const bool keepDate);
+ /// \brief set block size in KB
+ void setBlockSize(const int blockSize);
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ /// \brief set rsync
+ void setRsync(const bool rsync);
+ #endif
+ /// \brief set check destination folder
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief set data local to the thread
+ void setAlwaysFileExistsAction(const FileExistsAction &alwaysDoThisActionForFileExists);
+ /// \brief do new actions, start transfer
+ void doNewActions_start_transfer();
+ /** \brief lunch the pre-op or inode op
+ 1) locate the next next item to do into the both list
+ 1a) optimisation posible on the mkpath/rmpath
+ 2) determine what need be lunched
+ 3) lunch it, rerun the 2)
+ */
+ void doNewActions_inode_manipulation();
+ /// \brief restart transfer if it can
+ void restartTransferIfItCan();
+ void getNeedPutAtBottom(const QFileInfo &fileInfo, const std::string &errorString, TransferThread *thread,const ErrorType &errorType);
+
+ /// \brief update the transfer stat
+ void newTransferStat(const TransferStat &stat,const quint64 &id);
+
+ void set_osBufferLimit(const unsigned int &osBufferLimit);
+ void set_setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude);
+ void set_sendNewRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule);
+ void set_updateMount();
+
+ //send action done
+ void sendActionDone();
+ //send progression
+ void sendProgression();
+
+ void setTransferAlgorithm(const TransferAlgorithm &transferAlgorithm);
+ void setParallelBuffer(int parallelBuffer);
+ void setSequentialBuffer(int sequentialBuffer);
+ void setParallelizeIfSmallerThan(const unsigned int &parallelizeIfSmallerThan);
+ void setMoveTheWholeFolder(const bool &moveTheWholeFolder);
+ void setFollowTheStrictOrder(const bool &followTheStrictOrder);
+ void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
+ void setInodeThreads(const int &inodeThreads);
+ void setRenameTheOriginalDestination(const bool &renameTheOriginalDestination);
+ void setCheckDiskSpace(const bool &checkDiskSpace);
+ void setCopyListOrder(const bool &order);
+ void exportErrorIntoTransferList(const std::string &fileName);
+private:
+ QSemaphore mkpathTransfer;
+ std::string sourceDrive;
+ bool sourceDriveMultiple;
+ std::string destinationDrive;
+ std::string destinationFolder;
+ bool destinationDriveMultiple;
+ bool destinationFolderMultiple;
+ DriveManagement driveManagement;
+
+ bool stopIt;
+ std::vector<ScanFileOrFolder *> scanFileOrFolderThreadsPool;
+ int numberOfTransferIntoToDoList;
+ std::vector<TransferThread *> transferThreadList;
+ ScanFileOrFolder * newScanThread(Ultracopier::CopyMode mode);
+ uint64_t bytesToTransfer;
+ uint64_t bytesTransfered;
+ bool autoStart;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ bool rsync;
+ #endif
+ bool putInPause;
+ std::vector<Ultracopier::ReturnActionOnCopyList> actionDone;///< to action to send to the interface
+ uint64_t idIncrementNumber;///< to store the last id returned
+ int64_t actualRealByteTransfered;
+ int maxSpeed;///< in KB/s, assume as 0KB/s as default like every where
+ FolderExistsAction alwaysDoThisActionForFolderExists;
+ bool checkDestinationFolderExists;
+ bool doChecksum;
+ bool checksumIgnoreIfImpossible;
+ bool checksumOnlyOnError;
+ bool osBuffer;
+ bool osBufferLimited;
+ unsigned int parallelizeIfSmallerThan;
+ bool moveTheWholeFolder;
+ bool followTheStrictOrder;
+ bool deletePartiallyTransferredFiles;
+ int sequentialBuffer;
+ int parallelBuffer;
+ int inodeThreads;
+ bool renameTheOriginalDestination;
+ bool checkDiskSpace;
+ bool copyListOrder;
+ std::unordered_map<std::string,uint64_t> requiredSpace;
+ std::vector<std::pair<uint64_t,uint32_t> > timeToTransfer;
+ unsigned int putAtBottom;
+ unsigned int osBufferLimit;
+ std::vector<Filters_rules> include,exclude;
+ Ultracopier::CopyMode mode;
+ bool forcedMode;
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ int multiForBigSpeed;
+ #endif
+ /* here to prevent:
+ QObject::killTimer: timers cannot be stopped from another thread
+ QObject::startTimer: timers cannot be started from another thread */
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ QTimer *clockForTheCopySpeed; ///< For the speed throttling
+ #endif
+
+ inline static Ultracopier::ItemOfCopyList actionToDoTransferToItemOfCopyList(const ActionToDoTransfer &actionToDoTransfer);
+ //add file transfer to do
+ uint64_t addToTransfer(const QFileInfo& source,const QFileInfo& destination,const Ultracopier::CopyMode& mode);
+ //generate id number
+ uint64_t generateIdNumber();
+ //warning the first entry is accessible will copy
+ bool removeSingleItem(const uint64_t &id);
+ //put on top
+ bool moveOnTopItem(const uint64_t &id);
+ //move up
+ bool moveUpItem(const uint64_t &id);
+ //move down
+ bool moveDownItem(const uint64_t &id);
+ //put on bottom
+ bool moveOnBottomItem(const uint64_t &id);
+ //general transfer
+ void startGeneralTransfer();
+ //debug windows if needed
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ QTimer timerUpdateDebugDialog;
+ #endif
+ void detectDrivesOfCurrentTransfer(const std::vector<std::string> &sources,const std::string &destination);
+ FacilityInterface * facilityInterface;
+ QSemaphore waitConstructor,waitCancel;
+ int actionToDoListTransfer_count,actionToDoListInode_count;
+ bool doTransfer,doInode;
+ int64_t oversize;//used as temp variable
+ int64_t currentProgression;
+ int64_t copiedSize,totalSize,localOverSize;
+ std::vector<Ultracopier::ProgressionItem> progressionList;
+ //memory variable for transfer thread creation
+ bool doRightTransfer;
+ bool keepDate;
+ int blockSize;//in Bytes
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ int blockSizeAfterSpeedLimitation;//in Bytes
+ #endif
+ std::vector<std::string> drives;
+ FileExistsAction alwaysDoThisActionForFileExists;
+ //to return value to the copyEngine
+ bool returnBoolToCopyEngine;
+ std::pair<quint64,quint64> returnPairQuint64ToCopyEngine;
+ std::vector<Ultracopier::ItemOfCopyList> returnListItemOfCopyListToCopyEngine;
+ Ultracopier::ItemOfCopyList returnItemOfCopyListToCopyEngine;
+ Ultracopier::ProgressionItem tempItem;
+
+ void realByteTransfered();
+ int getNumberOfTranferRuning() const;
+ bool needMoreSpace() const;
+private slots:
+ void scanThreadHaveFinishSlot();
+ void scanThreadHaveFinish(bool skipFirstRemove=false);
+ void autoStartAndCheckSpace();
+ void updateTheStatus();
+ void fileTransfer(const QFileInfo &sourceFileInfo,const QFileInfo &destinationFileInfo,const Ultracopier::CopyMode &mode);
+ //mkpath event
+ void mkPathFirstFolderFinish();
+ /** \brief put the current file at bottom in case of error
+ \note ONLY IN CASE OF ERROR */
+ void transferPutAtBottom();
+ //transfer is finished
+ void transferInodeIsClosed();
+ //debug windows if needed
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ void timedUpdateDebugDialog();
+ #endif
+ //dialog message
+ /// \note Can be call without queue because all call will be serialized
+ void fileAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFile(const QFileInfo &fileInfo,const std::string &errorString, const ErrorType &errorType);
+ /// \note Can be call without queue because all call will be serialized
+ void folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFolder(const QFileInfo &fileInfo, const std::string &errorString, const ErrorType &errorType);
+ //to run the thread
+ void run();
+ /// \to create transfer thread
+ void createTransferThread();
+ void deleteTransferThread();
+ //mk path to do
+ uint64_t addToMkPath(const QFileInfo& source, const QFileInfo& destination, const int &inode);
+ //add rm path to do
+ void addToMovePath(const QFileInfo& source,const QFileInfo& destination, const int& inodeToRemove);
+ //add to real move
+ void addToRealMove(const QFileInfo& source,const QFileInfo& destination);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ //rsync rm
+ void addToRmForRsync(const QFileInfo& destination);
+ #endif
+ //send the progression, after full reset of the interface (then all is empty)
+ void syncTransferList_internal();
+
+ void checkIfReadyToCancel();
+signals:
+ //send information about the copy
+ void actionInProgess(const Ultracopier::EngineActionInProgress &) const; //should update interface information on this event
+
+ void newActionOnList(const std::vector<Ultracopier::ReturnActionOnCopyList> &) const;///very important, need be temporized to group the modification to do and not flood the interface
+ void syncReady() const;
+ void doneTime(const std::vector<std::pair<uint64_t,uint32_t> >&) const;
+
+ /** \brief to get the progression for a specific file
+ * \param id the id of the transfer, id send during population the transfer list
+ * first = current transfered byte, second = byte to transfer */
+ void pushFileProgression(const std::vector<Ultracopier::ProgressionItem> &progressionList) const;
+ //get information about the copy
+ /** \brief to get the general progression
+ * first = current transfered byte, second = byte to transfer */
+ void pushGeneralProgression(const uint64_t &,const uint64_t &) const;
+
+ void newFolderListing(const std::string &path) const;
+ void isInPause(const bool &) const;
+
+ //when can be deleted
+ void canBeDeleted() const;
+ void haveNeedPutAtBottom(bool needPutAtBottom,const QFileInfo &fileInfo,const std::string &errorString,TransferThread * thread,const ErrorType &errorType) const;
+
+ //send error occurred
+ void error(const std::string &path,const uint64_t &size,const uint64_t &mtime,const std::string &error) const;
+ void errorToRetry(const std::string &source,const std::string &destination,const std::string &error) const;
+ //for the extra logging
+ void rmPath(const std::string &path) const;
+ void mkPath(const std::string &path) const;
+ /// \brief To debug source
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+ #endif
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ void updateTheDebugInfo(const std::vector<std::string> &,const std::vector<std::string>&,const int &) const;
+ #endif
+
+ //other signal
+ /// \note Can be call without queue because all call will be serialized
+ void send_fileAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame,TransferThread * thread) const;
+ /// \note Can be call without queue because all call will be serialized
+ void send_errorOnFile(const QFileInfo &fileInfo,const std::string &errorString,TransferThread * thread, const ErrorType &errorType) const;
+ /// \note Can be call without queue because all call will be serialized
+ void send_folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame,ScanFileOrFolder * thread) const;
+ /// \note Can be call without queue because all call will be serialized
+ void send_errorOnFolder(const QFileInfo &fileInfo,const std::string &errorString,ScanFileOrFolder * thread, const ErrorType &errorType) const;
+ //send the progression
+ void send_syncTransferList() const;
+ //mkpath error event
+ void mkPathErrorOnFolder(const QFileInfo &fileInfo,const std::string &errorString,const ErrorType &errorType) const;
+ //to close
+ void tryCancel() const;
+ //to ask new transfer thread
+ void askNewTransferThread() const;
+
+ void warningTransferList(const std::string &warning) const;
+ void errorTransferList(const std::string &error) const;
+ void send_sendNewRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule) const;
+ void send_realBytesTransfered(const uint64_t &) const;
+
+ void send_setTransferAlgorithm(TransferAlgorithm transferAlgorithm) const;
+ void send_parallelBuffer(const int &parallelBuffer) const;
+ void send_sequentialBuffer(const int &sequentialBuffer) const;
+ void send_parallelizeIfSmallerThan(const int &parallelizeIfSmallerThan) const;
+ void send_updateMount();
+ void missingDiskSpace(std::vector<Diskspace> list) const;
+};
+
+#endif // LISTTHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp b/plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp
new file mode 100644
index 0000000..12421f2
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp
@@ -0,0 +1,64 @@
+/** \file ListThread_InodeAction.cpp
+\brief To be included into ListThread.cpp, to optimize and prevent code duplication
+\see ListThread.cpp */
+
+#ifdef LISTTHREAD_H
+
+//do the inode action
+ActionToDoInode& currentActionToDoInode=actionToDoListInode[int_for_internal_loop];
+switch(currentActionToDoInode.type)
+{
+ case ActionType_RealMove:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("launch real move, source: %1, destination: %2").arg(currentActionToDoInode.source.absoluteFilePath()).arg(currentActionToDoInode.destination.absoluteFilePath()).toStdString());
+ mkPathQueue.addPath(currentActionToDoInode.source.absoluteFilePath(),currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ break;
+ case ActionType_MkPath:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("launch mkpath, source: %1, destination: %2").arg(currentActionToDoInode.source.absoluteFilePath()).arg(currentActionToDoInode.destination.absoluteFilePath()).toStdString());
+ mkPathQueue.addPath(currentActionToDoInode.source.absoluteFilePath(),currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ break;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ case ActionType_RmSync:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QString("launch rmsync, destination: %1").arg(currentActionToDoInode.destination.absoluteFilePath()).toStdString());
+ mkPathQueue.addPath(currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ break;
+ #endif
+ case ActionType_MovePath:
+ //then empty (no file), can try remove it
+ if(currentActionToDoInode.size==0 || actionToDoListTransfer.empty())//don't put afterTheTransfer because actionToDoListInode_afterTheTransfer -> already afterTheTransfer
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("launch rmpath: %1").arg(currentActionToDoInode.source.absoluteFilePath()).toStdString());
+ mkPathQueue.addPath(currentActionToDoInode.source.absoluteFilePath(),currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ }
+ else //have do the destination, put the remove to after
+ {
+ currentActionToDoInode.size=0;
+ actionToDoListInode_afterTheTransfer.push_back(currentActionToDoInode);
+ actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_internal_loop);
+ int_for_internal_loop--;
+ actionToDoListInode_count--;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ }
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong type at inode action");
+ return;
+}
+
+#endif
diff --git a/plugins/CopyEngine/Ultracopier/MkPath.cpp b/plugins/CopyEngine/Ultracopier/MkPath.cpp
new file mode 100644
index 0000000..52d67af
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/MkPath.cpp
@@ -0,0 +1,517 @@
+#include "MkPath.h"
+
+#ifdef Q_OS_WIN32
+ #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+ #endif
+#endif
+
+std::string MkPath::text_slash="/";
+
+MkPath::MkPath()
+{
+ stopIt=false;
+ waitAction=false;
+ doRightTransfer=false;
+ maxTime=QDateTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+ setObjectName("MkPath");
+ moveToThread(this);
+ start();
+ #ifdef Q_OS_WIN32
+ #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ regRead=std::regex("^[a-z]:");
+ #endif
+ #endif
+}
+
+MkPath::~MkPath()
+{
+ stopIt=true;
+ quit();
+ wait();
+}
+
+void MkPath::addPath(const QFileInfo& source, const QFileInfo& destination, const ActionType &actionType)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
+ if(stopIt)
+ return;
+ emit internalStartAddPath(source,destination,actionType);
+}
+
+void MkPath::skip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit internalStartSkip();
+}
+
+void MkPath::retry()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit internalStartRetry();
+}
+
+void MkPath::run()
+{
+ connect(this,&MkPath::internalStartAddPath, this,&MkPath::internalAddPath,Qt::QueuedConnection);
+ connect(this,&MkPath::internalStartDoThisPath, this,&MkPath::internalDoThisPath,Qt::QueuedConnection);
+ connect(this,&MkPath::internalStartSkip, this,&MkPath::internalSkip,Qt::QueuedConnection);
+ connect(this,&MkPath::internalStartRetry, this,&MkPath::internalRetry,Qt::QueuedConnection);
+ exec();
+}
+
+void MkPath::internalDoThisPath()
+{
+ if(waitAction || pathList.isEmpty())
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2, move: %3").arg(pathList.first().source.absoluteFilePath()).arg(pathList.first().destination.absoluteFilePath()).arg(pathList.first().actionType).toStdString());
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(pathList.first().actionType==ActionType_RmSync)
+ {
+ if(pathList.first().destination.isFile())
+ {
+ QFile removedFile(pathList.first().destination.absoluteFilePath());
+ if(!removedFile.remove())
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the inode: "+pathList.first().destination.absoluteFilePath().toStdString()+", error: "+removedFile.errorString().toStdString());
+ emit errorOnFolder(pathList.first().destination,removedFile.errorString().toStdString());
+ return;
+ }
+ }
+ else if(!rmpath(pathList.first().destination.absoluteFilePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the inode: "+pathList.first().destination.absoluteFilePath().toStdString());
+ emit errorOnFolder(pathList.first().destination,tr("Unable to remove").toStdString());
+ return;
+ }
+ pathList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+ return;
+ }
+ #endif
+ doTheDateTransfer=false;
+ if(keepDate)
+ {
+ if(!pathList.first().source.exists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the sources not exists: "+pathList.first().source.absoluteFilePath().toStdString());
+ doTheDateTransfer=false;
+ }
+ else if(maxTime>=pathList.first().source.lastModified())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the sources is older to copy the time: "+pathList.first().source.absoluteFilePath().toStdString()+": "+maxTime.toString("dd.MM.yyyy hh:mm:ss.zzz").toStdString()+">="+pathList.first().source.lastModified().toString("dd.MM.yyyy hh:mm:ss.zzz").toStdString());
+ doTheDateTransfer=false;
+ }
+ else
+ {
+ doTheDateTransfer=readFileDateTime(pathList.first().source);
+ /*if(!doTheDateTransfer)
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to get source folder time: "+pathList.first().source.absoluteFilePath());
+ emit errorOnFolder(pathList.first().source,tr("Unable to get time"));
+ return;
+ }*/
+ }
+ }
+ if(dir.exists(pathList.first().destination.absoluteFilePath()) && pathList.first().actionType==ActionType_RealMove)
+ pathList.first().actionType=ActionType_MovePath;
+ if(pathList.first().actionType!=ActionType_RealMove)
+ {
+ if(!dir.exists(pathList.first().destination.absoluteFilePath()))
+ if(!dir.mkpath(pathList.first().destination.absoluteFilePath()))
+ {
+ if(!dir.exists(pathList.first().destination.absoluteFilePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+pathList.first().destination.absoluteFilePath().toStdString());
+ emit errorOnFolder(pathList.first().destination,tr("Unable to create the folder").toStdString());
+ return;
+ }
+ }
+ }
+ else
+ {
+ if(!pathList.first().source.exists())
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The source folder don't exists: "+pathList.first().source.absoluteFilePath().toStdString());
+ emit errorOnFolder(pathList.first().destination,tr("The source folder don't exists").toStdString());
+ return;
+ }
+ if(!pathList.first().source.isDir())//it's really an error?
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The source is not a folder: "+pathList.first().source.absoluteFilePath().toStdString());
+ /*if(stopIt)
+ return;
+ waitAction=true;
+ emit errorOnFolder(pathList.first().destination,tr("The source is not a folder"));
+ return;*/
+ }
+ if(pathList.first().destination.absoluteFilePath().startsWith(pathList.first().source.absoluteFilePath()+QString::fromStdString(text_slash)))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"move into it self: "+pathList.first().destination.absoluteFilePath().toStdString());
+ int random=rand();
+ QFileInfo tempFolder=pathList.first().source.absolutePath()+QString::fromStdString(text_slash)+QString::number(random);
+ while(tempFolder.exists())
+ {
+ random=rand();
+ tempFolder=pathList.first().source.absolutePath()+QString::fromStdString(text_slash)+QString::number(random);
+ }
+ if(!dir.rename(pathList.first().source.absoluteFilePath(),tempFolder.absoluteFilePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to temporary rename the folder: "+pathList.first().destination.absoluteFilePath().toStdString());
+ emit errorOnFolder(pathList.first().destination,tr("Unable to temporary rename the folder").toStdString());
+ return;
+ }
+ /* http://doc.qt.io/qt-5/qdir.html#rename
+ * On most file systems, rename() fails only if oldName does not exist, or if a file with the new name already exists.
+ if(!dir.mkpath(pathList.first().destination.absolutePath()))
+ {
+ if(!dir.exists(pathList.first().destination.absolutePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+pathList.first().destination.absoluteFilePath());
+ emit errorOnFolder(pathList.first().destination,tr("Unable to create the folder"));
+ return;
+ }
+ }*/
+ if(!dir.rename(tempFolder.absoluteFilePath(),pathList.first().destination.absoluteFilePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to do the final real move the folder: "+pathList.first().destination.absoluteFilePath().toStdString());
+ emit errorOnFolder(pathList.first().destination,tr("Unable to do the final real move the folder").toStdString());
+ return;
+ }
+ }
+ else
+ {
+ /* http://doc.qt.io/qt-5/qdir.html#rename
+ * On most file systems, rename() fails only if oldName does not exist, or if a file with the new name already exists.
+ if(!dir.mkpath(pathList.first().destination.absolutePath()))
+ {
+ if(!dir.exists(pathList.first().destination.absolutePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+pathList.first().destination.absoluteFilePath());
+ emit errorOnFolder(pathList.first().destination,tr("Unable to create the folder"));
+ return;
+ }
+ }*/
+ if(!dir.rename(pathList.first().source.absoluteFilePath(),pathList.first().destination.absoluteFilePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: from: "+pathList.first().source.absoluteFilePath().toStdString()+", soruce exists: "+std::to_string(QDir(pathList.first().source.absoluteFilePath()).exists())+", to: "+pathList.first().destination.absoluteFilePath().toStdString()
+ +", destination exist: "+std::to_string(QDir(pathList.first().destination.absoluteFilePath()).exists()));
+ emit errorOnFolder(pathList.first().destination,tr("Unable to move the folder").toStdString());
+ return;
+ }
+ }
+ }
+ if(doTheDateTransfer)
+ if(!writeFileDateTime(pathList.first().destination))
+ {
+ if(!pathList.first().destination.exists())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time (not exists): "+pathList.first().destination.absoluteFilePath().toStdString());
+ else if(!pathList.first().destination.isDir())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time (not a dir): "+pathList.first().destination.absoluteFilePath().toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time: "+pathList.first().destination.absoluteFilePath().toStdString());
+ /*if(stopIt)
+ return;
+ waitAction=true;
+
+ emit errorOnFolder(pathList.first().source,tr("Unable to set time"));
+ return;*/
+ }
+ if(doRightTransfer && pathList.first().actionType!=ActionType_RealMove)
+ {
+ QFile source(pathList.first().source.absoluteFilePath());
+ QFile destination(pathList.first().destination.absoluteFilePath());
+ if(!destination.setPermissions(source.permissions()))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set the right: "+pathList.first().destination.absoluteFilePath().toStdString());
+ /*if(stopIt)
+ return;
+ waitAction=true;
+ emit errorOnFolder(pathList.first().source,tr("Unable to set the access-right"));
+ return;*/
+ }
+ }
+ if(pathList.first().actionType==ActionType_MovePath)
+ {
+ if(!rmpath(pathList.first().source.absoluteFilePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the source folder: "+pathList.first().destination.absoluteFilePath().toStdString());
+ emit errorOnFolder(pathList.first().source,tr("Unable to remove").toStdString());
+ return;
+ }
+ }
+ pathList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+}
+
+void MkPath::internalAddPath(const QFileInfo& source, const QFileInfo& destination, const ActionType &actionType)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
+ Item tempPath;
+ tempPath.source=source;
+ tempPath.destination=destination;
+ tempPath.actionType=actionType;
+ pathList << tempPath;
+ if(!waitAction)
+ checkIfCanDoTheNext();
+}
+
+void MkPath::checkIfCanDoTheNext()
+{
+ if(!waitAction && !stopIt && pathList.size()>0)
+ emit internalStartDoThisPath();
+}
+
+void MkPath::internalSkip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ waitAction=false;
+ pathList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+}
+
+void MkPath::internalRetry()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ waitAction=false;
+ checkIfCanDoTheNext();
+}
+
+void MkPath::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+}
+
+void MkPath::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+}
+
+bool MkPath::rmpath(const QDir &dir
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ ,const bool &toSync
+ #endif
+ )
+{
+ if(!dir.exists())
+ return true;
+ bool allHaveWork=true;
+ QFileInfoList list = dir.entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst);
+ for (int i = 0; i < list.size(); ++i)
+ {
+ QFileInfo fileInfo(list.at(i));
+ if(!fileInfo.isDir())
+ {
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(toSync)
+ {
+ QFile file(fileInfo.absoluteFilePath());
+ if(!file.remove())
+ {
+ if(toSync)
+ {
+ QFile file(fileInfo.absoluteFilePath());
+ if(!file.remove())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove a file: "+fileInfo.absoluteFilePath().toStdString()+", due to: "+file.errorString().toStdString());
+ allHaveWork=false;
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName().toStdString());
+ allHaveWork=false;
+ }
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName().toStdString());
+ allHaveWork=false;
+ }
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName().toStdString());
+ allHaveWork=false;
+ #endif
+ }
+ else
+ {
+ //return the fonction for scan the new folder
+ if(!rmpath(dir.absolutePath()+'/'+fileInfo.fileName()+'/'))
+ allHaveWork=false;
+ }
+ }
+ if(!allHaveWork)
+ return false;
+ allHaveWork=dir.rmdir(dir.absolutePath());
+ if(!allHaveWork)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove the folder: "+dir.absolutePath().toStdString());
+ return allHaveWork;
+}
+
+//fonction to edit the file date time
+bool MkPath::readFileDateTime(const QFileInfo &source)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"readFileDateTime("+source.absoluteFilePath().toStdString()+")");
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_LINUX
+ struct stat info;
+ if(stat(source.absoluteFilePath().toLatin1().data(),&info)!=0)
+ return false;
+ time_t ctime=info.st_ctim.tv_sec;
+ time_t actime=info.st_atim.tv_sec;
+ time_t modtime=info.st_mtim.tv_sec;
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ Q_UNUSED(ctime);
+ return true;
+ #else //mainly for mac
+ QFileInfo fileInfo(source);
+ time_t ctime=fileInfo.created().toTime_t();
+ time_t actime=fileInfo.lastRead().toTime_t();
+ time_t modtime=fileInfo.lastModified().toTime_t();
+ //this function avalaible on unix and mingw
+ utimbuf butime;
+ butime.actime=actime;
+ butime.modtime=modtime;
+ Q_UNUSED(ctime);
+ return true;
+ #endif
+ #else
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ struct stat info;
+ if(stat(source.toLatin1().data(),&info)!=0)
+ return false;
+ time_t ctime=info.st_ctim.tv_sec;
+ time_t actime=info.st_atim.tv_sec;
+ time_t modtime=info.st_mtim.tv_sec;
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ Q_UNUSED(ctime);
+ return true;
+ #else
+ wchar_t filePath[65535];
+ if(std::regex_match(source.absoluteFilePath().toStdString(),regRead))
+ filePath[QDir::toNativeSeparators(QStringLiteral("\\\\?\\")+source.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
+ else
+ filePath[QDir::toNativeSeparators(source.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
+ HANDLE hFileSouce = CreateFileW(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY | FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if(hFileSouce == INVALID_HANDLE_VALUE)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"open failed to read: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
+ return false;
+ }
+ FILETIME ftCreate, ftAccess, ftWrite;
+ if(!GetFileTime(hFileSouce, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileSouce);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get the file time");
+ return false;
+ }
+ this->ftCreateL=ftCreate.dwLowDateTime;
+ this->ftCreateH=ftCreate.dwHighDateTime;
+ this->ftAccessL=ftAccess.dwLowDateTime;
+ this->ftAccessH=ftAccess.dwHighDateTime;
+ this->ftWriteL=ftWrite.dwLowDateTime;
+ this->ftWriteH=ftWrite.dwHighDateTime;
+ CloseHandle(hFileSouce);
+ return true;
+ #endif
+ #else
+ return false;
+ #endif
+ #endif
+ return false;
+}
+
+bool MkPath::writeFileDateTime(const QFileInfo &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"writeFileDateTime("+destination.absoluteFilePath().toStdString()+")");
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_LINUX
+ return utime(destination.absoluteFilePath().toLatin1().data(),&butime)==0;
+ #else //mainly for mac
+ return utime(destination.absoluteFilePath().toLatin1().data(),&butime)==0;
+ #endif
+ #else
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ return utime(destination.toLatin1().data(),&butime)==0;
+ #else
+ wchar_t filePath[65535];
+ if(std::regex_match(destination.absoluteFilePath().toStdString(),regRead))
+ filePath[QDir::toNativeSeparators(QStringLiteral("\\\\?\\")+destination.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
+ else
+ filePath[QDir::toNativeSeparators(destination.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
+ HANDLE hFileDestination = CreateFileW(filePath, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if(hFileDestination == INVALID_HANDLE_VALUE)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"open failed to write: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
+ return false;
+ }
+ FILETIME ftCreate, ftAccess, ftWrite;
+ ftCreate.dwLowDateTime=this->ftCreateL;
+ ftCreate.dwHighDateTime=this->ftCreateH;
+ ftAccess.dwLowDateTime=this->ftAccessL;
+ ftAccess.dwHighDateTime=this->ftAccessH;
+ ftWrite.dwLowDateTime=this->ftWriteL;
+ ftWrite.dwHighDateTime=this->ftWriteH;
+ if(!SetFileTime(hFileDestination, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileDestination);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the file time");
+ return false;
+ }
+ CloseHandle(hFileDestination);
+ return true;
+ #endif
+ #else
+ return false;
+ #endif
+ #endif
+ return false;
+}
diff --git a/plugins/CopyEngine/Ultracopier/MkPath.h b/plugins/CopyEngine/Ultracopier/MkPath.h
new file mode 100644
index 0000000..2bbebcc
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/MkPath.h
@@ -0,0 +1,106 @@
+/** \file MkPath.h
+\brief Make the path given as queued mkpath
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef MKPATH_H
+#define MKPATH_H
+
+#include <QThread>
+#include <QFileInfo>
+#include <string>
+#include <QSemaphore>
+#include <vector>
+#include <QDir>
+#include <QDateTime>
+
+#include "Environment.h"
+
+#ifdef Q_OS_UNIX
+ #include <utime.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+#else
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ #include <utime.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+ #endif
+ #endif
+#endif
+
+/// \brief Make the path given as queued mkpath
+class MkPath : public QThread
+{
+ Q_OBJECT
+public:
+ explicit MkPath();
+ ~MkPath();
+ /// \brief add path to make
+ void addPath(const QFileInfo& source,const QFileInfo& destination,const ActionType &actionType);
+ void setRightTransfer(const bool doRightTransfer);
+ void setKeepDate(const bool keepDate);
+signals:
+ void errorOnFolder(const QFileInfo &,const std::string &,const ErrorType &errorType=ErrorType_FolderWithRety) const;
+ void firstFolderFinish();
+ void internalStartAddPath(const QFileInfo& source,const QFileInfo& destination, const ActionType &actionType) const;
+ void internalStartDoThisPath() const;
+ void internalStartSkip() const;
+ void internalStartRetry() const;
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+public slots:
+ /// \brief skip after creation error
+ void skip();
+ /// \brief retry after creation error
+ void retry();
+private:
+ void run();
+ bool waitAction;
+ bool stopIt;
+ bool skipIt;
+ QDateTime maxTime;
+ struct Item
+ {
+ QFileInfo source;
+ QFileInfo destination;
+ ActionType actionType;
+ };
+ QList<Item> pathList;
+ void checkIfCanDoTheNext();
+ QDir dir;
+ bool doRightTransfer;
+ bool keepDate;
+ bool doTheDateTransfer;
+ #ifdef Q_OS_UNIX
+ utimbuf butime;
+ #else
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ utimbuf butime;
+ #else
+ uint64_t ftCreateL, ftAccessL, ftWriteL;
+ uint64_t ftCreateH, ftAccessH, ftWriteH;
+ std::regex regRead;
+ #endif
+ #endif
+ #endif
+ //fonction to edit the file date time
+ bool readFileDateTime(const QFileInfo &source);
+ bool writeFileDateTime(const QFileInfo &destination);
+ static std::string text_slash;
+private slots:
+ void internalDoThisPath();
+ void internalAddPath(const QFileInfo& source, const QFileInfo& destination,const ActionType &actionType);
+ void internalSkip();
+ void internalRetry();
+ bool rmpath(const QDir &dir
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ , const bool &toSync=false
+ #endif
+ );
+};
+
+#endif // MKPATH_H
diff --git a/plugins/CopyEngine/Ultracopier/ReadThread.cpp b/plugins/CopyEngine/Ultracopier/ReadThread.cpp
new file mode 100644
index 0000000..e843d9b
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/ReadThread.cpp
@@ -0,0 +1,687 @@
+#include "ReadThread.h"
+
+ReadThread::ReadThread()
+{
+ start();
+ moveToThread(this);
+ stopIt=false;
+ putInPause=false;
+ blockSize=ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*1024;
+ setObjectName(QStringLiteral("read"));
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ isInReadLoop=false;
+ tryStartRead=false;
+ lastGoodPosition=0;
+ isOpen.release();
+}
+
+ReadThread::~ReadThread()
+{
+ stopIt=true;
+ //disconnect(this);//-> do into ~TransferThread()
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ waitNewClockForSpeed.release();
+ #endif
+ pauseMutex.release();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ waitNewClockForSpeed.release();
+ #endif
+ pauseMutex.release();
+ //if(isOpen.available()<=0)
+ emit internalStartClose();
+ isOpen.acquire();
+ exit();
+ wait();
+}
+
+void ReadThread::run()
+{
+ connect(this,&ReadThread::internalStartOpen, this,&ReadThread::internalOpenSlot, Qt::QueuedConnection);
+ connect(this,&ReadThread::internalStartReopen, this,&ReadThread::internalReopen, Qt::QueuedConnection);
+ connect(this,&ReadThread::internalStartRead, this,&ReadThread::internalRead, Qt::QueuedConnection);
+ connect(this,&ReadThread::internalStartClose, this,&ReadThread::internalCloseSlot, Qt::QueuedConnection);
+ connect(this,&ReadThread::checkIfIsWait, this,&ReadThread::isInWait, Qt::QueuedConnection);
+ connect(this,&ReadThread::internalStartChecksum, this,&ReadThread::checkSum, Qt::QueuedConnection);
+ exec();
+}
+
+void ReadThread::open(const QFileInfo &file, const Ultracopier::CopyMode &mode)
+{
+ if(!isRunning())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the thread not running to open destination: "+file.absoluteFilePath().toStdString());
+ errorString_internal=tr("Internal error, please report it!").toStdString();
+ emit error();
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] open source: "+file.absoluteFilePath().toStdString());
+ if(this->file.isOpen())
+ {
+ if(file.absoluteFilePath()==this->file.fileName())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Try reopen already opened same file: "+file.absoluteFilePath().toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already open: "+file.absoluteFilePath().toStdString());
+ emit internalStartClose();
+ isOpen.acquire();
+ isOpen.release();
+ }
+ if(isInReadLoop)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already readding: "+file.absoluteFilePath().toStdString());
+ return;
+ }
+ if(tryStartRead)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already try read: "+file.absoluteFilePath().toStdString());
+ return;
+ }
+ stopIt=false;
+ fakeMode=false;
+ lastGoodPosition=0;
+ this->file.setFileName(file.absoluteFilePath());
+ this->mode=mode;
+ emit internalStartOpen();
+}
+
+std::string ReadThread::errorString() const
+{
+ return errorString_internal;
+}
+
+void ReadThread::stop()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop()");
+ stopIt=true;
+ pauseMutex.release();
+ pauseMutex.release();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ waitNewClockForSpeed.release();
+ #endif
+ if(isOpen.available()<=0)
+ emit internalStartClose();
+}
+
+void ReadThread::pause()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] try put read thread in pause");
+ if(stopIt)
+ return;
+ pauseMutex.tryAcquire(pauseMutex.available());
+ putInPause=true;
+}
+
+void ReadThread::resume()
+{
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ putInPause=false;
+ stopIt=false;
+ }
+ else
+ return;
+ if(!file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] file is not open");
+ return;
+ }
+ pauseMutex.release();
+}
+
+bool ReadThread::seek(const int64_t &position)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start with: "+std::to_string(position));
+ if(position>file.size())
+ return false;
+ return file.seek(position);
+}
+
+int64_t ReadThread::size() const
+{
+ return file.size();
+}
+
+void ReadThread::postOperation()
+{
+ emit internalStartClose();
+}
+
+void ReadThread::checkSum()
+{
+ QByteArray blockArray;
+ QCryptographicHash hash(QCryptographicHash::Sha1);
+ isInReadLoop=true;
+ lastGoodPosition=0;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ numberOfBlockCopied=0;
+ #endif
+ seek(0);
+ int sizeReaden=0;
+ do
+ {
+ //read one block
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Read;
+ #endif
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] read put in pause");
+ if(stopIt)
+ return;
+ pauseMutex.acquire();
+ if(stopIt)
+ return;
+ }
+ blockArray=file.read(blockSize);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ //can be smaller than min block size to do correct speed limitation
+ if(blockArray.size()>ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE*1024)
+ {
+ errorString_internal=tr("Internal error reading the source file:block size out of range").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Internal error reading the source file:block size out of range");
+ emit error();
+ isInReadLoop=false;
+ return;
+ }
+ if(file.error()!=QFile::NoError)
+ {
+ errorString_internal=tr("Unable to read the source file: ").toStdString()+file.errorString().toStdString()+" ("+std::to_string(file.error())+")";
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("file.error()!=QFile::NoError: %1, error: ").arg(QString::number(file.error())).toStdString()+errorString_internal);
+ emit error();
+ isInReadLoop=false;
+ return;
+ }
+ sizeReaden=blockArray.size();
+ if(sizeReaden>0)
+ {
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Checksum;
+ #endif
+ hash.addData(blockArray);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ if(stopIt)
+ break;
+
+ lastGoodPosition+=blockArray.size();
+
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ //wait for limitation speed if stop not query
+ if(multiForBigSpeed>0)
+ {
+ numberOfBlockCopied++;
+ if(numberOfBlockCopied>=multiForBigSpeed)
+ {
+ numberOfBlockCopied=0;
+ waitNewClockForSpeed.acquire();
+ if(stopIt)
+ break;
+ }
+ }
+ #endif
+ }
+ }
+ while(sizeReaden>0 && !stopIt);
+ if(lastGoodPosition>file.size())
+ {
+ errorString_internal=tr("File truncated during the read, possible data change").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Source truncated during the read: %1 (%2)").arg(file.errorString()).arg(QString::number(file.error())).toStdString());
+ emit error();
+ isInReadLoop=false;
+ return;
+ }
+ isInReadLoop=false;
+ if(stopIt)
+ {
+ stopIt=false;
+ return;
+ }
+ emit checksumFinish(hash.result());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop the read");
+}
+
+bool ReadThread::internalOpenSlot()
+{
+ return internalOpen();
+}
+
+bool ReadThread::internalOpen(bool resetLastGoodPosition)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] internalOpen source: "+file.fileName().toStdString()+", open in write because move: "+std::to_string(mode==Ultracopier::Move));
+ if(stopIt)
+ {
+ emit closed();
+ return false;
+ }
+ putInPause=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=InodeOperation;
+ #endif
+ if(file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] this file is already open: "+file.fileName().toStdString());
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ emit closed();
+ return false;
+ }
+ QIODevice::OpenMode openMode=QIODevice::ReadOnly;
+ /*can have permision to remove but not write
+ * if(mode==Ultracopier::Move)
+ openMode=QIODevice::ReadWrite;*/
+ seekToZero=false;
+ if(file.open(openMode))
+ {
+ if(stopIt)
+ {
+ file.close();
+ emit closed();
+ return false;
+ }
+ pauseMutex.tryAcquire(pauseMutex.available());
+ if(stopIt)
+ {
+ file.close();
+ emit closed();
+ return false;
+ }
+ size_at_open=file.size();
+ mtime_at_open=QFileInfo(file).lastModified().toMSecsSinceEpoch()/1000;
+ putInPause=false;
+ if(resetLastGoodPosition)
+ lastGoodPosition=0;
+ if(!seek(lastGoodPosition))
+ {
+ file.close();
+ errorString_internal=file.errorString().toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).toStdString()+errorString_internal);
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+ isOpen.acquire();
+ emit opened();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return true;
+ }
+ else
+ {
+ errorString_internal=file.errorString().toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to open: %1, error: ").arg(file.fileName()).toStdString()+errorString_internal);
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+}
+
+void ReadThread::internalRead()
+{
+ isInReadLoop=true;
+ tryStartRead=false;
+ if(stopIt)
+ {
+ if(seekToZero && file.isOpen())
+ {
+ stopIt=false;
+ lastGoodPosition=0;
+ file.seek(0);
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopIt == true, then quit");
+ isInReadLoop=false;
+ internalClose();
+ return;
+ }
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=InodeOperation;
+ #endif
+ int sizeReaden=0;
+ if(!file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] is not open!");
+ isInReadLoop=false;
+ return;
+ }
+ QByteArray blockArray;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ numberOfBlockCopied=0;
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start the copy");
+ emit readIsStarted();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopIt == true, then quit");
+ isInReadLoop=false;
+ internalClose();
+ return;
+ }
+ do
+ {
+ //read one block
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] read put in pause");
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopIt == true, then quit");
+ isInReadLoop=false;
+ internalClose();
+ return;
+ }
+ pauseMutex.acquire();
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopIt == true, then quit");
+ isInReadLoop=false;
+ internalClose();
+ return;
+ }
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Read;
+ #endif
+ blockArray=file.read(blockSize);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ if(file.error()!=QFile::NoError)
+ {
+ errorString_internal=tr("Unable to read the source file: ").toStdString()+file.errorString().toStdString()+" ("+std::to_string(file.error())+")";
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("file.error()!=QFile::NoError: %1, error: ").arg(QString::number(file.error())).toStdString()+errorString_internal);
+ isInReadLoop=false;
+ emit error();
+ return;
+ }
+ sizeReaden=blockArray.size();
+ if(sizeReaden>0)
+ {
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=WaitWritePipe;
+ #endif
+ if(!writeThread->write(blockArray))//speed limitation here
+ {
+ if(!stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopped because the write is stopped: "+std::to_string(lastGoodPosition));
+ stopIt=true;
+ }
+ }
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopIt == true, then quit");
+ isInReadLoop=false;
+ internalClose();//need re-open the destination and then the source
+ return;
+ }
+ lastGoodPosition+=blockArray.size();
+ }
+ /*
+ if(lastGoodPosition>16*1024)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("[")+QString::number(id)+QStringLiteral("] ")+QStringLiteral("Test error in reading: %1 (%2)").arg(file.errorString()).arg(file.error()));
+ errorString_internal=QStringLiteral("Test error in reading: %1 (%2)").arg(file.errorString()).arg(file.error());
+ isInReadLoop=false;
+ emit error();
+ return;
+ }
+ */
+ }
+ while(sizeReaden>0 && !stopIt);
+ if(lastGoodPosition>file.size())
+ {
+ errorString_internal=tr("File truncated during the read, possible data change").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Source truncated during the read: %1 (%2)").arg(file.errorString()).arg(QString::number(file.error())).toStdString());
+ isInReadLoop=false;
+ emit error();
+ return;
+ }
+ isInReadLoop=false;
+ if(stopIt)
+ {
+ stopIt=false;
+ return;
+ }
+ emit readIsStopped();//will product by signal connection writeThread->endIsDetected();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop the read");
+}
+
+void ReadThread::startRead()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ if(tryStartRead)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] already in try start");
+ return;
+ }
+ if(isInReadLoop)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
+ else
+ {
+ tryStartRead=true;
+ emit internalStartRead();
+ }
+}
+
+void ReadThread::internalCloseSlot()
+{
+ internalClose();
+}
+
+void ReadThread::internalClose(bool callByTheDestructor)
+{
+ /// \note never send signal here, because it's called by the destructor
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[")+QString::number(id)+QStringLiteral("] start"));
+ bool closeTheFile=false;
+ if(!fakeMode)
+ {
+ if(file.isOpen())
+ {
+ closeTheFile=true;
+ file.close();
+ isInReadLoop=false;
+ }
+ }
+ if(!callByTheDestructor)
+ emit closed();
+
+ /// \note always the last of this function
+ if(closeTheFile)
+ isOpen.release();
+}
+
+/** \brief set block size
+\param block the new block size in B
+\return Return true if succes */
+bool ReadThread::setBlockSize(const int blockSize)
+{
+ //can be smaller than min block size to do correct speed limitation
+ if(blockSize>1 && blockSize<ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE*1024)
+ {
+ this->blockSize=blockSize;
+ //set the new max speed because the timer have changed
+ return true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"block size out of range: "+std::to_string(blockSize));
+ return false;
+ }
+}
+
+#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+/*! \brief Set the max speed
+\param tempMaxSpeed Set the max speed in KB/s, 0 for no limit */
+void ReadThread::setMultiForBigSpeed(const int &multiForBigSpeed)
+{
+ this->multiForBigSpeed=multiForBigSpeed;
+ waitNewClockForSpeed.release();
+}
+
+/// \brief For give timer every X ms
+void ReadThread::timeOfTheBlockCopyFinished()
+{
+ /* this is the old way to limit the speed, it product blocking
+ *if(waitNewClockForSpeed.available()<ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT)
+ waitNewClockForSpeed.release();*/
+
+ //try this new way:
+ /* only if speed limited, else will accumulate waitNewClockForSpeed
+ * Disabled because: Stop call of this method when no speed limit
+ if(this->maxSpeed>0)*/
+ if(waitNewClockForSpeed.available()<=1)
+ waitNewClockForSpeed.release();
+}
+#endif
+
+/// \brief do the fake open
+void ReadThread::fakeOpen()
+{
+ fakeMode=true;
+ emit opened();
+}
+
+/// \brief do the fake writeIsStarted
+void ReadThread::fakeReadIsStarted()
+{
+ emit readIsStarted();
+}
+
+/// \brief do the fake writeIsStopped
+void ReadThread::fakeReadIsStopped()
+{
+ emit readIsStopped();
+}
+
+/// do the checksum
+void ReadThread::startCheckSum()
+{
+ emit internalStartChecksum();
+}
+
+int64_t ReadThread::getLastGoodPosition() const
+{
+ /*if(lastGoodPosition>file.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QStringLiteral("[")+QString::number(id)+QStringLiteral("] Bug, the lastGoodPosition is greater than the file size!"));
+ return file.size();
+ }
+ else*/
+ return lastGoodPosition;
+}
+
+//reopen after an error
+void ReadThread::reopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ if(isInReadLoop)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] try reopen where read is not finish");
+ return;
+ }
+ stopIt=true;
+ emit internalStartReopen();
+}
+
+bool ReadThread::internalReopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ stopIt=false;
+ if(file.isOpen())
+ {
+ file.close();
+ isOpen.release();
+ }
+ if(size_at_open!=file.size() && mtime_at_open!=(uint64_t)QFileInfo(file).lastModified().toMSecsSinceEpoch()/1000)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] source file have changed since the last open, restart all");
+ //fix this function like the close function
+ if(internalOpen(true))
+ {
+ emit resumeAfterErrorByRestartAll();
+ return true;
+ }
+ else
+ return false;
+ }
+ else
+ {
+ //fix this function like the close function
+ if(internalOpen(false))
+ {
+ emit resumeAfterErrorByRestartAtTheLastPosition();
+ return true;
+ }
+ else
+ return false;
+ }
+}
+
+//set the write thread
+void ReadThread::setWriteThread(WriteThread * writeThread)
+{
+ this->writeThread=writeThread;
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+//to set the id
+void ReadThread::setId(int id)
+{
+ this->id=id;
+}
+#endif
+
+void ReadThread::seekToZeroAndWait()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ stopIt=true;
+ seekToZero=true;
+ emit checkIfIsWait();
+}
+
+void ReadThread::isInWait()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ if(seekToZero)
+ {
+ stopIt=false;
+ seekToZero=false;
+ if(file.isOpen())
+ {
+ lastGoodPosition=0;
+ seek(0);
+ }
+ else
+ internalOpen(true);
+ emit isSeekToZeroAndWait();
+ }
+}
+
+bool ReadThread::isReading() const
+{
+ return isInReadLoop;
+}
+
diff --git a/plugins/CopyEngine/Ultracopier/ReadThread.h b/plugins/CopyEngine/Ultracopier/ReadThread.h
new file mode 100644
index 0000000..f817e35
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/ReadThread.h
@@ -0,0 +1,147 @@
+/** \file ReadThread.h
+\brief Thread changed to open/close and read the source file
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef READTHREAD_H
+#define READTHREAD_H
+
+#include <QThread>
+#include <QByteArray>
+#include <QSemaphore>
+#include <QDateTime>
+#include <QFileInfo>
+#include <QCryptographicHash>
+
+#include "WriteThread.h"
+#include "Environment.h"
+#include "StructEnumDefinition_CopyEngine.h"
+#include "AvancedQFile.h"
+
+/// \brief Thread changed to open/close and read the source file
+class ReadThread : public QThread
+{
+ Q_OBJECT
+public:
+ explicit ReadThread();
+ ~ReadThread();
+protected:
+ void run();
+public:
+ /// \brief open with the name and copy mode
+ void open(const QFileInfo &file, const Ultracopier::CopyMode &mode);
+ /// \brief return the error string
+ std::string errorString() const;
+ //QByteArray read(qint64 position,qint64 maxSize);
+ /// \brief stop the copy
+ void stop();
+ /// \brief put the copy in pause
+ void pause();
+ /// \brief resume the copy
+ void resume();
+ /// \brief get the size of the source file
+ int64_t size() const;
+ /// \brief get the last good position
+ int64_t getLastGoodPosition() const;
+ /// \brief start the reading of the source file
+ void startRead();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ /// \brief set the current max speed in KB/s
+ void setMultiForBigSpeed(const int &multiForBigSpeed);
+ #endif
+ /// \brief set block size in KB
+ bool setBlockSize(const int blockSize);
+ /// \brief reopen after an error
+ void reopen();
+ /// \brief set the write thread
+ void setWriteThread(WriteThread * writeThread);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief to set the id
+ void setId(int id);
+ /// \brief stat
+ enum ReadStat
+ {
+ Idle=0,
+ InodeOperation=1,
+ Read=2,
+ WaitWritePipe=3,
+ Checksum=4
+ };
+ ReadStat stat;
+ #endif
+ /// \brief return if it's reading
+ bool isReading() const;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ /// \brief executed at regular interval to do a speed throling
+ void timeOfTheBlockCopyFinished();
+ #endif
+ /// \brief do the fake open
+ void fakeOpen();
+ /// \brief do the fake readIsStarted
+ void fakeReadIsStarted();
+ /// \brief do the fake readIsStopped
+ void fakeReadIsStopped();
+ /// do the checksum
+ void startCheckSum();
+public slots:
+ /// \brief to reset the copy, and put at the same state when it just open
+ void seekToZeroAndWait();
+ void postOperation();
+ /// do the checksum
+ void checkSum();
+signals:
+ void error() const;
+ void opened() const;
+ void readIsStarted() const;
+ void readIsStopped() const;
+ void closed() const;
+ void isSeekToZeroAndWait() const;
+ void checkIfIsWait() const;
+ void resumeAfterErrorByRestartAll() const;
+ void resumeAfterErrorByRestartAtTheLastPosition() const;
+ void checksumFinish(const QByteArray&) const;
+ // internal signals
+ void internalStartOpen() const;
+ void internalStartChecksum() const;
+ void internalStartReopen() const;
+ void internalStartRead() const;
+ void internalStartClose() const;
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,std::string fonction,std::string text,std::string file,int ligne) const;
+
+private:
+ std::string errorString_internal;
+ AvancedQFile file;
+ volatile bool stopIt;
+ Ultracopier::CopyMode mode;
+ int64_t lastGoodPosition;
+ volatile int blockSize;//in Bytes
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ QSemaphore waitNewClockForSpeed;
+ volatile int numberOfBlockCopied; ///< Multiple for count the number of block copied
+ volatile int multiForBigSpeed; ///< Multiple for count the number of block needed
+ #endif
+ WriteThread* writeThread;
+ int id;
+ QSemaphore isOpen;
+ QSemaphore pauseMutex;
+ volatile bool putInPause;
+ volatile bool isInReadLoop;
+ volatile bool seekToZero;
+ volatile bool tryStartRead;
+ int64_t size_at_open;
+ uint64_t mtime_at_open;
+ bool fakeMode;
+ //internal function
+ bool seek(const int64_t &position);/// \todo search if is use full
+private slots:
+ bool internalOpen(bool resetLastGoodPosition=true);
+ bool internalOpenSlot();
+ bool internalReopen();
+ void internalRead();
+ void internalClose(bool callByTheDestructor=false);
+ void internalCloseSlot();
+ void isInWait();
+};
+
+#endif // READTHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier/RenamingRules.cpp b/plugins/CopyEngine/Ultracopier/RenamingRules.cpp
new file mode 100644
index 0000000..4ae23b8
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/RenamingRules.cpp
@@ -0,0 +1,85 @@
+#include "RenamingRules.h"
+#include "ui_RenamingRules.h"
+
+#include <QMessageBox>
+
+RenamingRules::RenamingRules(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::RenamingRules)
+{
+ ui->setupUi(this);
+ connectUI();
+ setRenamingRules("","");
+}
+
+RenamingRules::~RenamingRules()
+{
+ delete ui;
+}
+
+void RenamingRules::on_buttonBox_clicked(QAbstractButton *button)
+{
+ if(ui->buttonBox->buttonRole(button)==QDialogButtonBox::RejectRole)
+ reject();
+ if(ui->buttonBox->buttonRole(button)==QDialogButtonBox::ResetRole)
+ {
+ setRenamingRules("","");
+ emit sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+ }
+}
+
+void RenamingRules::setRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule)
+{
+ disconnectUI();
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ if(!firstRenamingRule.empty())
+ ui->firstRenamingRule->setText(QString::fromStdString(firstRenamingRule));
+ else
+ ui->firstRenamingRule->setText(tr("%1 - copy").arg(QStringLiteral("%name%")));
+ if(!otherRenamingRule.empty())
+ ui->otherRenamingRule->setText(QString::fromStdString(otherRenamingRule));
+ else
+ ui->otherRenamingRule->setText(tr("%1 - copy (%2)").arg(QStringLiteral("%name%")).arg(QStringLiteral("%number%")));
+ connectUI();
+}
+
+void RenamingRules::connectUI()
+{
+ connect(ui->firstRenamingRule,&QLineEdit::editingFinished,this,&RenamingRules::firstRenamingRule_haveChanged);
+ connect(ui->otherRenamingRule,&QLineEdit::editingFinished,this,&RenamingRules::otherRenamingRule_haveChanged);
+}
+
+void RenamingRules::disconnectUI()
+{
+ disconnect(ui->firstRenamingRule,&QLineEdit::editingFinished,this,&RenamingRules::firstRenamingRule_haveChanged);
+ disconnect(ui->otherRenamingRule,&QLineEdit::editingFinished,this,&RenamingRules::otherRenamingRule_haveChanged);
+}
+
+void RenamingRules::firstRenamingRule_haveChanged()
+{
+ QString newValue=ui->firstRenamingRule->text();
+ if(newValue==tr("%1 - copy").arg(QStringLiteral("%name%")))
+ newValue=QStringLiteral("");
+ if(newValue.toStdString()==firstRenamingRule)
+ return;
+ firstRenamingRule=newValue.toStdString();
+ emit sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+void RenamingRules::otherRenamingRule_haveChanged()
+{
+ QString newValue=ui->otherRenamingRule->text();
+ if(newValue==tr("%1 - copy (%2)").arg(QStringLiteral("%name%")).arg(QStringLiteral("%number%")))
+ newValue=QStringLiteral("");
+ if(newValue.toStdString()==otherRenamingRule)
+ return;
+ otherRenamingRule=newValue.toStdString();
+ emit sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+void RenamingRules::newLanguageLoaded()
+{
+ ui->retranslateUi(this);
+ setRenamingRules(firstRenamingRule,otherRenamingRule);
+}
diff --git a/plugins/CopyEngine/Ultracopier/RenamingRules.h b/plugins/CopyEngine/Ultracopier/RenamingRules.h
new file mode 100644
index 0000000..b2e9d02
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/RenamingRules.h
@@ -0,0 +1,34 @@
+#ifndef RENAMINGRULES_H
+#define RENAMINGRULES_H
+
+#include <QDialog>
+#include <QAbstractButton>
+
+namespace Ui {
+class RenamingRules;
+}
+
+/** Define rules for renaming */
+class RenamingRules : public QDialog
+{
+ Q_OBJECT
+public:
+ explicit RenamingRules(QWidget *parent = 0);
+ ~RenamingRules();
+ void setRenamingRules(std::string firstRenamingRule, std::string otherRenamingRule);
+ void newLanguageLoaded();
+private:
+ Ui::RenamingRules *ui;
+ void connectUI();
+ void disconnectUI();
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+private slots:
+ void on_buttonBox_clicked(QAbstractButton *button);
+ void firstRenamingRule_haveChanged();
+ void otherRenamingRule_haveChanged();
+signals:
+ void sendNewRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule) const;
+};
+
+#endif // RENAMINGRULES_H
diff --git a/plugins/CopyEngine/Ultracopier/RenamingRules.ui b/plugins/CopyEngine/Ultracopier/RenamingRules.ui
new file mode 100644
index 0000000..9e84f4b
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/RenamingRules.ui
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RenamingRules</class>
+ <widget class="QDialog" name="RenamingRules">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>303</width>
+ <height>213</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Renaming rules</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>First renaming</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLineEdit" name="firstRenamingRule">
+ <property name="placeholderText">
+ <string extracomment="%name% should not be translated">%name% - copy</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string extracomment=" should not be translated">&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;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Second renaming</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLineEdit" name="otherRenamingRule">
+ <property name="placeholderText">
+ <string extracomment="%name%, %number% should not be translated">%name% - copy (%number%)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string extracomment="%name%, %number% should not be translated">&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;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>1</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close|QDialogButtonBox::RestoreDefaults</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>RenamingRules</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>RenamingRules</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp b/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp
new file mode 100644
index 0000000..736f589
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp
@@ -0,0 +1,688 @@
+#include "ScanFileOrFolder.h"
+#include "TransferThread.h"
+#include <QtGlobal>
+#include <QDateTime>
+#include <regex>
+#include "../../../cpp11addition.h"
+
+#ifdef Q_OS_WIN32
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#endif
+
+std::string ScanFileOrFolder::text_slash="/";
+std::string ScanFileOrFolder::text_antislash="\\";
+std::string ScanFileOrFolder::text_dot=".";
+
+ScanFileOrFolder::ScanFileOrFolder(const Ultracopier::CopyMode &mode)
+{
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ rsync = false;
+ #endif
+ moveTheWholeFolder = true;
+ stopped = true;
+ stopIt = false;
+ this->mode = mode;
+ folder_isolation = std::regex("^(.*/)?([^/]+)/$");
+ setObjectName(QStringLiteral("ScanFileOrFolder"));
+ #ifdef Q_OS_WIN32
+ QString userName;
+ DWORD size=255;
+ WCHAR * userNameW=new WCHAR[size];
+ if(GetUserNameW(userNameW,&size))
+ {
+ userName=QString::fromWCharArray(userNameW,size-1);
+ blackList.push_back(QFileInfo(QStringLiteral("C:/Users/%1/AppData/Roaming/").arg(userName)).absoluteFilePath().toStdString());
+ }
+ delete userNameW;
+ #endif
+}
+
+ScanFileOrFolder::~ScanFileOrFolder()
+{
+ stop();
+ quit();
+ wait();
+}
+
+bool ScanFileOrFolder::isFinished() const
+{
+ return stopped;
+}
+
+void ScanFileOrFolder::addToList(const std::vector<std::string>& sources,const std::string& destination)
+{
+ stopIt=false;
+ this->sources=parseWildcardSources(sources);
+ this->destination=destination;
+ QFileInfo destinationInfo(QString::fromStdString(this->destination));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"check symblink: "+destinationInfo.absoluteFilePath().toStdString());
+ while(destinationInfo.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"resolv destination to: "+destinationInfo.symLinkTarget().toStdString());
+ if(QFileInfo(destinationInfo.symLinkTarget()).isAbsolute())
+ this->destination=destinationInfo.symLinkTarget().toStdString();
+ else
+ this->destination=destinationInfo.absolutePath().toStdString()+text_slash+destinationInfo.symLinkTarget().toStdString();
+ destinationInfo.setFile(QString::fromStdString(this->destination));
+ }
+ if(sources.size()>1 || QFileInfo(QString::fromStdString(destination)).isDir())
+ /* Disabled because the separator transformation product bug
+ * if(!destination.endsWith(QDir::separator()))
+ this->destination+=QDir::separator();*/
+ if(!stringEndsWith(destination,'/') && !stringEndsWith(destination,'\\'))
+ this->destination+=text_slash;//put unix separator because it's transformed into that's under windows too
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"addToList("+stringimplode(sources,";")+","+this->destination+")");
+}
+
+
+std::vector<std::string> ScanFileOrFolder::parseWildcardSources(const std::vector<std::string> &sources) const
+{
+ std::regex splitFolder("[/\\\\]");
+ std::vector<std::string> returnList;
+ unsigned int index=0;
+ while(index<(unsigned int)sources.size())
+ {
+ if(sources.at(index).find("*") != std::string::npos)
+ {
+ std::vector<std::string> toParse=stringregexsplit(sources.at(index),splitFolder);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"before wildcard parse: "+sources.at(index)+", toParse: "+stringimplode(toParse,", "));
+ std::vector<std::vector<std::string> > recomposedSource;
+ {
+ std::vector<std::string> t;
+ t.push_back("");
+ recomposedSource.push_back(t);
+ }
+ while(toParse.size()>0)
+ {
+ if(toParse.front().find("*") != std::string::npos)
+ {
+ std::string toParseFirst=toParse.front();
+ if(toParseFirst.empty())
+ toParseFirst=text_slash;
+ std::vector<std::vector<std::string> > newRecomposedSource;
+ stringreplaceAll(toParseFirst,"*","[^/\\\\]*");
+ std::regex toResolv=std::regex(toParseFirst);
+ unsigned int index_recomposedSource=0;
+ while(index_recomposedSource<recomposedSource.size())//parse each url part
+ {
+ QFileInfo info(QString::fromStdString(stringimplode(recomposedSource.at(index_recomposedSource),text_slash)));
+ if(info.isDir() && !info.isSymLink())
+ {
+ QDir folder(info.absoluteFilePath());
+ QFileInfoList fileFile=folder.entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System);//QStringList() << toResolv
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list the folder: "+info.absoluteFilePath().toStdString()+", with the wildcard: "+toParseFirst);
+ int index_fileList=0;
+ while(index_fileList<fileFile.size())
+ {
+ const std::string &fileName=fileFile.at(index_fileList).fileName().toStdString();
+ if(std::regex_match(fileName,toResolv))
+ {
+ std::vector<std::string> tempList=recomposedSource.at(index_recomposedSource);
+ tempList.push_back(fileName);
+ newRecomposedSource.push_back(tempList);
+ }
+ index_fileList++;
+ }
+ }
+ index_recomposedSource++;
+ }
+ recomposedSource=newRecomposedSource;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"add toParse: "+stringimplode(toParse,text_slash));
+ unsigned int index_recomposedSource=0;
+ while(index_recomposedSource<recomposedSource.size())
+ {
+ recomposedSource[index_recomposedSource].push_back(toParse.front());
+ if(!QFileInfo(QString::fromStdString(stringimplode(recomposedSource.at(index_recomposedSource),text_slash))).exists())
+ recomposedSource.erase(recomposedSource.cbegin()+index_recomposedSource);
+ else
+ index_recomposedSource++;
+ }
+ }
+ toParse.erase(toParse.cbegin());
+ }
+ unsigned int index_recomposedSource=0;
+ while(index_recomposedSource<recomposedSource.size())
+ {
+ returnList.push_back(stringimplode(recomposedSource.at(index_recomposedSource),text_slash));
+ index_recomposedSource++;
+ }
+ }
+ else
+ returnList.push_back(sources.at(index));
+ index++;
+ }
+ return returnList;
+}
+
+void ScanFileOrFolder::setFilters(const std::vector<Filters_rules> &include, const std::vector<Filters_rules> &exclude)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QMutexLocker lock(&filtersMutex);
+ this->include_send=include;
+ this->exclude_send=exclude;
+ reloadTheNewFilters=true;
+ haveFilters=include_send.size()>0 || exclude_send.size()>0;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"haveFilters: "+std::to_string(haveFilters)+", include_send.size(): "+std::to_string(include_send.size())+", exclude_send.size(): "+std::to_string(exclude_send.size()));
+}
+
+//set action if Folder are same or exists
+void ScanFileOrFolder::setFolderExistsAction(const FolderExistsAction &action, const std::string &newName)
+{
+ this->newName=newName;
+ folderExistsAction=action;
+ waitOneAction.release();
+}
+
+//set action if error
+void ScanFileOrFolder::setFolderErrorAction(const FileErrorAction &action)
+{
+ fileErrorAction=action;
+ waitOneAction.release();
+}
+
+void ScanFileOrFolder::stop()
+{
+ stopIt=true;
+ waitOneAction.release();
+}
+
+void ScanFileOrFolder::run()
+{
+ stopped=false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start the listing with destination: "+destination+", mode: "+std::to_string(mode));
+ destination=resolvDestination(QString::fromStdString(destination)).absoluteFilePath().toStdString();
+ if(stopIt)
+ {
+ stopped=true;
+ return;
+ }
+ if(fileErrorAction==FileError_Skip)
+ {
+ stopped=true;
+ return;
+ }
+ unsigned int sourceIndex=0;
+ while(sourceIndex<sources.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"size source to list: "+std::to_string(sourceIndex)+text_slash+std::to_string(sources.size()));
+ if(stopIt)
+ {
+ stopped=true;
+ return;
+ }
+ QFileInfo source=QString::fromStdString(sources.at(sourceIndex));
+ if(source.isDir() && !source.isSymLink())
+ {
+ /* Bad way; when you copy c:\source\folder into d:\destination, you wait it create the folder d:\destination\folder
+ //listFolder(source.absoluteFilePath()+QDir::separator(),destination);
+ listFolder(source.absoluteFilePath()+text_slash,destination);//put unix separator because it's transformed into that's under windows too
+ */
+ //put unix separator because it's transformed into that's under windows too
+ std::string tempString=QFileInfo(QString::fromStdString(destination)).absoluteFilePath().toStdString();
+ if(!stringEndsWith(tempString,text_slash) && !stringEndsWith(tempString,text_antislash))
+ tempString+=text_slash;
+ tempString+=TransferThread::resolvedName(source);
+ if(moveTheWholeFolder && mode==Ultracopier::Move && !QFileInfo(QString::fromStdString(tempString)).exists() &&
+ driveManagement.isSameDrive(source.absoluteFilePath().toStdString(),tempString))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempString: move and not exists: "+tempString);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"do real move: "+source.absoluteFilePath().toStdString()+" to "+tempString);
+ emit addToRealMove(source.absoluteFilePath(),QString::fromStdString(tempString));
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempString: "+tempString+" normal listing, blacklist size: "+std::to_string(blackList.size()));
+ listFolder(source.absoluteFilePath(),QString::fromStdString(tempString));
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+source.absoluteFilePath().toStdString()+" is file or symblink");
+ emit fileTransfer(source,QString::fromStdString(destination+text_slash)+source.fileName(),mode);
+ }
+ sourceIndex++;
+ }
+ stopped=true;
+ if(stopIt)
+ return;
+ emit finishedTheListing();
+}
+
+QFileInfo ScanFileOrFolder::resolvDestination(const QFileInfo &destination)
+{
+ QFileInfo newDestination=destination;
+ while(newDestination.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"resolv destination to: "+newDestination.symLinkTarget().toStdString());
+ if(QFileInfo(newDestination.symLinkTarget()).isAbsolute())
+ newDestination.setFile(newDestination.symLinkTarget());
+ else
+ newDestination.setFile(newDestination.absolutePath()+QString::fromStdString(text_slash)+newDestination.symLinkTarget());
+ }
+ do
+ {
+ fileErrorAction=FileError_NotSet;
+ if(isBlackListed(destination))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"isBlackListed: "+destination.absoluteFilePath().toStdString());
+ emit errorOnFolder(destination,tr("Blacklisted folder").toStdString(),ErrorType_Folder);
+ waitOneAction.acquire();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionNum: "+std::to_string(fileErrorAction));
+ }
+ } while(fileErrorAction==FileError_Retry || fileErrorAction==FileError_PutToEndOfTheList);
+ return newDestination;
+}
+
+bool ScanFileOrFolder::isBlackListed(const QFileInfo &destination)
+{
+ int index=0;
+ int size=blackList.size();
+ while(index<size)
+ {
+ if(stringStartWith(destination.absoluteFilePath().toStdString(),blackList.at(index)))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,destination.absoluteFilePath().toStdString()+" start with: "+blackList.at(index));
+ return true;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,destination.absoluteFilePath().toStdString()+" not start with: "+blackList.at(index));
+ index++;
+ }
+ return false;
+}
+
+void ScanFileOrFolder::listFolder(QFileInfo source,QFileInfo destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+source.absoluteFilePath().toStdString()+
+ " ("+std::to_string(source.isSymLink())+"), destination: "+destination.absoluteFilePath().toStdString()+
+ " ("+std::to_string(destination.isSymLink())+")");
+ if(stopIt)
+ return;
+ destination=resolvDestination(destination);
+ if(stopIt)
+ return;
+ if(fileErrorAction==FileError_Skip)
+ return;
+ //if is same
+ if(source.absoluteFilePath()==destination.absoluteFilePath())
+ {
+ emit folderAlreadyExists(source,destination,true);
+ waitOneAction.acquire();
+ std::string destinationSuffixPath;
+ switch(folderExistsAction)
+ {
+ case FolderExists_Merge:
+ break;
+ case FolderExists_Skip:
+ return;
+ break;
+ case FolderExists_Rename:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination before rename: "+destination.absoluteFilePath().toStdString());
+ if(newName.empty())
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"pattern: "+folder_isolation.str());
+ //resolv the new name
+ destinationSuffixPath=destination.baseName().toStdString();
+ int num=1;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ destinationSuffixPath=tr("%1 - copy").arg(destination.baseName()).toStdString();
+ else
+ {
+ destinationSuffixPath=firstRenamingRule;
+ stringreplaceAll(destinationSuffixPath,"%name%",destination.baseName().toStdString());
+ }
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ destinationSuffixPath=tr("%1 - copy (%2)").arg(destination.baseName()).arg(num).toStdString();
+ else
+ {
+ destinationSuffixPath=otherRenamingRule;
+ stringreplaceAll(destinationSuffixPath,"%name%",destination.baseName().toStdString());
+ stringreplaceAll(destinationSuffixPath,"%number%",std::to_string(num));
+ }
+ }
+ num++;
+ if(destination.completeSuffix().isEmpty())
+ destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath));
+ else
+ destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath)+QString::fromStdString(text_dot)+destination.completeSuffix());
+ }
+ while(destination.exists());
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"use new name: "+newName);
+ destinationSuffixPath = newName;
+ }
+ destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash+destinationSuffixPath));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination after rename: "+destination.absoluteFilePath().toStdString());
+ break;
+ default:
+ return;
+ break;
+ }
+ }
+ //check if destination exists
+ if(checkDestinationExists)
+ {
+ if(destination.exists())
+ {
+ emit folderAlreadyExists(source,destination,false);
+ waitOneAction.acquire();
+ std::string destinationSuffixPath;
+ switch(folderExistsAction)
+ {
+ case FolderExists_Merge:
+ break;
+ case FolderExists_Skip:
+ return;
+ break;
+ case FolderExists_Rename:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination before rename: "+destination.absoluteFilePath().toStdString());
+ if(newName.empty())
+ {
+ //resolv the new name
+ QFileInfo destinationInfo;
+ int num=1;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ destinationSuffixPath=tr("%1 - copy").arg(destination.baseName()).toStdString();
+ else
+ {
+ destinationSuffixPath=firstRenamingRule;
+ stringreplaceAll(destinationSuffixPath,"%name%",destination.baseName().toStdString());
+ }
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ destinationSuffixPath=tr("%1 - copy (%2)").arg(destination.baseName()).arg(num).toStdString();
+ else
+ {
+ destinationSuffixPath=otherRenamingRule;
+ stringreplaceAll(destinationSuffixPath,"%name%",destination.baseName().toStdString());
+ stringreplaceAll(destinationSuffixPath,"%number%",std::to_string(num));
+ }
+ }
+ destinationInfo.setFile(destinationInfo.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath));
+ num++;
+ }
+ while(destinationInfo.exists());
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"use new name: "+newName);
+ destinationSuffixPath = newName;
+ }
+ if(destination.completeSuffix().isEmpty())
+ destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath));
+ else
+ destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath)+QStringLiteral(".")+destination.completeSuffix());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination after rename: "+destination.absoluteFilePath().toStdString());
+ break;
+ default:
+ return;
+ break;
+ }
+ }
+ }
+ //do source check
+ //check of source is readable
+ do
+ {
+ fileErrorAction=FileError_NotSet;
+ if(!source.isReadable() || !source.isExecutable() || !source.exists() || !source.isDir())
+ {
+ if(!source.isDir())
+ emit errorOnFolder(source,tr("This is not a folder").toStdString());
+ else if(!source.exists())
+ emit errorOnFolder(source,tr("The folder does exists").toStdString());
+ else
+ emit errorOnFolder(source,tr("The folder is not readable").toStdString());
+ waitOneAction.acquire();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionNum: "+std::to_string(fileErrorAction));
+ }
+ } while(fileErrorAction==FileError_Retry);
+ do
+ {
+ QDir tempDir(source.absoluteFilePath());
+ fileErrorAction=FileError_NotSet;
+ if(!tempDir.isReadable() || !tempDir.exists())
+ {
+ emit errorOnFolder(source,tr("Problem with name encoding").toStdString());
+ waitOneAction.acquire();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionNum: "+std::to_string(fileErrorAction));
+ }
+ } while(fileErrorAction==FileError_Retry);
+ if(stopIt)
+ return;
+ /// \todo check here if the folder is not readable or not exists
+ QFileInfoList entryList;
+ if(copyListOrder)
+ entryList=QDir(source.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst|QDir::Name|QDir::IgnoreCase);//possible wait time here
+ else
+ entryList=QDir(source.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System);//possible wait time here
+ if(stopIt)
+ return;
+ int sizeEntryList=entryList.size();
+ emit newFolderListing(source.absoluteFilePath().toStdString());
+ if(mode!=Ultracopier::Move)
+ emit addToMkPath(source,destination,sizeEntryList);
+ for (int index=0;index<sizeEntryList;++index)
+ {
+ QFileInfo fileInfo=entryList.at(index);
+ if(stopIt)
+ return;
+ if(haveFilters)
+ {
+ if(reloadTheNewFilters)
+ {
+ QMutexLocker lock(&filtersMutex);
+ QCoreApplication::processEvents(QEventLoop::AllEvents);
+ reloadTheNewFilters=false;
+ this->include=this->include_send;
+ this->exclude=this->exclude_send;
+ }
+ std::string fileName=fileInfo.fileName().toStdString();
+ if(fileInfo.isDir() && !fileInfo.isSymLink())
+ {
+ bool excluded=false,included=(include.size()==0);
+ unsigned int filters_index=0;
+ while(filters_index<exclude.size())
+ {
+ if(exclude.at(filters_index).apply_on==ApplyOn_folder || exclude.at(filters_index).apply_on==ApplyOn_fileAndFolder)
+ {
+ if(std::regex_match(fileName,exclude.at(filters_index).regex))
+ {
+ excluded=true;
+ break;
+ }
+ }
+ filters_index++;
+ }
+ if(excluded)
+ {}
+ else
+ {
+ filters_index=0;
+ while(filters_index<include.size())
+ {
+ if(include.at(filters_index).apply_on==ApplyOn_folder || include.at(filters_index).apply_on==ApplyOn_fileAndFolder)
+ {
+ if(std::regex_match(fileName,include.at(filters_index).regex))
+ {
+ included=true;
+ break;
+ }
+ }
+ filters_index++;
+ }
+ if(!included)
+ {}
+ else
+ listFolder(fileInfo,destination.absoluteFilePath()+QString::fromStdString(text_slash)+fileInfo.fileName());
+ }
+ }
+ else
+ {
+ bool excluded=false,included=(include.size()==0);
+ unsigned int filters_index=0;
+ while(filters_index<exclude.size())
+ {
+ if(exclude.at(filters_index).apply_on==ApplyOn_file || exclude.at(filters_index).apply_on==ApplyOn_fileAndFolder)
+ {
+ if(std::regex_match(fileName,exclude.at(filters_index).regex))
+ {
+ excluded=true;
+ break;
+ }
+ }
+ filters_index++;
+ }
+ if(excluded)
+ {}
+ else
+ {
+ filters_index=0;
+ while(filters_index<include.size())
+ {
+ if(include.at(filters_index).apply_on==ApplyOn_file || include.at(filters_index).apply_on==ApplyOn_fileAndFolder)
+ {
+ if(std::regex_match(fileName,include.at(filters_index).regex))
+ {
+ included=true;
+ break;
+ }
+ }
+ filters_index++;
+ }
+ if(!included)
+ {}
+ else
+ #ifndef ULTRACOPIER_PLUGIN_RSYNC
+ emit fileTransfer(fileInfo,destination.absoluteFilePath()+QString::fromStdString(text_slash)+fileInfo.fileName(),mode);
+ #else
+ {
+ bool sendToTransfer=false;
+ if(!rsync)
+ sendToTransfer=true;
+ else if(!QFile::exists(destination.absoluteFilePath()+"/"+fileInfo.fileName()))
+ sendToTransfer=true;
+ else if(fileInfo.lastModified()!=QFileInfo(destination.absoluteFilePath()+"/"+fileInfo.fileName()).lastModified())
+ sendToTransfer=true;
+ if(sendToTransfer)
+ emit fileTransfer(fileInfo.absoluteFilePath(),destination.absoluteFilePath()+"/"+fileInfo.fileName(),mode);
+ }
+ #endif
+ }
+ }
+ }
+ else
+ {
+ if(fileInfo.isDir() && !fileInfo.isSymLink())//possible wait time here
+ //listFolder(source,destination,suffixPath+fileInfo.fileName()+QDir::separator());
+ listFolder(fileInfo,destination.absoluteFilePath()+QString::fromStdString(text_slash)+fileInfo.fileName());//put unix separator because it's transformed into that's under windows too
+ else
+ #ifndef ULTRACOPIER_PLUGIN_RSYNC
+ emit fileTransfer(fileInfo,destination.absoluteFilePath()+QString::fromStdString(text_slash)+fileInfo.fileName(),mode);
+ #else
+ {
+ bool sendToTransfer=false;
+ if(!rsync)
+ sendToTransfer=true;
+ else if(!QFile::exists(destination.absoluteFilePath()+"/"+fileInfo.fileName()))
+ sendToTransfer=true;
+ else if(fileInfo.lastModified()!=QFileInfo(destination.absoluteFilePath()+"/"+fileInfo.fileName()).lastModified())
+ sendToTransfer=true;
+ if(sendToTransfer)
+ emit fileTransfer(fileInfo.absoluteFilePath(),destination.absoluteFilePath()+"/"+fileInfo.fileName(),mode);
+ }
+ #endif
+ }
+ }
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(rsync)
+ {
+ //check the reverse path here
+ QFileInfoList entryListDestination;
+ if(copyListOrder)
+ entryListDestination=QDir(destination.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst|QDir::Name|QDir::IgnoreCase);//possible wait time here
+ else
+ entryListDestination=QDir(destination.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System);//possible wait time here
+ int sizeEntryListDestination=entryListDestination.size();
+ int index=0;
+ for (int indexDestination=0;indexDestination<sizeEntryListDestination;++indexDestination)
+ {
+ index=0;
+ while(index<sizeEntryList)
+ {
+ if(entryListDestination.at(indexDestination).fileName()==entryList.at(index).fileName())
+ break;
+ index++;
+ }
+ if(index==sizeEntryList)
+ {
+ //then not found, need be remove
+ emit addToRmForRsync(entryListDestination.at(indexDestination));
+ }
+ }
+ return;
+ }
+ #endif
+ if(mode==Ultracopier::Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+source.absoluteFilePath().toStdString()+", sizeEntryList: "+std::to_string(sizeEntryList));
+ emit addToMovePath(source,destination,sizeEntryList);
+ }
+}
+
+//set if need check if the destination exists
+void ScanFileOrFolder::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+{
+ this->checkDestinationExists=checkDestinationFolderExists;
+}
+
+void ScanFileOrFolder::setRenamingRules(const std::string &firstRenamingRule, const std::string &otherRenamingRule)
+{
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+}
+
+void ScanFileOrFolder::setMoveTheWholeFolder(const bool &moveTheWholeFolder)
+{
+ this->moveTheWholeFolder=moveTheWholeFolder;
+}
+
+void ScanFileOrFolder::setCopyListOrder(const bool &order)
+{
+ this->copyListOrder=order;
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+/// \brief set rsync
+void ScanFileOrFolder::setRsync(const bool rsync)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set rsync: "+std::to_string(rsync));
+ this->rsync=rsync;
+}
+#endif
+
+void ScanFileOrFolder::set_updateMount()
+{
+ driveManagement.tryUpdate();
+}
diff --git a/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.h b/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.h
new file mode 100644
index 0000000..0c625e9
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.h
@@ -0,0 +1,108 @@
+/** \file scanFileOrFolder.h
+\brief Thread changed to list recursively the folder
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QThread>
+#include <QFileInfo>
+#include <QDir>
+#include <QSemaphore>
+#include <QEventLoop>
+#include <QCoreApplication>
+#include <QMutexLocker>
+#include <regex>
+#include <string>
+#include <vector>
+
+#include "Environment.h"
+#include "DriveManagement.h"
+
+#ifndef SCANFILEORFOLDER_H
+#define SCANFILEORFOLDER_H
+
+/// \brief Thread changed to list recursively the folder
+class ScanFileOrFolder : public QThread
+{
+ Q_OBJECT
+public:
+ explicit ScanFileOrFolder(const Ultracopier::CopyMode &mode);
+ ~ScanFileOrFolder();
+ /// \brief to the a folder listing
+ void stop();
+ /// \brief to get if is finished
+ bool isFinished() const;
+ /// \brief set action if Folder are same or exists
+ void setFolderExistsAction(const FolderExistsAction &action, const std::string &newName="");
+ /// \brief set action if error
+ void setFolderErrorAction(const FileErrorAction &action);
+ /// \brief set if need check if the destination exists
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ void setRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule);
+ void setMoveTheWholeFolder(const bool &moveTheWholeFolder);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ void setRsync(const bool rsync);
+ #endif
+signals:
+ void fileTransfer(const QFileInfo &source,const QFileInfo &destination,const Ultracopier::CopyMode &mode) const;
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+ void folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame) const;
+ void errorOnFolder(const QFileInfo &fileInfo,const std::string &errorString,const ErrorType &errorType=ErrorType_FolderWithRety) const;
+ void finishedTheListing() const;
+
+ void newFolderListing(const std::string &path) const;
+ void addToMkPath(const QFileInfo& source,const QFileInfo& destination, const int& inode) const;
+ void addToMovePath(const QFileInfo& source,const QFileInfo& destination, const int& inodeToRemove) const;
+ void addToRealMove(const QFileInfo& source,const QFileInfo& destination) const;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ void addToRmForRsync(const QFileInfo& destination) const;
+ #endif
+public slots:
+ void addToList(const std::vector<std::string>& sources,const std::string& destination);
+ void setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude);
+ void setCopyListOrder(const bool &order);
+ void set_updateMount();
+protected:
+ void run();
+private:
+ DriveManagement driveManagement;
+ bool moveTheWholeFolder;
+ std::vector<std::string> sources;
+ std::string destination;
+ volatile bool stopIt;
+ void listFolder(QFileInfo source, QFileInfo destination);
+ bool isBlackListed(const QFileInfo &destination);
+ QFileInfo resolvDestination(const QFileInfo &destination);
+ volatile bool stopped;
+ QSemaphore waitOneAction;
+ FolderExistsAction folderExistsAction;
+ FileErrorAction fileErrorAction;
+ volatile bool checkDestinationExists;
+ std::string newName;
+ bool copyListOrder;
+ std::regex folder_isolation;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ bool rsync;
+ #endif
+ Ultracopier::CopyMode mode;
+ std::vector<Filters_rules> include,exclude;
+ std::vector<Filters_rules> include_send,exclude_send;
+ bool reloadTheNewFilters;
+ bool haveFilters;
+ QMutex filtersMutex;
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+ std::vector<std::string> blackList;
+ /** Parse the multiple wildcard source, it allow resolv multiple wildcard with Qt into their path
+ * The string: /toto/f*a/yy*a/toto.mp3
+ * Will give: /toto/f1a/yy*a/toto.mp3, /toto/f2a/yy*a/toto.mp3
+ * Will give: /toto/f2a/yy1a/toto.mp3, /toto/f2a/yy2a/toto.mp3
+ */
+ std::vector<std::string> parseWildcardSources(const std::vector<std::string> &sources) const;
+
+ static std::string text_slash;
+ static std::string text_antislash;
+ static std::string text_dot;
+};
+
+#endif // SCANFILEORFOLDER_H
diff --git a/plugins/CopyEngine/Ultracopier/StructEnumDefinition.h b/plugins/CopyEngine/Ultracopier/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins/CopyEngine/Ultracopier/StructEnumDefinition_CopyEngine.h b/plugins/CopyEngine/Ultracopier/StructEnumDefinition_CopyEngine.h
new file mode 100644
index 0000000..036803c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/StructEnumDefinition_CopyEngine.h
@@ -0,0 +1,124 @@
+/** \file StructEnumDefinition_CopyEngine.h
+\brief Define the structure and enumeration used in the copy engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <string>
+#include <regex>
+
+#ifndef STRUCTDEF_COPYENGINE_H
+#define STRUCTDEF_COPYENGINE_H
+
+/// \brief Define action if file exists
+enum FileExistsAction
+{
+ FileExists_NotSet=0,
+ FileExists_Cancel=1,
+ FileExists_Skip=2,
+ FileExists_Overwrite=3,
+ FileExists_OverwriteIfNotSame=4,
+ FileExists_OverwriteIfNewer=5,
+ FileExists_OverwriteIfOlder=6,
+ FileExists_Rename=7
+};
+
+/// \brief Define action if file error
+enum FileErrorAction
+{
+ FileError_NotSet=1,
+ FileError_Cancel=2,
+ FileError_Skip=3,
+ FileError_Retry=4,
+ FileError_PutToEndOfTheList=5
+};
+
+enum TransferAlgorithm
+{
+ TransferAlgorithm_Automatic=0,
+ TransferAlgorithm_Sequential=1,
+ TransferAlgorithm_Parallel=2
+};
+
+/// \brief to have the transfer status
+enum TransferStat
+{
+ TransferStat_Idle=0,
+ TransferStat_PreOperation=1,
+ TransferStat_WaitForTheTransfer=2,
+ TransferStat_Transfer=3,
+ TransferStat_Checksum=4,
+ TransferStat_PostTransfer=5,
+ TransferStat_PostOperation=6
+};
+
+/// \brief Define overwrite mode
+/*enum OverwriteMode
+{
+ OverwriteMode_None,
+ OverwriteMode_Overwrite,
+ OverwriteMode_OverwriteIfNewer,
+ OverwriteMode_OverwriteIfNotSameModificationDate
+};*/
+
+/// \brief Define action if file exists
+enum FolderExistsAction
+{
+ FolderExists_NotSet=0,
+ FolderExists_Cancel=1,
+ FolderExists_Merge=2,
+ FolderExists_Skip=3,
+ FolderExists_Rename=4
+};
+
+enum ErrorType
+{
+ ErrorType_Normal=0,
+ ErrorType_Folder=1,
+ ErrorType_FolderWithRety=2,
+ ErrorType_Rights=3
+};
+
+enum SearchType
+{
+ SearchType_rawText=0,
+ SearchType_simpleRegex=1,
+ SearchType_perlRegex=2
+};
+
+enum ApplyOn
+{
+ ApplyOn_file=0,
+ ApplyOn_fileAndFolder=1,
+ ApplyOn_folder=2
+};
+
+/** to store into different way the filter rules to be exported */
+struct Filters_rules
+{
+ std::string search_text;
+ SearchType search_type;
+ ApplyOn apply_on;
+ bool need_match_all;
+ std::regex regex;
+};
+
+/// \brief get action type
+enum ActionType
+{
+ ActionType_MkPath=1,
+ ActionType_MovePath=2,
+ ActionType_RealMove=3
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ ,
+ ActionType_RmSync=4
+ #endif
+};
+
+struct Diskspace
+{
+ std::string drive;
+ uint64_t requiredSpace;
+ uint64_t freeSpace;
+};
+
+#endif // STRUCTDEF_COPYENGINE_H
diff --git a/plugins/CopyEngine/Ultracopier/TransferThread.cpp b/plugins/CopyEngine/Ultracopier/TransferThread.cpp
new file mode 100644
index 0000000..786a8e9
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/TransferThread.cpp
@@ -0,0 +1,2091 @@
+//presume bug linked as multple paralelle inode to resume after "overwrite"
+//then do overwrite node function to not re-set the file name
+
+#include "TransferThread.h"
+#ifdef Q_OS_WIN32
+#include <windows.h>
+#endif
+
+#ifdef Q_OS_WIN32
+ #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+ #endif
+#endif
+
+#ifdef Q_OS_WIN32
+#define CURRENTSEPARATOR "\\"
+#else
+#define CURRENTSEPARATOR "/"
+#endif
+
+#include "../../../cpp11addition.h"
+
+TransferThread::TransferThread() :
+ haveStartTime (false),
+ transfer_stat (TransferStat_Idle),
+ doRightTransfer (false),
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ rsync (false),
+ #endif
+ stopIt (false),
+ fileExistsAction (FileExists_NotSet),
+ alwaysDoFileExistsAction (FileExists_NotSet),
+ needSkip (false),
+ needRemove (false),
+ deletePartiallyTransferredFiles (true),
+ writeError (false),
+ readError (false),
+ renameTheOriginalDestination (false)
+{
+ start();
+ moveToThread(this);
+ readThread.setWriteThread(&writeThread);
+ source.setCaching(false);
+ destination.setCaching(false);
+ renameRegex=std::regex("^(.*)(\\.[a-z0-9]+)$");
+ #ifdef Q_OS_WIN32
+ #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ regRead=std::regex("^[a-z]:");
+ #endif
+ #endif
+
+ minTime=QDateTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+}
+
+TransferThread::~TransferThread()
+{
+ stopIt=true;
+ readThread.exit();
+ readThread.wait();
+ writeThread.exit();
+ writeThread.wait();
+ exit();
+ //else cash without this disconnect
+ //disconnect(&readThread);
+ //disconnect(&writeThread);
+ wait();
+}
+
+void TransferThread::run()
+{
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+QStringLiteral("] start: ")+QString::number((qint64)QThread::currentThreadId())));
+ transfer_stat = TransferStat_Idle;
+ stopIt = false;
+ fileExistsAction = FileExists_NotSet;
+ alwaysDoFileExistsAction= FileExists_NotSet;
+ //the error push
+ connect(&readThread,&ReadThread::error, this, &TransferThread::getReadError, Qt::QueuedConnection);
+ connect(&writeThread,&WriteThread::error, this, &TransferThread::getWriteError, Qt::QueuedConnection);
+ //the thread change operation
+ connect(this,&TransferThread::internalStartPreOperation, this, &TransferThread::preOperation, Qt::QueuedConnection);
+ connect(this,&TransferThread::internalStartPostOperation, this, &TransferThread::postOperation, Qt::QueuedConnection);
+ //the state change operation
+ connect(&readThread,&ReadThread::opened, this, &TransferThread::readIsReady, Qt::QueuedConnection);
+ connect(&writeThread,&WriteThread::opened, this, &TransferThread::writeIsReady, Qt::QueuedConnection);
+ connect(&readThread,&ReadThread::readIsStopped, this, &TransferThread::readIsStopped, Qt::QueuedConnection);
+ connect(&writeThread,&WriteThread::writeIsStopped, this, &TransferThread::writeIsStopped, Qt::QueuedConnection);
+ connect(&readThread,&ReadThread::readIsStopped, &writeThread, &WriteThread::endIsDetected, Qt::QueuedConnection);
+ connect(&readThread,&ReadThread::closed, this, &TransferThread::readIsClosed, Qt::QueuedConnection);
+ connect(&writeThread,&WriteThread::closed, this, &TransferThread::writeIsClosed, Qt::QueuedConnection);
+ connect(&writeThread,&WriteThread::reopened, this, &TransferThread::writeThreadIsReopened, Qt::QueuedConnection);
+ connect(&readThread,&ReadThread::checksumFinish, this, &TransferThread::readChecksumFinish, Qt::QueuedConnection);
+ connect(&writeThread,&WriteThread::checksumFinish, this, &TransferThread::writeChecksumFinish, Qt::QueuedConnection);
+ //error management
+ connect(&readThread,&ReadThread::isSeekToZeroAndWait, this, &TransferThread::readThreadIsSeekToZeroAndWait, Qt::QueuedConnection);
+ connect(&readThread,&ReadThread::resumeAfterErrorByRestartAtTheLastPosition,this, &TransferThread::readThreadResumeAfterError, Qt::QueuedConnection);
+ connect(&readThread,&ReadThread::resumeAfterErrorByRestartAll,&writeThread, &WriteThread::flushAndSeekToZero, Qt::QueuedConnection);
+ connect(&writeThread,&WriteThread::flushedAndSeekedToZero, this, &TransferThread::readThreadResumeAfterError, Qt::QueuedConnection);
+ connect(this,&TransferThread::internalTryStartTheTransfer, this, &TransferThread::internalStartTheTransfer, Qt::QueuedConnection);
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(&readThread,&ReadThread::debugInformation, this, &TransferThread::debugInformation, Qt::QueuedConnection);
+ connect(&writeThread,&WriteThread::debugInformation, this, &TransferThread::debugInformation, Qt::QueuedConnection);
+ connect(&driveManagement,&DriveManagement::debugInformation,this, &TransferThread::debugInformation, Qt::QueuedConnection);
+ #endif
+
+ exec();
+}
+
+TransferStat TransferThread::getStat() const
+{
+ return transfer_stat;
+}
+
+void TransferThread::startTheTransfer()
+{
+ emit internalTryStartTheTransfer();
+}
+
+void TransferThread::internalStartTheTransfer()
+{
+ if(transfer_stat==TransferStat_Idle)
+ {
+ if(mode!=Ultracopier::Move)
+ {
+ /// \bug can pass here because in case of direct move on same media, it return to idle stat directly
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at idle"));
+ }
+ return;
+ }
+ if(transfer_stat==TransferStat_PostOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at PostOperation"));
+ return;
+ }
+ if(transfer_stat==TransferStat_Transfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at Transfer"));
+ return;
+ }
+ if(canStartTransfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] canStartTransfer is already set to true"));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] check how start the transfer"));
+ canStartTransfer=true;
+ if(readIsReadyVariable && writeIsReadyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start directly the transfer"));
+ ifCanStartTransfer();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start the transfer as delayed"));
+}
+
+bool TransferThread::setFiles(const QFileInfo& source, const int64_t &size, const QFileInfo& destination, const Ultracopier::CopyMode &mode)
+{
+ if(transfer_stat!=TransferStat_Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ return false;
+ }
+ //to prevent multiple file alocation into ListThread::doNewActions_inode_manipulation()
+ transfer_stat = TransferStat_PreOperation;
+ //emit pushStat(stat,transferId);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start, source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ this->source = source;
+ this->destination = destination;
+ this->mode = mode;
+ this->size = size;
+ stopIt = false;
+ fileExistsAction = FileExists_NotSet;
+ canStartTransfer = false;
+ sended_state_preOperationStopped= false;
+ canBeMovedDirectlyVariable = false;
+ canBeCopiedDirectlyVariable = false;
+ fileContentError = false;
+ real_doChecksum = false;
+ writeError = false;
+ writeError_source_seeked = false;
+ writeError_destination_reopened = false;
+ readError = false;
+ fileContentError = false;
+ resetExtraVariable();
+ emit internalStartPreOperation();
+ return true;
+}
+
+void TransferThread::setFileExistsAction(const FileExistsAction &action)
+{
+ if(transfer_stat!=TransferStat_PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+source.absoluteFilePath().toStdString()+(", destination: ")+destination.absoluteFilePath().toStdString());
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] action: ")+std::to_string(action));
+ if(action!=FileExists_Rename)
+ fileExistsAction = action;
+ else
+ {
+ //always rename pass here
+ fileExistsAction = action;
+ alwaysDoFileExistsAction=action;
+ }
+ if(action==FileExists_Skip)
+ {
+ skip();
+ return;
+ }
+ resetExtraVariable();
+ emit internalStartPreOperation();
+}
+
+void TransferThread::setFileRename(const std::string &nameForRename)
+{
+ if(transfer_stat!=TransferStat_PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+source.absoluteFilePath().toStdString()+(", destination: ")+destination.absoluteFilePath().toStdString());
+ return;
+ }
+ if(QString::fromStdString(nameForRename).contains(QRegularExpression(QStringLiteral("[/\\\\\\*]"))))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't use this kind of name, internal error"));
+ emit errorOnFile(destination,tr("Try rename with using special characters").toStdString());
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] nameForRename: "+nameForRename);
+ if(!renameTheOriginalDestination)
+ destination.setFile(destination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(nameForRename));
+ else
+ {
+ QString tempDestination=destination.absoluteFilePath();
+ QFile destinationFile(tempDestination);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] "+QStringLiteral("rename %1: to: %2").arg(destination.absoluteFilePath()).arg(destination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(nameForRename)).toStdString());
+ if(!destinationFile.rename(destination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(nameForRename)))
+ {
+ if(!destinationFile.exists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("source not exists %1: destination: %2, error: %3").arg(destinationFile.fileName()).arg(destinationFile.fileName()).arg(destinationFile.errorString()).toStdString());
+ emit errorOnFile(destinationFile,tr("File not found").toStdString());
+ return;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("unable to do real move %1: %2, error: %3").arg(destinationFile.fileName()).arg(destinationFile.fileName()).arg(destinationFile.errorString()).toStdString());
+ emit errorOnFile(destinationFile,destinationFile.errorString().toStdString());
+ return;
+ }
+ if(source.absoluteFilePath()==destination.absoluteFilePath())
+ source.setFile(destination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(nameForRename));
+ destination.setFile(tempDestination);
+ destination.refresh();
+ }
+ fileExistsAction = FileExists_NotSet;
+ resetExtraVariable();
+ emit internalStartPreOperation();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] destination is: "+destination.absoluteFilePath().toStdString());
+}
+
+void TransferThread::setAlwaysFileExistsAction(const FileExistsAction &action)
+{
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+QStringLiteral("] action to do always: ")+QString::number(action)));
+ alwaysDoFileExistsAction=action;
+}
+
+void TransferThread::resetExtraVariable()
+{
+ sended_state_preOperationStopped=false;
+ sended_state_readStopped = false;
+ sended_state_writeStopped = false;
+ writeError = false;
+ readError = false;
+ readIsReadyVariable = false;
+ writeIsReadyVariable = false;
+ readIsFinishVariable = false;
+ writeIsFinishVariable = false;
+ readIsClosedVariable = false;
+ writeIsClosedVariable = false;
+ needRemove = false;
+ needSkip = false;
+ retry = false;
+ readIsOpenVariable = false;
+ writeIsOpenVariable = false;
+ readIsOpeningVariable = false;
+ writeIsOpeningVariable = false;
+}
+
+void TransferThread::preOperation()
+{
+ if(transfer_stat!=TransferStat_PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ return;
+ }
+ haveStartTime=true;
+ startTransferTime.restart();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start: source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ needRemove=false;
+ if(isSame())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] is same "+source.absoluteFilePath().toStdString()+" than "+destination.absoluteFilePath().toStdString());
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after is same");
+ /*Why this code?
+ if(readError)
+ {
+ readError=false;
+ return;
+ }*/
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before destination exists");
+ if(destinationExists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] destination exists: "+destination.absoluteFilePath().toStdString());
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after destination exists");
+ /*Why this code?
+ if(readError)
+ {
+ readError=false;
+ return;
+ }*/
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before keep date");
+ #ifdef Q_OS_WIN32
+ doTheDateTransfer=!source.isSymLink();
+ #else
+ doTheDateTransfer=true;
+ #endif
+ if(doTheDateTransfer)
+ {
+ if(source.lastModified()<minTime)
+ {
+ if(/*true when the destination have been remove but not the symlink:*/source.isSymLink())
+ doTheDateTransfer=false;
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the sources is older to copy the time: "+source.absoluteFilePath().toStdString()+": "+minTime.toString(QStringLiteral("dd.MM.yyyy hh:mm:ss.zzz")).toStdString()+">="+source.lastModified().toString(QStringLiteral("dd.MM.yyyy hh:mm:ss.zzz")).toStdString());
+ doTheDateTransfer=false;
+ if(keepDate)
+ {
+ emit errorOnFile(source,tr("Wrong modification date or unable to get it, you can disable time transfer to do it").toStdString());
+ return;
+ }
+ }
+ }
+ else
+ {
+ doTheDateTransfer=readFileDateTime(source);
+ #ifdef Q_OS_MAC
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] read the source time: "+std::to_string(butime.modtime));
+ #endif
+ if(!doTheDateTransfer)
+ {
+ //will have the real error at source open
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unable to read the source time: "+source.absoluteFilePath().toStdString());
+ if(keepDate)
+ {
+ emit errorOnFile(source,tr("Wrong modification date or unable to get it, you can disable time transfer to do it").toStdString());
+ return;
+ }
+ }
+ }
+ }
+ if(canBeMovedDirectly())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("need moved directly: %1 to %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
+ canBeMovedDirectlyVariable=true;
+ readThread.fakeOpen();
+ writeThread.fakeOpen();
+ return;
+ }
+ if(canBeCopiedDirectly())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("need copied directly: %1 to %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
+ canBeCopiedDirectlyVariable=true;
+ readThread.fakeOpen();
+ writeThread.fakeOpen();
+ return;
+ }
+ tryOpen();
+}
+
+void TransferThread::tryOpen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source and destination: "+source.absoluteFilePath().toStdString()+" and "+destination.absoluteFilePath().toStdString());
+ TransferAlgorithm transferAlgorithm=this->transferAlgorithm;
+ if(transferAlgorithm==TransferAlgorithm_Automatic)
+ {
+ #ifdef Q_OS_LINUX
+ if(driveManagement.isSameDrive(destination.absoluteFilePath().toStdString(),source.absoluteFilePath().toStdString()))
+ {
+ const QByteArray &type=driveManagement.getDriveType(driveManagement.getDrive(source.absoluteFilePath().toStdString()));
+ if(type=="nfs" || type=="smb")
+ transferAlgorithm=TransferAlgorithm_Parallel;
+ else
+ transferAlgorithm=TransferAlgorithm_Sequential;
+ }
+ else
+ #endif
+ transferAlgorithm=TransferAlgorithm_Parallel;
+ }
+ if(!readIsOpenVariable)
+ {
+ if(!readIsOpeningVariable)
+ {
+ readError=false;
+ readThread.open(source.absoluteFilePath(),mode);
+ readIsOpeningVariable=true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] readIsOpeningVariable is true when try open");
+ emit errorOnFile(source,tr("Internal error: Already opening").toStdString());
+ readError=true;
+ return;
+ }
+ }
+ if(!writeIsOpenVariable)
+ {
+ if(!writeIsOpeningVariable)
+ {
+ if(transferAlgorithm==TransferAlgorithm_Sequential)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Sequential");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Parallel");
+ writeError=false;
+ if(transferAlgorithm==TransferAlgorithm_Sequential)
+ writeThread.open(destination.absoluteFilePath(),size,osBuffer && (!osBufferLimited || (osBufferLimited && size<osBufferLimit)),sequentialBuffer,true);
+ else
+ writeThread.open(destination.absoluteFilePath(),size,osBuffer && (!osBufferLimited || (osBufferLimited && size<osBufferLimit)),parallelBuffer,false);
+ writeIsOpeningVariable=true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+"writeIsOpeningVariable is true when try open");
+ emit errorOnFile(destination,tr("Internal error: Already opening").toStdString());
+ writeError=true;
+ return;
+ }
+ }
+}
+
+bool TransferThread::isSame()
+{
+ //check if source and destination is not the same
+ //source.absoluteFilePath()==destination.absoluteFilePath() not work is source don't exists
+ if(source.absoluteFilePath()==destination.absoluteFilePath())
+ {
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!source.exists())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source: "+source.absoluteFilePath().toStdString()+" not exists");
+ if(!source.isSymLink())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source: "+source.absoluteFilePath().toStdString()+" isSymLink");
+ if(!destination.isSymLink())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source: "+destination.absoluteFilePath().toStdString()+" isSymLink");
+ #endif
+ if(fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_Skip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] is same but skip");
+ transfer_stat=TransferStat_Idle;
+ emit postOperationStopped();
+ //quit
+ return true;
+ }
+ if(checkAlwaysRename())
+ return false;
+ emit fileAlreadyExists(source,destination,true);
+ return true;
+ }
+ return false;
+}
+
+bool TransferThread::destinationExists()
+{
+ //check if destination exists
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("overwrite: %1, alwaysDoFileExistsAction: %2, readError: %3, writeError: %4")
+ .arg(fileExistsAction)
+ .arg(alwaysDoFileExistsAction)
+ .arg(readError)
+ .arg(writeError)
+ .toStdString()
+ );
+ if(alwaysDoFileExistsAction==FileExists_Overwrite || readError || writeError
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ || rsync
+ #endif
+ )
+ return false;
+ bool destinationExists;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] time to first FS access");
+ destination.refresh();
+ destinationExists=destination.exists();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] finish first FS access");
+ if(destinationExists)
+ {
+ if(fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_Skip)
+ {
+ transfer_stat=TransferStat_Idle;
+ emit postOperationStopped();
+ //quit
+ return true;
+ }
+ if(checkAlwaysRename())
+ return false;
+ if(source.exists())
+ {
+ if(fileExistsAction==FileExists_OverwriteIfNewer || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNewer))
+ {
+ if(destination.lastModified()<source.lastModified())
+ return false;
+ else
+ {
+ transfer_stat=TransferStat_Idle;
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ if(fileExistsAction==FileExists_OverwriteIfOlder || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfOlder))
+ {
+ if(destination.lastModified()>source.lastModified())
+ return false;
+ else
+ {
+ transfer_stat=TransferStat_Idle;
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ if(fileExistsAction==FileExists_OverwriteIfNotSame || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNotSame))
+ {
+ if(destination.lastModified()!=source.lastModified() || destination.size()!=source.size())
+ return false;
+ else
+ {
+ transfer_stat=TransferStat_Idle;
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ }
+ else
+ {
+ if(fileExistsAction!=FileExists_NotSet)
+ {
+ transfer_stat=TransferStat_Idle;
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ if(fileExistsAction==FileExists_NotSet)
+ {
+ emit fileAlreadyExists(source,destination,false);
+ return true;
+ }
+ }
+ return false;
+}
+
+std::string TransferThread::resolvedName(const QFileInfo &inode)
+{
+ QString fileName=inode.fileName();
+ if(fileName.isEmpty())
+ {
+ QDir absoluteDir=inode.absoluteDir();
+ fileName=absoluteDir.dirName();
+ if(fileName.isEmpty())
+ {
+ fileName=absoluteDir.cdUp();
+ fileName=absoluteDir.dirName();
+ }
+ }
+ #ifdef Q_OS_WIN32
+ if(fileName.isEmpty())
+ {
+ fileName=inode.absolutePath();
+ fileName.replace(QRegularExpression(QStringLiteral("^([a-zA-Z]+):.*$")),QStringLiteral("\\1"));
+ if(inode.absolutePath().contains(QRegularExpression(QStringLiteral("^[a-zA-Z]+:[/\\\\]?$"))))
+ fileName=tr("Drive %1").arg(fileName);
+ else
+ fileName=tr("Unknown folder");
+ }
+ #else
+ if(fileName.isEmpty())
+ fileName=tr("root");
+ #endif
+ return fileName.toStdString();
+}
+
+std::string TransferThread::getSourcePath() const
+{
+ return source.absoluteFilePath().toStdString();
+}
+
+std::string TransferThread::getDestinationPath() const
+{
+ return destination.absoluteFilePath().toStdString();
+}
+
+QFileInfo TransferThread::getSourceInode() const
+{
+ return source;
+}
+
+QFileInfo TransferThread::getDestinationInode() const
+{
+ return destination;
+}
+
+Ultracopier::CopyMode TransferThread::getMode() const
+{
+ return mode;
+}
+
+//return true if has been renamed
+bool TransferThread::checkAlwaysRename()
+{
+ if(alwaysDoFileExistsAction==FileExists_Rename)
+ {
+ QFileInfo newDestination=destination;
+ std::string fileName=resolvedName(newDestination);
+ std::string suffix;
+ std::string newFileName;
+ //resolv the suffix
+ if(std::regex_match(fileName,renameRegex))
+ {
+ suffix=fileName;
+ suffix=std::regex_replace(suffix,renameRegex,"$2");
+ fileName=std::regex_replace(fileName,renameRegex,"$1");
+ }
+ //resolv the new name
+ int num=1;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ newFileName=tr("%1 - copy").arg(QString::fromStdString(fileName)).toStdString();
+ else
+ {
+ newFileName=firstRenamingRule;
+ stringreplaceAll(newFileName,"%name%",fileName);
+ }
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ newFileName=tr("%1 - copy (%2)").arg(QString::fromStdString(fileName)).arg(num).toStdString();
+ else
+ {
+ newFileName=otherRenamingRule;
+ stringreplaceAll(newFileName,"%name%",fileName);
+ stringreplaceAll(newFileName,"%number%",std::to_string(num));
+ }
+ }
+ newDestination.setFile(newDestination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(newFileName+suffix));
+ num++;
+ }
+ while(newDestination.exists());
+ if(!renameTheOriginalDestination)
+ destination=newDestination;
+ else
+ {
+ QFile destinationFile(destination.absoluteFilePath());
+ if(!destinationFile.rename(newDestination.absoluteFilePath()))
+ {
+ if(!destinationFile.exists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("source not exists %1: destination: %2, error: %3").arg(destinationFile.fileName()).arg(destinationFile.fileName()).arg(destinationFile.errorString()).toStdString());
+ emit errorOnFile(destinationFile,tr("File not found").toStdString());
+ readError=true;
+ return true;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("unable to do real move %1: %2, error: %3").arg(destinationFile.fileName()).arg(destinationFile.fileName()).arg(destinationFile.errorString()).toStdString());
+ readError=true;
+ emit errorOnFile(destinationFile,destinationFile.errorString().toStdString());
+ return true;
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+void TransferThread::tryMoveDirectly()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("need moved directly: %1 to %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
+
+ sended_state_readStopped = false;
+ sended_state_writeStopped = false;
+ writeError = false;
+ readError = false;
+ readIsFinishVariable = false;
+ writeIsFinishVariable = false;
+ readIsClosedVariable = false;
+ writeIsClosedVariable = false;
+ //move if on same mount point
+ QFile sourceFile(source.absoluteFilePath());
+ QFile destinationFile(destination.absoluteFilePath());
+ #ifndef Q_OS_WIN32
+ if(destinationFile.exists() || destination.isSymLink())
+ {
+ if(!sourceFile.exists() && !source.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+destinationFile.fileName().toStdString()+", source not exists");
+ readError=true;
+ emit errorOnFile(destination,tr("The source file doesn't exist").toStdString());
+ return;
+ }
+ else if(!destinationFile.remove())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+destinationFile.fileName().toStdString()+", error: "+destinationFile.errorString().toStdString());
+ readError=true;
+ emit errorOnFile(destination,destinationFile.errorString().toStdString());
+ return;
+ }
+ }
+ #endif
+ QDir dir(destination.absolutePath());
+ {
+ mkpathTransfer->acquire();
+ if(!dir.exists())
+ dir.mkpath(destination.absolutePath());
+ mkpathTransfer->release();
+ }
+ #ifdef Q_OS_WIN32
+ //if(!sourceFile.copy(destinationFile.fileName()))
+ if(MoveFileEx(
+ reinterpret_cast<const wchar_t*>(sourceFile.fileName().utf16()),
+ reinterpret_cast<const wchar_t*>(destinationFile.fileName().utf16()),
+ MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING
+ )==0)
+ #else
+ if(!sourceFile.rename(destinationFile.fileName()))
+ #endif
+ {
+ readError=true;
+ if(!sourceFile.exists() && !source.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("source not exists %1: destination: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).toStdString());
+ emit errorOnFile(sourceFile,tr("File not found").toStdString());
+ return;
+ }
+ else if(!dir.exists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("destination folder not exists %1: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).toStdString());
+ emit errorOnFile(destination.absolutePath(),tr("Unable to do the folder").toStdString());
+ return;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("unable to do real move %1: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).toStdString());
+ emit errorOnFile(sourceFile,sourceFile.errorString().toStdString());
+ return;
+ }
+ readThread.fakeReadIsStarted();
+ writeThread.fakeWriteIsStarted();
+ readThread.fakeReadIsStopped();
+ writeThread.fakeWriteIsStopped();
+}
+
+void TransferThread::tryCopyDirectly()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("need copied directly: %1 to %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
+
+ sended_state_readStopped = false;
+ sended_state_writeStopped = false;
+ writeError = false;
+ readError = false;
+ readIsFinishVariable = false;
+ writeIsFinishVariable = false;
+ readIsClosedVariable = false;
+ writeIsClosedVariable = false;
+ //move if on same mount point
+ QFile sourceFile(source.absoluteFilePath());
+ QFile destinationFile(destination.absoluteFilePath());
+ #ifndef Q_OS_WIN32
+ if(destinationFile.exists() || destination.isSymLink())
+ {
+ if(!sourceFile.exists() && !source.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+destinationFile.fileName().toStdString()+", source not exists");
+ readError=true;
+ emit errorOnFile(destination,tr("The source doesn't exist").toStdString());
+ return;
+ }
+ else if(!destinationFile.remove())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+destinationFile.fileName().toStdString()+", error: "+destinationFile.errorString().toStdString());
+ readError=true;
+ emit errorOnFile(destination,destinationFile.errorString().toStdString());
+ return;
+ }
+ }
+ #endif
+ QDir dir(destination.absolutePath());
+ {
+ mkpathTransfer->acquire();
+ if(!dir.exists())
+ dir.mkpath(destination.absolutePath());
+ mkpathTransfer->release();
+ }
+ /** on windows, symLink is normal file, can be copied
+ * on unix not, should be created **/
+ #ifdef Q_OS_WIN32
+ //if(!sourceFile.copy(destinationFile.fileName()))
+ if(CopyFileEx(
+ reinterpret_cast<const wchar_t*>(sourceFile.fileName().utf16()),
+ reinterpret_cast<const wchar_t*>(destinationFile.fileName().utf16()),
+ NULL,
+ NULL,
+ FALSE,
+ 0
+ )==0)
+ #else
+ if(!QFile::link(sourceFile.symLinkTarget(),destinationFile.fileName()))
+ #endif
+ {
+ readError=true;
+ if(!sourceFile.exists() && !source.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("source not exists %1 -> %4: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).arg(sourceFile.symLinkTarget()).toStdString());
+ emit errorOnFile(sourceFile,tr("The source file doesn't exist").toStdString());
+ return;
+ }
+ else if(destinationFile.exists() || destination.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("destination already exists %1 -> %4: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).arg(sourceFile.symLinkTarget()).toStdString());
+ emit errorOnFile(sourceFile,tr("Another file exists at same place").toStdString());
+ return;
+ }
+ else if(!dir.exists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("destination folder not exists %1 -> %4: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).arg(sourceFile.symLinkTarget()).toStdString());
+ emit errorOnFile(sourceFile,tr("Unable to do the folder").toStdString());
+ return;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("unable to do sym link copy %1 -> %4: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).arg(sourceFile.symLinkTarget()).toStdString());
+ emit errorOnFile(sourceFile,sourceFile.errorString().toStdString());
+ return;
+ }
+ readThread.fakeReadIsStarted();
+ writeThread.fakeWriteIsStarted();
+ readThread.fakeReadIsStopped();
+ writeThread.fakeWriteIsStopped();
+}
+
+bool TransferThread::canBeMovedDirectly() const
+{
+ if(mode!=Ultracopier::Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] mode!=Ultracopier::Move");
+ return false;
+ }
+ return source.isSymLink() || driveManagement.isSameDrive(destination.absoluteFilePath().toStdString(),source.absoluteFilePath().toStdString());
+}
+
+bool TransferThread::canBeCopiedDirectly() const
+{
+ return source.isSymLink();
+}
+
+void TransferThread::readIsReady()
+{
+ if(readIsReadyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ readIsReadyVariable=true;
+ readIsOpenVariable=true;
+ readIsClosedVariable=false;
+ readIsOpeningVariable=false;
+ ifCanStartTransfer();
+}
+
+void TransferThread::ifCanStartTransfer()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readIsReadyVariable: "+std::to_string(readIsReadyVariable)+", writeIsReadyVariable: "+std::to_string(writeIsReadyVariable));
+ if(readIsReadyVariable && writeIsReadyVariable)
+ {
+ transfer_stat=TransferStat_WaitForTheTransfer;
+ sended_state_readStopped = false;
+ sended_state_writeStopped = false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stat=WaitForTheTransfer");
+ if(!sended_state_preOperationStopped)
+ {
+ sended_state_preOperationStopped=true;
+ emit preOperationStopped();
+ }
+ if(canStartTransfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stat=Transfer, "+QStringLiteral("canBeMovedDirectlyVariable: %1, canBeCopiedDirectlyVariable: %2").arg(canBeMovedDirectlyVariable).arg(canBeCopiedDirectlyVariable).toStdString());
+ transfer_stat=TransferStat_Transfer;
+ if(canBeMovedDirectlyVariable)
+ tryMoveDirectly();
+ else if(canBeCopiedDirectlyVariable)
+ tryCopyDirectly();
+ else
+ {
+ needRemove=deletePartiallyTransferredFiles;
+ readThread.startRead();
+ }
+ emit pushStat(transfer_stat,transferId);
+ }
+ //else
+ //emit pushStat(stat,transferId);
+ }
+}
+
+void TransferThread::writeIsReady()
+{
+ if(writeIsReadyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ writeIsReadyVariable=true;
+ writeIsOpenVariable=true;
+ writeIsClosedVariable=false;
+ writeIsOpeningVariable=false;
+ ifCanStartTransfer();
+}
+
+
+//set the copy info and options before runing
+void TransferThread::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+}
+
+//set keep date
+void TransferThread::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+}
+
+#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+//set the current max speed in KB/s
+void TransferThread::setMultiForBigSpeed(const int &multiForBigSpeed)
+{
+ readThread.setMultiForBigSpeed(multiForBigSpeed);
+ writeThread.setMultiForBigSpeed(multiForBigSpeed);
+}
+#endif
+
+//set block size in Bytes
+bool TransferThread::setBlockSize(const unsigned int blockSize)
+{
+ bool read=readThread.setBlockSize(blockSize);
+ bool write=writeThread.setBlockSize(blockSize);
+ return (read && write);
+}
+
+//pause the copy
+void TransferThread::pause()
+{
+ //only pause/resume during the transfer of file data
+ //from transfer_stat!=TransferStat_Idle because it resume at wrong order
+ if(transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer && transfer_stat!=TransferStat_Checksum)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] wrong stat to put in pause");
+ return;
+ }
+ haveStartTime=false;
+ readThread.pause();
+ writeThread.pause();
+}
+
+//resume the copy
+void TransferThread::resume()
+{
+ //only pause/resume during the transfer of file data
+ //from transfer_stat!=TransferStat_Idle because it resume at wrong order
+ if(transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer && transfer_stat!=TransferStat_Checksum)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] wrong stat to put in pause");
+ return;
+ }
+ readThread.resume();
+ writeThread.resume();
+}
+
+//stop the current copy
+void TransferThread::stop()
+{
+ stopIt=true;
+ haveStartTime=false;
+ if(transfer_stat==TransferStat_Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"transfer_stat==TransferStat_Idle");
+ return;
+ }
+ if(remainSourceOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"remainSourceOpen()");
+ readThread.stop();
+ }
+ if(remainDestinationOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"remainDestinationOpen()");
+ writeThread.stop();
+ }
+ if(!remainFileOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"transfer_stat==TransferStat_Idle");
+ if(needRemove && source.absoluteFilePath()!=destination.absoluteFilePath())
+ {
+ if(source.exists())
+ QFile(destination.absoluteFilePath()).remove();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] try destroy the destination when the source don't exists"));
+ }
+ transfer_stat=TransferStat_PostOperation;
+ emit internalStartPostOperation();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("transfer_stat==%1 && remainFileOpen()").arg(transfer_stat).toStdString());
+}
+
+bool TransferThread::remainFileOpen() const
+{
+ return remainSourceOpen() || remainDestinationOpen();
+}
+
+bool TransferThread::remainSourceOpen() const
+{
+ return (readIsOpenVariable || readIsOpeningVariable) && !readIsClosedVariable;
+}
+
+bool TransferThread::remainDestinationOpen() const
+{
+ return (writeIsOpenVariable || writeIsOpeningVariable) && !writeIsClosedVariable;
+}
+
+void TransferThread::readIsFinish()
+{
+ if(readIsFinishVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] double event dropped"));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ readIsFinishVariable=true;
+ canStartTransfer=false;
+ //check here if need start checksuming or not
+ real_doChecksum=doChecksum && (!checksumOnlyOnError || fileContentError) && (!canBeMovedDirectlyVariable && !canBeCopiedDirectlyVariable);
+ if(real_doChecksum)
+ {
+ readIsFinishVariable=false;
+ transfer_stat=TransferStat_Checksum;
+ sourceChecksum=QByteArray();
+ destinationChecksum=QByteArray();
+ readThread.startCheckSum();
+ }
+ else
+ {
+ transfer_stat=TransferStat_PostTransfer;
+ if(!needSkip || (canBeCopiedDirectlyVariable || canBeMovedDirectlyVariable))//if skip, stop call, then readIsClosed() already call
+ readThread.postOperation();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] in skip, don't start postOperation");
+ }
+ emit pushStat(transfer_stat,transferId);
+}
+
+void TransferThread::writeIsFinish()
+{
+ if(writeIsFinishVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ writeIsFinishVariable=true;
+ //check here if need start checksuming or not
+ if(real_doChecksum)
+ {
+ writeIsFinishVariable=false;
+ transfer_stat=TransferStat_Checksum;
+ writeThread.startCheckSum();
+ }
+ else
+ {
+ if(!needSkip || (canBeCopiedDirectlyVariable || canBeMovedDirectlyVariable))//if skip, stop call, then writeIsClosed() already call
+ writeThread.postOperation();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] in skip, don't start postOperation");
+ }
+}
+
+void TransferThread::readChecksumFinish(const QByteArray& checksum)
+{
+ sourceChecksum=checksum;
+ compareChecksum();
+}
+
+void TransferThread::writeChecksumFinish(const QByteArray& checksum)
+{
+ destinationChecksum=checksum;
+ compareChecksum();
+}
+
+void TransferThread::compareChecksum()
+{
+ if(sourceChecksum.size()==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] the checksum of source is missing");
+ return;
+ }
+ if(destinationChecksum.size()==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] the checksum of destination is missing");
+ return;
+ }
+ if(sourceChecksum==destinationChecksum)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] the checksum match");
+ readThread.postOperation();
+ writeThread.postOperation();
+ transfer_stat=TransferStat_PostTransfer;
+ emit pushStat(transfer_stat,transferId);
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] the checksum not match"));
+ //emit error here, and wait to resume
+ emit errorOnFile(destination,tr("The checksums do not match").toStdString());
+ }
+}
+
+void TransferThread::readIsClosed()
+{
+ if(readIsClosedVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] double event dropped"));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ readIsClosedVariable=true;
+ readIsOpeningVariable=false;
+ checkIfAllIsClosedAndDoOperations();
+}
+
+void TransferThread::writeIsClosed()
+{
+ if(writeIsClosedVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ writeIsClosedVariable=true;
+ writeIsOpeningVariable=false;
+ if(stopIt && needRemove && source.absoluteFilePath()!=destination.absoluteFilePath())
+ {
+ if(source.exists())
+ QFile(destination.absoluteFilePath()).remove();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] try destroy the destination when the source don't exists"));
+ }
+ checkIfAllIsClosedAndDoOperations();
+}
+
+// return true if all is closed, and do some operations, don't use into condition to check if is closed!
+bool TransferThread::checkIfAllIsClosedAndDoOperations()
+{
+ if((readError || writeError) && !needSkip && !stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] resolve error before progress");
+ return false;
+ }
+ if(!remainFileOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit internalStartPostOperation() to do the real post operation");
+ transfer_stat=TransferStat_PostOperation;
+ //emit pushStat(stat,transferId);
+ emit internalStartPostOperation();
+ return true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("wait self close: readIsReadyVariable: %1, readIsClosedVariable: %2, writeIsReadyVariable: %3, writeIsClosedVariable: %4")
+ .arg(readIsReadyVariable)
+ .arg(readIsClosedVariable)
+ .arg(writeIsReadyVariable)
+ .arg(writeIsClosedVariable)
+ .toStdString()
+ );
+ return false;
+ }
+}
+
+/// \todo found way to retry that's
+/// \todo the rights copy
+void TransferThread::postOperation()
+{
+ if(transfer_stat!=TransferStat_PostOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] need be in transfer, source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString()+", stat:"+std::to_string(transfer_stat));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ //all except closing
+ if((readError || writeError) && !needSkip && !stopIt)//normally useless by checkIfAllIsFinish()
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] resume after error");
+ return;
+ }
+
+ if(!needSkip && !stopIt)
+ {
+ if(!canBeCopiedDirectlyVariable && !canBeMovedDirectlyVariable)
+ {
+ if(writeIsOpenVariable && !writeIsClosedVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't pass in post operation if write is not closed"));
+ emit errorOnFile(destination,tr("Internal error: The destination is not closed").toStdString());
+ needSkip=false;
+ if(deletePartiallyTransferredFiles)
+ needRemove=true;
+ writeError=true;
+ return;
+ }
+ if(readThread.getLastGoodPosition()!=writeThread.getLastGoodPosition())
+ {
+ writeThread.flushBuffer();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+QString("] readThread.getLastGoodPosition(%1)!=writeThread.getLastGoodPosition(%2)")
+ .arg(readThread.getLastGoodPosition())
+ .arg(writeThread.getLastGoodPosition())
+ .toStdString()
+ );
+ emit errorOnFile(destination,tr("Internal error: The size transfered doesn't match").toStdString());
+ needSkip=false;
+ if(deletePartiallyTransferredFiles)
+ needRemove=true;
+ writeError=true;
+ return;
+ }
+ if(!writeThread.bufferIsEmpty())
+ {
+ writeThread.flushBuffer();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] buffer is not empty"));
+ emit errorOnFile(destination,tr("Internal error: The buffer is not empty").toStdString());
+ needSkip=false;
+ if(deletePartiallyTransferredFiles)
+ needRemove=true;
+ writeError=true;
+ return;
+ }
+ }
+
+ if(!doFilePostOperation())
+ return;
+
+ //remove source in moving mode
+ if(mode==Ultracopier::Move && !canBeMovedDirectlyVariable)
+ {
+ if(destination.exists() && destination.isFile())
+ {
+ QFile sourceFile(source.absoluteFilePath());
+ if(!sourceFile.remove())
+ {
+ needSkip=false;
+ emit errorOnFile(source,sourceFile.errorString().toStdString());
+ return;
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] try remove source but destination not exists!"));
+ }
+ }
+ else//do difference skip a file and skip this error case
+ {
+ if(needRemove && destination.exists() && source.exists() && source.absoluteFilePath()!=destination.absoluteFilePath() && destination.isFile())
+ {
+ QFile destinationFile(destination.absoluteFilePath());
+ if(!destinationFile.remove())
+ {
+ //emit errorOnFile(source,destinationFile.errorString());
+ //return;
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] try remove destination but not exists!");
+ }
+ source.setFile(QStringLiteral(""));
+ destination.setFile(QStringLiteral(""));
+ //don't need remove because have correctly finish (it's not in: have started)
+ needRemove=false;
+ needSkip=false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit postOperationStopped()");
+ transfer_stat=TransferStat_Idle;
+ emit postOperationStopped();
+}
+
+bool TransferThread::doFilePostOperation()
+{
+ //do operation needed by copy
+ //set the time if no write thread used
+
+ destination.refresh();
+ if(!destination.exists() && !destination.isSymLink())
+ {
+ if(!stopIt)
+ if(/*true when the destination have been remove but not the symlink:*/!source.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date: File not found");
+ emit errorOnFile(destination,tr("Unable to change the date").toStdString()+": "+tr("File not found").toStdString());
+ return false;
+ }
+ }
+ else
+ {
+ if(doTheDateTransfer)
+ {
+ if(!writeFileDateTime(destination))
+ {
+ if(!destination.isFile())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date (is not a file)");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date");
+ /* error with virtual folder under windows */
+ #ifndef Q_OS_WIN32
+ if(keepDate)
+ {
+ emit errorOnFile(destination,tr("Unable to change the date").toStdString());
+ return false;
+ }
+ #endif
+ }
+ else
+ {
+ #ifndef Q_OS_WIN32
+ destination.refresh();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] read the destination time: "+destination.lastModified().toString().toStdString());
+ if(destination.lastModified()<minTime)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] read the destination time lower than min time: "+destination.lastModified().toString().toStdString());
+ if(keepDate)
+ {
+ emit errorOnFile(destination,tr("Unable to change the date").toStdString());
+ return false;
+ }
+ }
+ #endif
+ }
+ }
+ if(doRightTransfer)
+ {
+ QFile sourceFile(source.absoluteFilePath());
+ QFile destinationFile(destination.absoluteFilePath());
+ if(!destinationFile.setPermissions(sourceFile.permissions()))
+ {
+ if(sourceFile.error()!=QFile::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to get the source file permission");
+ //emit errorOnFile(destination,tr("Unable to get the source file permission"));
+ //return false;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to set the destination file permission");
+ //emit errorOnFile(destination,tr("Unable to set the destination file permission"));
+ //return false;
+ }
+ }
+ }
+ }
+ if(stopIt)
+ return false;
+
+ return true;
+}
+
+//////////////////////////////////////////////////////////////////
+/////////////////////// Error management /////////////////////////
+//////////////////////////////////////////////////////////////////
+
+void TransferThread::getWriteError()
+{
+ if(writeError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already in write error!");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ fileContentError = true;
+ writeError = true;
+ writeIsReadyVariable = false;
+ writeError_source_seeked = false;
+ writeError_destination_reopened = false;
+ writeIsOpeningVariable=false;
+ if(!readError)//already display error for the read
+ emit errorOnFile(destination,writeThread.errorString());
+}
+
+void TransferThread::getReadError()
+{
+ if(readError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already in read error!");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ fileContentError = true;
+ readError = true;
+ //writeIsReadyVariable = false;//wrong because write can be ready here
+ readIsReadyVariable = false;
+ readIsOpeningVariable=false;
+ if(!writeError)//already display error for the write
+ emit errorOnFile(source,readThread.errorString());
+}
+
+//retry after error
+void TransferThread::retryAfterError()
+{
+ /// \warning skip the resetExtraVariable(); to be more exact and resolv some bug
+ if(transfer_stat==TransferStat_Idle)
+ {
+ if(transferId==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] seam have bug, source: ")+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] restart all, source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ readError=false;
+ //writeError=false;
+ emit internalStartPreOperation();
+ return;
+ }
+ //opening error
+ if(transfer_stat==TransferStat_PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] is not idle, source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString()+", stat: "+std::to_string(transfer_stat));
+ readError=false;
+ //writeError=false;
+ emit internalStartPreOperation();
+ //tryOpen();-> recheck all, because can be an error into isSame(), rename(), ...
+ return;
+ }
+ //data streaming error
+ if(transfer_stat!=TransferStat_PostOperation && transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer && transfer_stat!=TransferStat_Checksum)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] is not in right stat, source: ")+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString()+", stat: "+std::to_string(transfer_stat));
+ return;
+ }
+ if(transfer_stat==TransferStat_PostOperation)
+ {
+ if(readError || writeError)
+ {
+ readError=false;
+ //writeError=false;
+ resumeTransferAfterWriteError();
+ writeThread.flushBuffer();
+ transfer_stat=TransferStat_PreOperation;
+ emit internalStartPreOperation();
+ return;
+ }
+ emit internalStartPostOperation();
+ return;
+ }
+ if(canBeMovedDirectlyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] retry the system move");
+ tryMoveDirectly();
+ return;
+ }
+ if(canBeCopiedDirectlyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] retry the copy directly");
+ tryCopyDirectly();
+ return;
+ }
+ if(transfer_stat==TransferStat_Checksum)
+ {
+ if(writeError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start and resume the write error");
+ writeThread.reopen();
+ }
+ else if(readError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start and resume the read error");
+ readThread.reopen();
+ }
+ else //only checksum difference
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] retry all the transfer");
+ canStartTransfer=true;
+ ifCanStartTransfer();
+ }
+ return;
+ }
+ //can have error on source and destination at the same time
+ if(writeError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start and resume the write error: "+std::to_string(readError));
+ if(readError)
+ readThread.reopen();
+ else
+ {
+ readIsClosedVariable=false;
+ readThread.seekToZeroAndWait();
+ }
+ writeThread.reopen();
+ }
+ if(readError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start and resume the read error");
+ readThread.reopen();
+ }
+ if(!writeError && !readError)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unknow error resume");
+}
+
+void TransferThread::writeThreadIsReopened()
+{
+ if(writeError_destination_reopened)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ writeError_destination_reopened=true;
+ if(transfer_stat==TransferStat_Checksum)
+ {
+ writeThread.startCheckSum();
+ return;
+ }
+ if(writeError_source_seeked && writeError_destination_reopened)
+ resumeTransferAfterWriteError();
+}
+
+void TransferThread::readThreadIsSeekToZeroAndWait()
+{
+ if(writeError_source_seeked)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ writeError_source_seeked=true;
+ if(writeError_source_seeked && writeError_destination_reopened)
+ resumeTransferAfterWriteError();
+}
+
+void TransferThread::resumeTransferAfterWriteError()
+{
+ writeError=false;
+/********************************
+ if(canStartTransfer)
+ readThread.startRead();
+useless, because the open destination event
+will restart the transfer as normal
+*********************************/
+/*********************************
+if(!canStartTransfer)
+ stat=WaitForTheTransfer;
+useless because already do at open event
+**********************************/
+ //if is in wait
+ if(!canStartTransfer)
+ emit checkIfItCanBeResumed();
+}
+
+void TransferThread::readThreadResumeAfterError()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ readError=false;
+ writeIsReady();
+ readIsReady();
+}
+
+//////////////////////////////////////////////////////////////////
+///////////////////////// Normal event ///////////////////////////
+//////////////////////////////////////////////////////////////////
+
+void TransferThread::readIsStopped()
+{
+ if(!sended_state_readStopped)
+ {
+ sended_state_readStopped=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit readIsStopped()");
+ emit readStopped();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] drop dual read stopped");
+ return;
+ }
+ readIsFinish();
+}
+
+void TransferThread::writeIsStopped()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ if(!sended_state_writeStopped)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit writeStopped()");
+ sended_state_writeStopped=true;
+ emit writeStopped();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ writeIsFinish();
+}
+
+#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+void TransferThread::timeOfTheBlockCopyFinished()
+{
+ readThread.timeOfTheBlockCopyFinished();
+ writeThread.timeOfTheBlockCopyFinished();
+}
+#endif
+
+bool TransferThread::setParallelBuffer(const int &parallelBuffer)
+{
+ if(parallelBuffer<1 || parallelBuffer>ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] wrong parallelBuffer: "+std::to_string(parallelBuffer));
+ return false;
+ }
+ else
+ {
+ this->parallelBuffer=parallelBuffer;
+ return true;
+ }
+}
+
+bool TransferThread::setSequentialBuffer(const int &sequentialBuffer)
+{
+ if(sequentialBuffer<1 || sequentialBuffer>ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] wrong sequentialBuffer: "+std::to_string(sequentialBuffer));
+ return false;
+ }
+ else
+ {
+ this->sequentialBuffer=sequentialBuffer;
+ return true;
+ }
+}
+
+void TransferThread::setTransferAlgorithm(const TransferAlgorithm &transferAlgorithm)
+{
+ this->transferAlgorithm=transferAlgorithm;
+ if(transferAlgorithm==TransferAlgorithm_Sequential)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Sequential");
+ else if(transferAlgorithm==TransferAlgorithm_Automatic)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Automatic");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Parallel");
+}
+
+//fonction to edit the file date time
+bool TransferThread::readFileDateTime(const QFileInfo &source)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileDateTime("+source.absoluteFilePath().toStdString()+")");
+ if(source.lastModified()<minTime)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the sources is older to copy the time: "+source.absoluteFilePath().toStdString()+": "+source.lastModified().toString().toStdString());
+ return false;
+ }
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_LINUX
+ struct stat info;
+ if(stat(source.absoluteFilePath().toLatin1().data(),&info)!=0)
+ return false;
+ time_t ctime=info.st_ctim.tv_sec;
+ time_t actime=info.st_atim.tv_sec;
+ time_t modtime=info.st_mtim.tv_sec;
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ Q_UNUSED(ctime);
+ return true;
+ #else //mainly for mac
+ time_t ctime=source.created().toTime_t();
+ time_t actime=source.lastRead().toTime_t();
+ time_t modtime=source.lastModified().toTime_t();
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ Q_UNUSED(ctime);
+ return true;
+ #endif
+ #else
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ struct stat info;
+ if(stat(source.toLatin1().data(),&info)!=0)
+ return false;
+ time_t ctime=info.st_ctim.tv_sec;
+ time_t actime=info.st_atim.tv_sec;
+ time_t modtime=info.st_mtim.tv_sec;
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ Q_UNUSED(ctime);
+ return true;
+ #else
+ wchar_t filePath[65535];
+ if(std::regex_match(source.absoluteFilePath().toStdString(),regRead))
+ filePath[QDir::toNativeSeparators(QStringLiteral("\\\\?\\")+source.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
+ else
+ filePath[QDir::toNativeSeparators(source.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
+ HANDLE hFileSouce = CreateFileW(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
+ if(hFileSouce == INVALID_HANDLE_VALUE)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] open failed to read: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
+ return false;
+ }
+ FILETIME ftCreate, ftAccess, ftWrite;
+ if(!GetFileTime(hFileSouce, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileSouce);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to get the file time");
+ return false;
+ }
+ this->ftCreateL=ftCreate.dwLowDateTime;
+ this->ftCreateH=ftCreate.dwHighDateTime;
+ this->ftAccessL=ftAccess.dwLowDateTime;
+ this->ftAccessH=ftAccess.dwHighDateTime;
+ this->ftWriteL=ftWrite.dwLowDateTime;
+ this->ftWriteH=ftWrite.dwHighDateTime;
+ CloseHandle(hFileSouce);
+ return true;
+ #endif
+ #else
+ return false;
+ #endif
+ #endif
+ return false;
+}
+
+bool TransferThread::writeFileDateTime(const QFileInfo &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeFileDateTime("+destination.absoluteFilePath().toStdString()+")");
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_LINUX
+ return utime(destination.absoluteFilePath().toLatin1().data(),&butime)==0;
+ #else //mainly for mac
+ return utime(destination.absoluteFilePath().toLatin1().data(),&butime)==0;
+ #endif
+ #else
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ return utime(destination.toLatin1().data(),&butime)==0;
+ #else
+ wchar_t filePath[65535];
+ if(std::regex_match(destination.absoluteFilePath().toStdString(),regRead))
+ filePath[QDir::toNativeSeparators(QStringLiteral("\\\\?\\")+destination.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
+ else
+ filePath[QDir::toNativeSeparators(destination.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
+ HANDLE hFileDestination = CreateFileW(filePath, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+ if(hFileDestination == INVALID_HANDLE_VALUE)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] open failed to write: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
+ return false;
+ }
+ FILETIME ftCreate, ftAccess, ftWrite;
+ ftCreate.dwLowDateTime=this->ftCreateL;
+ ftCreate.dwHighDateTime=this->ftCreateH;
+ ftAccess.dwLowDateTime=this->ftAccessL;
+ ftAccess.dwHighDateTime=this->ftAccessH;
+ ftWrite.dwLowDateTime=this->ftWriteL;
+ ftWrite.dwHighDateTime=this->ftWriteH;
+ if(!SetFileTime(hFileDestination, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileDestination);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to set the file time");
+ return false;
+ }
+ CloseHandle(hFileDestination);
+ return true;
+ #endif
+ #else
+ return false;
+ #endif
+ #endif
+ return false;
+}
+
+//skip the copy
+void TransferThread::skip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start with stat: "+std::to_string(transfer_stat));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readIsOpeningVariable: "+std::to_string(readIsOpeningVariable)+", readIsOpenVariable: "+std::to_string(readIsOpenVariable)+", readIsReadyVariable: "+std::to_string(readIsReadyVariable)+", readIsFinishVariable: "+std::to_string(readIsFinishVariable)+", readIsClosedVariable: "+std::to_string(readIsClosedVariable));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeIsOpeningVariable: "+std::to_string(writeIsOpeningVariable)+", writeIsOpenVariable: "+std::to_string(writeIsOpenVariable)+", writeIsReadyVariable: "+std::to_string(writeIsReadyVariable)+", writeIsFinishVariable: "+std::to_string(writeIsFinishVariable)+", writeIsClosedVariable: "+std::to_string(writeIsClosedVariable));
+ switch(transfer_stat)
+ {
+ case TransferStat_WaitForTheTransfer:
+ //needRemove=true;never put that's here, can product destruction of the file
+ case TransferStat_PreOperation:
+ if(needSkip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
+ return;
+ }
+ needSkip=true;
+ //check if all is source and destination is closed
+ if(remainFileOpen())
+ {
+ if(remainSourceOpen())
+ readThread.stop();
+ if(remainDestinationOpen())
+ writeThread.stop();
+ }
+ else // wait nothing, just quit
+ {
+ transfer_stat=TransferStat_PostOperation;
+ emit internalStartPostOperation();
+ }
+ break;
+ case TransferStat_Transfer:
+ case TransferStat_PostTransfer:
+ if(needSkip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
+ return;
+ }
+ //needRemove=true;never put that's here, can product destruction of the file
+ needSkip=true;
+ if(canBeMovedDirectlyVariable || canBeCopiedDirectlyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] Do the direct FS fake close, canBeMovedDirectlyVariable: "+std::to_string(canBeMovedDirectlyVariable)+", canBeCopiedDirectlyVariable: "+std::to_string(canBeCopiedDirectlyVariable));
+ readThread.fakeReadIsStarted();
+ writeThread.fakeWriteIsStarted();
+ readThread.fakeReadIsStopped();
+ writeThread.fakeWriteIsStopped();
+ return;
+ }
+ writeThread.flushBuffer();
+ if(remainFileOpen())
+ {
+ if(remainSourceOpen())
+ readThread.stop();
+ if(remainDestinationOpen())
+ writeThread.stop();
+ }
+ else // wait nothing, just quit
+ {
+ transfer_stat=TransferStat_PostOperation;
+ emit internalStartPostOperation();
+ }
+ break;
+ case TransferStat_Checksum:
+ if(needSkip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
+ return;
+ }
+ //needRemove=true;never put that's here, can product destruction of the file
+ needSkip=true;
+ if(remainFileOpen())
+ {
+ if(remainSourceOpen())
+ readThread.stop();
+ if(remainDestinationOpen())
+ writeThread.stop();
+ }
+ else // wait nothing, just quit
+ {
+ transfer_stat=TransferStat_PostOperation;
+ emit internalStartPostOperation();
+ }
+ break;
+ case TransferStat_PostOperation:
+ if(needSkip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
+ return;
+ }
+ //needRemove=true;never put that's here, can product destruction of the file
+ needSkip=true;
+ writeThread.flushBuffer();
+ emit internalStartPostOperation();
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] can skip in this state: "+std::to_string(transfer_stat));
+ return;
+ }
+}
+
+//return info about the copied size
+int64_t TransferThread::copiedSize()
+{
+ switch(transfer_stat)
+ {
+ case TransferStat_Transfer:
+ case TransferStat_PostOperation:
+ case TransferStat_PostTransfer:
+ return (readThread.getLastGoodPosition()+writeThread.getLastGoodPosition())/2;
+ case TransferStat_Checksum:
+ return transferSize;
+ default:
+ return 0;
+ }
+}
+
+//retry after error
+void TransferThread::putAtBottom()
+{
+ emit tryPutAtBottom();
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+/// \brief set rsync
+void TransferThread::setRsync(const bool rsync)
+{
+ this->rsync=rsync;
+}
+#endif
+
+void TransferThread::set_osBufferLimit(const unsigned int &osBufferLimit)
+{
+ this->osBufferLimit=osBufferLimit;
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+//to set the id
+void TransferThread::setId(int id)
+{
+ this->id=id;
+ readThread.setId(id);
+ writeThread.setId(id);
+}
+
+char TransferThread::readingLetter() const
+{
+ switch(readThread.stat)
+ {
+ case ReadThread::Idle:
+ return '_';
+ break;
+ case ReadThread::InodeOperation:
+ return 'I';
+ break;
+ case ReadThread::Read:
+ return 'R';
+ break;
+ case ReadThread::WaitWritePipe:
+ return 'W';
+ break;
+ case ReadThread::Checksum:
+ return 'S';
+ break;
+ default:
+ return '?';
+ }
+}
+
+char TransferThread::writingLetter() const
+{
+ switch(writeThread.stat)
+ {
+ case WriteThread::Idle:
+ return '_';
+ break;
+ case WriteThread::InodeOperation:
+ return 'I';
+ break;
+ case WriteThread::Write:
+ return 'W';
+ break;
+ case WriteThread::Close:
+ return 'C';
+ break;
+ case WriteThread::Read:
+ return 'R';
+ break;
+ case WriteThread::Checksum:
+ return 'S';
+ break;
+ default:
+ return '?';
+ }
+}
+
+#endif
+
+void TransferThread::setMkpathTransfer(QSemaphore *mkpathTransfer)
+{
+ this->mkpathTransfer=mkpathTransfer;
+ writeThread.setMkpathTransfer(mkpathTransfer);
+}
+
+void TransferThread::set_doChecksum(bool doChecksum)
+{
+ this->doChecksum=doChecksum;
+}
+
+void TransferThread::set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible)
+{
+ this->checksumIgnoreIfImpossible=checksumIgnoreIfImpossible;
+}
+
+void TransferThread::set_checksumOnlyOnError(bool checksumOnlyOnError)
+{
+ this->checksumOnlyOnError=checksumOnlyOnError;
+}
+
+void TransferThread::set_osBuffer(bool osBuffer)
+{
+ this->osBuffer=osBuffer;
+}
+
+void TransferThread::set_osBufferLimited(bool osBufferLimited)
+{
+ this->osBufferLimited=osBufferLimited;
+}
+
+//not copied size, because that's count to the checksum, ...
+uint64_t TransferThread::realByteTransfered() const
+{
+ switch(transfer_stat)
+ {
+ case TransferStat_Transfer:
+ case TransferStat_Checksum:
+ return (readThread.getLastGoodPosition()+writeThread.getLastGoodPosition())/2;
+ case TransferStat_PostTransfer:
+ return (readThread.getLastGoodPosition()+writeThread.getLastGoodPosition())/2;
+ case TransferStat_PostOperation:
+ return transferSize;
+ default:
+ return 0;
+ }
+}
+
+//first is read, second is write
+std::pair<uint64_t, uint64_t> TransferThread::progression() const
+{
+ std::pair<uint64_t,uint64_t> returnVar;
+ switch(transfer_stat)
+ {
+ case TransferStat_Transfer:
+ returnVar.first=readThread.getLastGoodPosition();
+ returnVar.second=writeThread.getLastGoodPosition();
+ /*if(returnVar.first<returnVar.second)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+QStringLiteral("] read is smaller than write"));*/
+ break;
+ case TransferStat_Checksum:
+ returnVar.first=readThread.getLastGoodPosition();
+ returnVar.second=writeThread.getLastGoodPosition();
+ break;
+ case TransferStat_PostTransfer:
+ returnVar.first=transferSize;
+ returnVar.second=writeThread.getLastGoodPosition();
+ /*if(returnVar.first<returnVar.second)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+QStringLiteral("] read is smaller than write"));*/
+ break;
+ case TransferStat_PostOperation:
+ returnVar.first=transferSize;
+ returnVar.second=transferSize;
+ break;
+ default:
+ returnVar.first=0;
+ returnVar.second=0;
+ }
+ return returnVar;
+}
+
+void TransferThread::setRenamingRules(const std::string &firstRenamingRule, const std::string &otherRenamingRule)
+{
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+}
+
+void TransferThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
+{
+ this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
+}
+
+void TransferThread::setRenameTheOriginalDestination(const bool &renameTheOriginalDestination)
+{
+ this->renameTheOriginalDestination=renameTheOriginalDestination;
+}
+
+void TransferThread::set_updateMount()
+{
+ driveManagement.tryUpdate();
+}
diff --git a/plugins/CopyEngine/Ultracopier/TransferThread.h b/plugins/CopyEngine/Ultracopier/TransferThread.h
new file mode 100644
index 0000000..e1a3b3f
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/TransferThread.h
@@ -0,0 +1,288 @@
+/** \file TransferThread.h
+\brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef TRANSFERTHREAD_H
+#define TRANSFERTHREAD_H
+
+#include <QThread>
+#include <QFileInfo>
+#include <regex>
+#include <vector>
+#include <string>
+#include <QDateTime>
+#include <QDir>
+#include <utility>
+
+#ifdef Q_OS_UNIX
+ #include <utime.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+#else
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ #include <utime.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+ #endif
+ #endif
+#endif
+
+#include "ReadThread.h"
+#include "WriteThread.h"
+#include "Environment.h"
+#include "DriveManagement.h"
+#include "StructEnumDefinition_CopyEngine.h"
+
+/// \brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
+class TransferThread : public QThread
+{
+ Q_OBJECT
+public:
+ explicit TransferThread();
+ ~TransferThread();
+ /// \brief get transfer stat
+ TransferStat getStat() const;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief to set the id
+ void setId(int id);
+ /// \brief get the reading letter
+ char readingLetter() const;
+ /// \brief get the writing letter
+ char writingLetter() const;
+ #endif
+ /// \brief to have semaphore, and try create just one by one
+ void setMkpathTransfer(QSemaphore *mkpathTransfer);
+ /// \brief to store the transfer id
+ uint64_t transferId;
+ /// \brief to store the transfer size
+ uint64_t transferSize;
+ bool haveStartTime;
+ QTime startTransferTime;
+
+ void set_doChecksum(bool doChecksum);
+ void set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible);
+ void set_checksumOnlyOnError(bool checksumOnlyOnError);
+ void set_osBuffer(bool osBuffer);
+ void set_osBufferLimited(bool osBufferLimited);
+
+ //not copied size, because that's count to the checksum, ...
+ uint64_t realByteTransfered() const;
+ std::pair<uint64_t, uint64_t> progression() const;
+ static std::string resolvedName(const QFileInfo &inode);
+ std::string getSourcePath() const;
+ std::string getDestinationPath() const;
+ QFileInfo getSourceInode() const;
+ QFileInfo getDestinationInode() const;
+ Ultracopier::CopyMode getMode() const;
+protected:
+ void run();
+signals:
+ //to send state
+ void preOperationStopped() const;
+ void checkIfItCanBeResumed() const;
+ //void transferStarted();//not sended (and not used then)
+ void readStopped() const;
+ void writeStopped() const;
+ void postOperationStopped() const;
+ //get dialog
+ void fileAlreadyExists(const QFileInfo &info,const QFileInfo &info2,const bool &isSame) const;
+ void errorOnFile(const QFileInfo &info,const std::string &string,const ErrorType &errorType=ErrorType_Normal) const;
+ //internal signal
+ void internalStartPostOperation() const;
+ void internalStartPreOperation() const;
+ void internalStartResumeAfterErrorAndSeek() const;
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,std::string fonction,std::string text,std::string file,int ligne) const;
+ void tryPutAtBottom() const;
+ //force into the right thread
+ void internalTryStartTheTransfer() const;
+ /// \brief update the transfer stat
+ void pushStat(const TransferStat &stat,const uint64_t &pos) const;
+public slots:
+ /// \brief to start the transfer of data
+ void startTheTransfer();
+ /// \brief to set files to transfer
+ bool setFiles(const QFileInfo& source,const int64_t &size,const QFileInfo& destination,const Ultracopier::CopyMode &mode);
+ /// \brief to set file exists action to do
+ void setFileExistsAction(const FileExistsAction &action);
+ /// \brief to set the new name of the destination
+ void setFileRename(const std::string &nameForRename);
+ /// \brief to start the transfer of data
+ void setAlwaysFileExistsAction(const FileExistsAction &action);
+ /// \brief set the copy info and options before runing
+ void setRightTransfer(const bool doRightTransfer);
+ /// \brief set keep date
+ void setKeepDate(const bool keepDate);
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ /// \brief set the current max speed in KB/s
+ void setMultiForBigSpeed(const int &maxSpeed);
+ #endif
+ /// \brief set block size in KB
+ bool setBlockSize(const unsigned int blockSize);
+ /// \brief pause the copy
+ void pause();
+ /// \brief resume the copy
+ void resume();
+ /// \brief stop the copy
+ void stop();
+ /// \brief skip the copy
+ void skip();
+ /// \brief retry after error
+ void retryAfterError();
+ /// \brief return info about the copied size
+ int64_t copiedSize();
+ /// \brief put the current file at bottom
+ void putAtBottom();
+
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ void setRsync(const bool rsync);
+ #endif
+
+ void set_osBufferLimit(const unsigned int &osBufferLimit);
+ void setRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule);
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ //speed limitation
+ void timeOfTheBlockCopyFinished();
+ #endif
+
+ bool setParallelBuffer(const int &parallelBuffer);
+ bool setSequentialBuffer(const int &sequentialBuffer);
+ void setTransferAlgorithm(const TransferAlgorithm &transferAlgorithm);
+ void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
+ void setRenameTheOriginalDestination(const bool &renameTheOriginalDestination);
+ void set_updateMount();
+private slots:
+ void preOperation();
+ void readIsReady();
+ void writeIsReady();
+ void readIsFinish();
+ void writeIsFinish();
+ void readIsClosed();
+ void writeIsClosed();
+ void postOperation();
+ void getWriteError();
+ void getReadError();
+ void readChecksumFinish(const QByteArray&);
+ void writeChecksumFinish(const QByteArray&);
+ void compareChecksum();
+ //void syncAfterErrorAndReadFinish();
+ void readThreadIsSeekToZeroAndWait();
+ void writeThreadIsReopened();
+ void readThreadResumeAfterError();
+ //to filter the emition of signal
+ void readIsStopped();
+ void writeIsStopped();
+ //force into the right thread
+ void internalStartTheTransfer();
+private:
+ enum MoveReturn
+ {
+ MoveReturn_skip=0,
+ MoveReturn_moved=1,
+ MoveReturn_error=2
+ };
+ TransferStat transfer_stat;
+ ReadThread readThread;
+ WriteThread writeThread;
+ /*QString source;
+ QString destination;*/
+ Ultracopier::CopyMode mode;
+ bool doRightTransfer;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ bool rsync;
+ #endif
+ bool keepDate;
+ //ready = open + ready to operation (no error to resolv)
+ bool readIsReadyVariable;
+ bool writeIsReadyVariable;
+ //can be open but with error
+ bool readIsOpeningVariable;//after call open() and before the end of internalOpen(), mostly to prevent internal error by open() when another is running
+ bool writeIsOpeningVariable;//after call open() and before the end of internalOpen(), mostly to prevent internal error by open() when another is running
+ bool readIsOpenVariable;
+ bool writeIsOpenVariable;
+ bool readIsFinishVariable;
+ bool writeIsFinishVariable;
+ bool readIsClosedVariable;
+ bool writeIsClosedVariable;
+ bool canBeMovedDirectlyVariable,canBeCopiedDirectlyVariable;
+ DriveManagement driveManagement;
+ QByteArray sourceChecksum,destinationChecksum;
+ volatile bool stopIt;
+ volatile bool canStartTransfer;
+ bool retry;
+ QFileInfo source;
+ QFileInfo destination;
+ int64_t size;
+ FileExistsAction fileExistsAction;
+ FileExistsAction alwaysDoFileExistsAction;
+ bool needSkip,needRemove;
+ QDateTime minTime;
+ int id;
+ QSemaphore *mkpathTransfer;
+ bool doChecksum,real_doChecksum;
+ bool checksumIgnoreIfImpossible;
+ bool checksumOnlyOnError;
+ bool deletePartiallyTransferredFiles;
+ bool osBuffer;
+ bool osBufferLimited;
+ unsigned int osBufferLimit;
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+ //error management
+ bool writeError,writeError_source_seeked,writeError_destination_reopened;
+ bool readError;
+ bool renameTheOriginalDestination;
+ bool fileContentError;
+ bool doTheDateTransfer;
+ int parallelBuffer;
+ int sequentialBuffer;
+ int parallelizeIfSmallerThan;
+ std::regex renameRegex;
+ TransferAlgorithm transferAlgorithm;
+ #ifdef Q_OS_UNIX
+ utimbuf butime;
+ #else
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ utimbuf butime;
+ #else
+ uint32_t ftCreateL, ftAccessL, ftWriteL;
+ uint32_t ftCreateH, ftAccessH, ftWriteH;
+ std::regex regRead;
+ #endif
+ #endif
+ #endif
+ //different pre-operation
+ bool isSame();
+ bool destinationExists();
+ bool checkAlwaysRename();///< return true if has been renamed
+ bool canBeMovedDirectly() const;
+ bool canBeCopiedDirectly() const;
+ void tryMoveDirectly();
+ void tryCopyDirectly();
+ void ifCanStartTransfer();
+ //fonction to edit the file date time
+ bool readFileDateTime(const QFileInfo &source);
+ bool writeFileDateTime(const QFileInfo &destination);
+ void resetExtraVariable();
+ //error management function
+ void resumeTransferAfterWriteError();
+ //to send state
+ bool sended_state_preOperationStopped;
+ bool sended_state_readStopped;
+ bool sended_state_writeStopped;
+ //different post-operation
+ bool checkIfAllIsClosedAndDoOperations();// return true if all is closed, and do some operations, don't use into condition to check if is closed!
+ bool doFilePostOperation();
+ //different pre-operation
+ void tryOpen();
+ bool remainFileOpen() const;
+ bool remainSourceOpen() const;
+ bool remainDestinationOpen() const;
+};
+
+#endif // TRANSFERTHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier/Variable.h b/plugins/CopyEngine/Ultracopier/Variable.h
new file mode 100644
index 0000000..0fd1a3c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/Variable.h
@@ -0,0 +1,43 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+//#define ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW_TIMER 150
+
+#define ULTRACOPIER_PLUGIN_MINTIMERINTERVAL 50
+#define ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL 100
+#define ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT 2
+#define ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER 1
+#define ULTRACOPIER_PLUGIN_MINIMALYEAR 1995
+#define ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE 256 //in KB
+#define ULTRACOPIER_PLUGIN_DEFAULT_SEQUENTIAL_NUMBER_OF_BLOCK 512
+#define ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK 4 //in KB
+#define ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE 16*1024 //in KB
+#define ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK 2048
+#define ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK 128 //in KB
+
+//if set, check the inode type at scanFileOrFolder, deprecated into the new algorithm and not used
+#define ULTRACOPIER_PLUGIN_CHECKLISTTYPE
+
+#define ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+//#define ULTRACOPIER_PLUGIN_RIGHTS
+
+/** \brief Need be greater than 2, but greater than 20 to be efficient */
+#define ULTRACOPIER_PLUGIN_TIME_UPDATE_TRASNFER_LIST 40
+#define ULTRACOPIER_PLUGIN_TIME_UPDATE_PROGRESSION 200
+#define ULTRACOPIER_PLUGIN_TIME_UPDATE_MOUNT_MS 60*1000
+
+//#define ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins/CopyEngine/Ultracopier/WriteThread.cpp b/plugins/CopyEngine/Ultracopier/WriteThread.cpp
new file mode 100644
index 0000000..9993961
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/WriteThread.cpp
@@ -0,0 +1,968 @@
+#include "WriteThread.h"
+
+#include <QDir>
+
+QMultiHash<QString,WriteThread *> WriteThread::writeFileList;
+QMutex WriteThread::writeFileListMutex;
+
+WriteThread::WriteThread()
+{
+ deletePartiallyTransferredFiles = true;
+ lastGoodPosition = 0;
+ stopIt = false;
+ isOpen.release();
+ moveToThread(this);
+ setObjectName(QStringLiteral("write"));
+ //this->mkpathTransfer = mkpathTransfer;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat = Idle;
+ #endif
+ numberOfBlock = ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
+ buffer = false;
+ putInPause = false;
+ needRemoveTheFile = false;
+ blockSize = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*1024;
+ start();
+}
+
+WriteThread::~WriteThread()
+{
+ stopIt=true;
+ needRemoveTheFile=true;
+ pauseMutex.release();
+ writeFull.release();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ waitNewClockForSpeed.release();
+ waitNewClockForSpeed2.release();
+ #endif
+ writeFull.release();
+ pauseMutex.release();
+ // useless because stopIt will close all thread, but if thread not runing run it
+ //endIsDetected();
+ emit internalStartClose();
+ isOpen.acquire();
+ if(!file.fileName().isEmpty())
+ resumeNotStarted();
+ //disconnect(this);//-> do into ~TransferThread()
+ quit();
+ wait();
+}
+
+void WriteThread::run()
+{
+ connect(this,&WriteThread::internalStartOpen, this,&WriteThread::internalOpen, Qt::QueuedConnection);
+ connect(this,&WriteThread::internalStartReopen, this,&WriteThread::internalReopen, Qt::QueuedConnection);
+ connect(this,&WriteThread::internalStartWrite, this,&WriteThread::internalWrite, Qt::QueuedConnection);
+ connect(this,&WriteThread::internalStartClose, this,&WriteThread::internalCloseSlot, Qt::QueuedConnection);
+ connect(this,&WriteThread::internalStartEndOfFile, this,&WriteThread::internalEndOfFile, Qt::QueuedConnection);
+ connect(this,&WriteThread::internalStartFlushAndSeekToZero, this,&WriteThread::internalFlushAndSeekToZero, Qt::QueuedConnection);
+ connect(this,&WriteThread::internalStartChecksum, this,&WriteThread::checkSum, Qt::QueuedConnection);
+ exec();
+}
+
+bool WriteThread::internalOpen()
+{
+ //do a bug
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] internalOpen destination: "+file.fileName().toStdString());
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ emit closed();
+ return false;
+ }
+ if(file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already open! destination: "+file.fileName().toStdString());
+ return false;
+ }
+ if(file.fileName().isEmpty())
+ {
+ errorString_internal=tr("Path resolution error (Empty path)").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
+ emit error();
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before the mutex");
+ //set to LISTBLOCKSIZE
+ if(sequential)
+ {
+ while(writeFull.available()<1)
+ writeFull.release();
+ if(writeFull.available()>1)
+ writeFull.acquire(writeFull.available()-1);
+ }
+ else
+ {
+ while(writeFull.available()<numberOfBlock)
+ writeFull.release();
+ if(writeFull.available()>numberOfBlock)
+ writeFull.acquire(writeFull.available()-numberOfBlock);
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the mutex");
+ stopIt=false;
+ endDetected=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=InodeOperation;
+ #endif
+ //mkpath check if exists and return true if already exists
+ QFileInfo destinationInfo(file);
+ QDir destinationFolder;
+ {
+ mkpathTransfer->acquire();
+ if(!destinationFolder.exists(destinationInfo.absolutePath()))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] Try create the path: "+
+ destinationInfo.absolutePath().toStdString());
+ if(!destinationFolder.mkpath(destinationInfo.absolutePath()))
+ {
+ if(!destinationFolder.exists(destinationInfo.absolutePath()))
+ {
+ /// \todo do real folder error here
+ errorString_internal="mkpath error on destination";
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable create the folder: %1, error: %2")
+ .arg(destinationInfo.absolutePath())
+ .arg(QString::fromStdString(errorString_internal))
+ .toStdString());
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ mkpathTransfer->release();
+ return false;
+ }
+ }
+ }
+ mkpathTransfer->release();
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the mkpath");
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ emit closed();
+ return false;
+ }
+ //try open it
+ QIODevice::OpenMode flags=QIODevice::ReadWrite;
+ if(!buffer)
+ flags|=QIODevice::Unbuffered;
+ {
+ QMutexLocker lock_mutex(&writeFileListMutex);
+ if(writeFileList.count(file.fileName(),this)==0)
+ {
+ writeFileList.insert(file.fileName(),this);
+ if(writeFileList.count(file.fileName())>1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] in waiting because same file is found");
+ return false;
+ }
+ }
+ }
+ bool fileWasExists=file.exists();
+ if(file.open(flags))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the open");
+ {
+ QMutexLocker lock_mutex(&accessList);
+ if(!theBlockList.isEmpty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] General file corruption detected");
+ stopIt=true;
+ file.close();
+ resumeNotStarted();
+ file.setFileName(QStringLiteral(""));
+ return false;
+ }
+ }
+ pauseMutex.tryAcquire(pauseMutex.available());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the pause mutex");
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ file.close();
+ resumeNotStarted();
+ file.setFileName(QStringLiteral(""));
+ emit closed();
+ return false;
+ }
+ if(!file.seek(0))
+ {
+ file.close();
+ resumeNotStarted();
+ file.setFileName(QStringLiteral(""));
+ errorString_internal=file.errorString().toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ file.close();
+ resumeNotStarted();
+ file.setFileName(QStringLiteral(""));
+ emit closed();
+ return false;
+ }
+ if(!file.resize(startSize))
+ {
+ file.close();
+ resumeNotStarted();
+ file.setFileName(QStringLiteral(""));
+ errorString_internal=file.errorString().toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to resize to %1 after open: %2, error: %3").arg(startSize).arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ file.close();
+ resumeNotStarted();
+ file.setFileName(QStringLiteral(""));
+ emit closed();
+ return false;
+ }
+ isOpen.acquire();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit opened()");
+ emit opened();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ needRemoveTheFile=false;
+ postOperationRequested=false;
+ return true;
+ }
+ else
+ {
+ if(!fileWasExists && file.exists())
+ if(!file.remove())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] file created but can't be removed");
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ resumeNotStarted();
+ file.setFileName(QStringLiteral(""));
+ emit closed();
+ return false;
+ }
+ errorString_internal=file.errorString().toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+}
+
+void WriteThread::open(const QFileInfo &file,const uint64_t &startSize,const bool &buffer,const int &numberOfBlock,const bool &sequential)
+{
+ if(!isRunning())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the thread not running to open destination: "+file.absoluteFilePath().toStdString()+", numberOfBlock: "+std::to_string(numberOfBlock));
+ errorString_internal=tr("Internal error, please report it!").toStdString();
+ emit error();
+ return;
+ }
+ if(this->file.isOpen())
+ {
+ if(file.absoluteFilePath()==this->file.fileName())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Try reopen already opened same file: "+file.absoluteFilePath().toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already open: "+file.absoluteFilePath().toStdString());
+ emit internalStartClose();
+ isOpen.acquire();
+ isOpen.release();
+ }
+ if(numberOfBlock<1 || (numberOfBlock>ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK && numberOfBlock>ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] numberOfBlock wrong, set to default");
+ this->numberOfBlock=ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
+ }
+ else
+ this->numberOfBlock=numberOfBlock;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("open destination: %1, sequential: %2").arg(file.absoluteFilePath()).arg(sequential).toStdString());
+ stopIt=false;
+ fakeMode=false;
+ lastGoodPosition=0;
+ this->file.setFileName(file.absoluteFilePath());
+ this->startSize=startSize;
+ this->buffer=buffer;
+ this->sequential=sequential;
+ endDetected=false;
+ writeFullBlocked=false;
+ emit internalStartOpen();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ numberOfBlockCopied=0;
+ #endif
+}
+
+void WriteThread::endIsDetected()
+{
+ if(endDetected)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ endDetected=true;
+ pauseMutex.release();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ emit internalStartEndOfFile();
+}
+
+std::string WriteThread::errorString() const
+{
+ return errorString_internal;
+}
+
+void WriteThread::stop()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop()");
+ needRemoveTheFile=true;
+ stopIt=true;
+ if(isOpen.available()>0)
+ return;
+ writeFull.release();
+ pauseMutex.release();
+ pauseMutex.release();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ waitNewClockForSpeed.release();
+ waitNewClockForSpeed2.release();
+ #endif
+ // useless because stopIt will close all thread, but if thread not runing run it
+ endIsDetected();
+ //for the stop for skip: void TransferThread::skip()
+ emit internalStartClose();
+}
+
+void WriteThread::flushBuffer()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ writeFull.release();
+ writeFull.acquire();
+ pauseMutex.release();
+ {
+ QMutexLocker lock_mutex(&accessList);
+ theBlockList.clear();
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop");
+}
+
+/// \brief buffer is empty
+bool WriteThread::bufferIsEmpty()
+{
+ bool returnVal;
+ {
+ QMutexLocker lock_mutex(&accessList);
+ returnVal=theBlockList.isEmpty();
+ }
+ return returnVal;
+}
+
+void WriteThread::internalEndOfFile()
+{
+ if(!bufferIsEmpty())
+ {
+ if(sequential)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start the write");
+ emit internalStartWrite();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] buffer is not empty!");
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeIsStopped");
+ emit writeIsStopped();
+ }
+}
+
+#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+/*! \brief Set the max speed
+\param tempMaxSpeed Set the max speed in KB/s, 0 for no limit */
+void WriteThread::setMultiForBigSpeed(const int &multiForBigSpeed)
+{
+ this->multiForBigSpeed=multiForBigSpeed;
+ waitNewClockForSpeed.release();
+ waitNewClockForSpeed2.release();
+}
+
+/// \brief For give timer every X ms
+void WriteThread::timeOfTheBlockCopyFinished()
+{
+ /* this is the old way to limit the speed, it product blocking
+ *if(waitNewClockForSpeed.available()<ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT)
+ waitNewClockForSpeed.release();*/
+
+ //try this new way:
+ /* only if speed limited, else will accumulate waitNewClockForSpeed
+ * Disabled because: Stop call of this method when no speed limit
+ if(this->maxSpeed>0)*/
+ if(waitNewClockForSpeed.available()<=1)
+ waitNewClockForSpeed.release();
+ if(waitNewClockForSpeed2.available()<=1)
+ waitNewClockForSpeed2.release();
+}
+#endif
+
+void WriteThread::resumeNotStarted()
+{
+ QMutexLocker lock_mutex(&writeFileListMutex);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!writeFileList.contains(file.fileName()))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] file: \""+file.fileName().toStdString()+"\" for similar inode is not located into the list of "+std::to_string(writeFileList.size())+" items!");
+ #endif
+ writeFileList.remove(file.fileName(),this);
+ if(writeFileList.contains(file.fileName()))
+ {
+ QList<WriteThread *> writeList=writeFileList.values(file.fileName());
+ if(!writeList.isEmpty())
+ writeList.first()->reemitStartOpen();
+ return;
+ }
+}
+
+void WriteThread::pause()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] try put read thread in pause");
+ pauseMutex.tryAcquire(pauseMutex.available());
+ putInPause=true;
+ return;
+}
+
+void WriteThread::resume()
+{
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ putInPause=false;
+ stopIt=false;
+ }
+ else
+ return;
+ if(!file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] file is not open");
+ return;
+ }
+ pauseMutex.release();
+}
+
+void WriteThread::reemitStartOpen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] start");
+ emit internalStartOpen();
+}
+
+void WriteThread::postOperation()
+{
+ if(postOperationRequested)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ postOperationRequested=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ emit internalStartClose();
+}
+
+void WriteThread::internalCloseSlot()
+{
+ internalClose();
+}
+
+void WriteThread::internalClose(bool emitSignal)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close for file: "+file.fileName().toStdString());
+ /// \note never send signal here, because it's called by the destructor
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Close;
+ #endif
+ bool emit_closed=false;
+ if(!fakeMode)
+ {
+ if(file.isOpen())
+ {
+ if(!needRemoveTheFile)
+ {
+ if(startSize!=lastGoodPosition)
+ if(!file.resize(lastGoodPosition))
+ {
+ if(emitSignal)
+ {
+ errorString_internal=file.errorString().toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
+ emit error();
+ }
+ else
+ needRemoveTheFile=true;
+ }
+ }
+ file.close();
+ if(needRemoveTheFile || stopIt)
+ {
+ if(deletePartiallyTransferredFiles)
+ {
+ if(!file.remove())
+ if(emitSignal)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unable to remove the destination file");
+ }
+ }
+ //here and not after, because the transferThread don't need try close if not open
+ if(emitSignal)
+ emit_closed=true;
+ }
+ }
+ else
+ {
+ //here and not after, because the transferThread don't need try close if not open
+
+ if(emitSignal)
+ emit_closed=true;
+ }
+ needRemoveTheFile=false;
+ resumeNotStarted();
+ //warning: file.setFileName(""); need be after resumeNotStarted()
+ file.setFileName(QStringLiteral(""));
+ if(emit_closed)
+ emit closed();
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ /// \note always the last of this function
+ if(!fakeMode)
+ isOpen.release();
+}
+
+void WriteThread::internalReopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ QString tempFile=file.fileName();
+ internalClose(false);
+ flushBuffer();
+ stopIt=false;
+ lastGoodPosition=0;
+ file.setFileName(tempFile);
+ if(internalOpen())
+ emit reopened();
+}
+
+void WriteThread::reopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ stopIt=true;
+ endDetected=false;
+ emit internalStartReopen();
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+//to set the id
+void WriteThread::setId(int id)
+{
+ this->id=id;
+}
+#endif
+
+/// \brief do the fake open
+void WriteThread::fakeOpen()
+{
+ fakeMode=true;
+ postOperationRequested=false;
+ emit opened();
+}
+
+/// \brief do the fake writeIsStarted
+void WriteThread::fakeWriteIsStarted()
+{
+ emit writeIsStarted();
+}
+
+/// \brief do the fake writeIsStopped
+void WriteThread::fakeWriteIsStopped()
+{
+ emit writeIsStopped();
+}
+
+/// do the checksum
+void WriteThread::startCheckSum()
+{
+ emit internalStartChecksum();
+}
+
+/** \brief set block size
+\param block the new block size in B
+\return Return true if succes */
+bool WriteThread::setBlockSize(const int blockSize)
+{
+ //can be smaller than min block size to do correct speed limitation
+ if(blockSize>1 && blockSize<ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE*1024)
+ {
+ this->blockSize=blockSize;
+ return true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"block size out of range: "+std::to_string(blockSize));
+ return false;
+ }
+}
+
+/// \brief get the last good position
+int64_t WriteThread::getLastGoodPosition() const
+{
+ return lastGoodPosition;
+}
+
+void WriteThread::flushAndSeekToZero()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"flushAndSeekToZero: "+std::to_string(blockSize));
+ stopIt=true;
+ emit internalStartFlushAndSeekToZero();
+}
+
+
+void WriteThread::checkSum()
+{
+ //QByteArray blockArray;
+ QCryptographicHash hash(QCryptographicHash::Sha1);
+ endDetected=false;
+ lastGoodPosition=0;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ numberOfBlockCopied=0;
+ #endif
+ if(!file.seek(0))
+ {
+ errorString_internal=file.errorString().toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
+ emit error();
+ return;
+ }
+ int sizeReaden=0;
+ do
+ {
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] write put in pause");
+ if(stopIt)
+ return;
+ pauseMutex.acquire();
+ if(stopIt)
+ return;
+ }
+ //read one block
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Read;
+ #endif
+ blockArray=file.read(blockSize);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ if(file.error()!=QFile::NoError)
+ {
+ errorString_internal=tr("Unable to read the source file: ").toStdString()+file.errorString().toStdString()+" ("+std::to_string(file.error())+")";
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("file.error()!=QFile::NoError: %1, error: %2").arg(QString::number(file.error())).arg(QString::fromStdString(errorString_internal)).toStdString());
+ emit error();
+ return;
+ }
+ sizeReaden=blockArray.size();
+ if(sizeReaden>0)
+ {
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Checksum;
+ #endif
+ hash.addData(blockArray);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ if(stopIt)
+ break;
+
+ lastGoodPosition+=blockArray.size();
+ }
+ }
+ while(sizeReaden>0 && !stopIt);
+ if(lastGoodPosition>(quint64)file.size())
+ {
+ errorString_internal=tr("File truncated during read, possible data change").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Source truncated during the read: %1 (%2)").arg(file.errorString()).arg(QString::number(file.error())).toStdString());
+ emit error();
+ return;
+ }
+ if(stopIt)
+ {
+/* if(putInPause)
+ emit isInPause();*/
+ stopIt=false;
+ return;
+ }
+ emit checksumFinish(hash.result());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop the read");
+}
+
+void WriteThread::internalFlushAndSeekToZero()
+{
+ flushBuffer();
+ if(!file.seek(0))
+ {
+ errorString_internal=file.errorString().toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
+ emit error();
+ return;
+ }
+ stopIt=false;
+ emit flushedAndSeekedToZero();
+}
+
+void WriteThread::setMkpathTransfer(QSemaphore *mkpathTransfer)
+{
+ this->mkpathTransfer=mkpathTransfer;
+}
+
+void WriteThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
+{
+ this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
+}
+
+bool WriteThread::write(const QByteArray &data)
+{
+ if(stopIt)
+ return false;
+ bool atMax;
+ if(sequential)
+ {
+ if(stopIt)
+ return false;
+ {
+ QMutexLocker lock_mutex(&accessList);
+ theBlockList.append(data);
+ atMax=(theBlockList.size()>=numberOfBlock);
+ }
+ if(atMax)
+ emit internalStartWrite();
+ }
+ else
+ {
+ if(stopIt)
+ return false;
+ {
+ QMutexLocker lock_mutex(&accessList);
+ theBlockList.append(data);
+ atMax=(theBlockList.size()>=numberOfBlock);
+ }
+ emit internalStartWrite();
+ }
+ if(atMax)
+ {
+ writeFullBlocked=true;
+ writeFull.acquire();
+ writeFullBlocked=false;
+ }
+ if(stopIt)
+ return false;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ //wait for limitation speed if stop not query
+ if(multiForBigSpeed>0)
+ {
+ if(sequential)
+ {
+ numberOfBlockCopied++;
+ if(numberOfBlockCopied>=(multiForBigSpeed*2))
+ {
+ numberOfBlockCopied=0;
+ waitNewClockForSpeed.acquire();
+ }
+ }
+ else
+ {
+ numberOfBlockCopied2++;
+ if(numberOfBlockCopied2>=multiForBigSpeed)
+ {
+ numberOfBlockCopied2=0;
+ waitNewClockForSpeed2.acquire();
+ }
+ }
+ }
+ #endif
+ if(stopIt)
+ return false;
+ return true;
+}
+
+void WriteThread::internalWrite()
+{
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ if(sequential)
+ {
+ multiForBigSpeed=0;
+ QMutexLocker lock_mutex(&accessList);
+ if(theBlockList.size()<numberOfBlock && !endDetected)
+ return;
+ }
+ #endif
+ bool haveBlock;
+ do
+ {
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] write put in pause");
+ if(stopIt)
+ return;
+ pauseMutex.acquire();
+ if(stopIt)
+ return;
+ }
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopIt");
+ return;
+ }
+ if(stopIt)
+ return;
+ //read one block
+ {
+ QMutexLocker lock_mutex(&accessList);
+ if(theBlockList.isEmpty())
+ haveBlock=false;
+ else
+ {
+ blockArray=theBlockList.first();
+ if(multiForBigSpeed>0)
+ {
+ if(blockArray.size()==blockSize)
+ {
+ theBlockList.removeFirst();
+ //if remove one block
+ if(!sequential)
+ writeFull.release();
+ }
+ else
+ {
+ blockArray.clear();
+ while(blockArray.size()!=blockSize)
+ {
+ //if larger
+ if(theBlockList.first().size()>blockSize)
+ {
+ blockArray+=theBlockList.first().mid(0,blockSize);
+ theBlockList.first().remove(0,blockSize);
+ if(!sequential)
+ {
+ //do write in loop to finish the actual block
+ emit internalStartWrite();
+ }
+ break;
+ }
+ //if smaller
+ else
+ {
+ blockArray+=theBlockList.first();
+ theBlockList.removeFirst();
+ //if remove one block
+ if(!sequential)
+ writeFull.release();
+ if(theBlockList.isEmpty())
+ break;
+ }
+ }
+ }
+ //haveBlock=!blockArray.isEmpty();
+ }
+ else
+ {
+ theBlockList.removeFirst();
+ //if remove one block
+ if(!sequential)
+ writeFull.release();
+ }
+ haveBlock=true;
+ }
+ }
+ if(stopIt)
+ return;
+ if(!haveBlock)
+ {
+ if(sequential)
+ {
+ if(endDetected)
+ internalEndOfFile();
+ else
+ writeFull.release();
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] End detected of the file");
+ return;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ //wait for limitation speed if stop not query
+ if(multiForBigSpeed>0)
+ {
+ numberOfBlockCopied++;
+ if(sequential || (!sequential && writeFullBlocked))
+ {
+ if(numberOfBlockCopied>=(multiForBigSpeed*2))
+ {
+ numberOfBlockCopied=0;
+ waitNewClockForSpeed.acquire();
+ if(stopIt)
+ break;
+ }
+ }
+ else
+ {
+ if(numberOfBlockCopied>=multiForBigSpeed)
+ {
+ numberOfBlockCopied=0;
+ waitNewClockForSpeed.acquire();
+ if(stopIt)
+ break;
+ }
+ }
+ }
+ #endif
+ if(stopIt)
+ return;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Write;
+ #endif
+ bytesWriten=file.write(blockArray);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ //mutex for stream this data
+ if(lastGoodPosition==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit writeIsStarted()");
+ emit writeIsStarted();
+ }
+ if(stopIt)
+ return;
+ if(file.error()!=QFile::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Error in writing: %1 (%2)").arg(file.errorString()).arg(file.error()).toStdString());
+ errorString_internal=QStringLiteral("Error in writing: %1 (%2)").arg(file.errorString()).arg(file.error()).toStdString();
+ stopIt=true;
+ emit error();
+ return;
+ }
+ if(bytesWriten!=blockArray.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size()).toStdString());
+ errorString_internal=QStringLiteral("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size()).toStdString();
+ stopIt=true;
+ emit error();
+ return;
+ }
+ lastGoodPosition+=bytesWriten;
+ } while(sequential);
+}
diff --git a/plugins/CopyEngine/Ultracopier/WriteThread.h b/plugins/CopyEngine/Ultracopier/WriteThread.h
new file mode 100644
index 0000000..cadd022
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/WriteThread.h
@@ -0,0 +1,160 @@
+/** \file WriteThread.h
+\brief Thread changed to open/close and write the destination file
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef WRITETHREAD_H
+#define WRITETHREAD_H
+
+#include <QThread>
+#include <QByteArray>
+#include <QString>
+#include <QMutex>
+#include <QSemaphore>
+#include <QCryptographicHash>
+
+#include "Environment.h"
+#include "StructEnumDefinition_CopyEngine.h"
+#include "AvancedQFile.h"
+
+/// \brief Thread changed to open/close and write the destination file
+class WriteThread : public QThread
+{
+ Q_OBJECT
+public:
+ explicit WriteThread();
+ ~WriteThread();
+ /// \brief to have semaphore to do mkpath one by one
+ void setMkpathTransfer(QSemaphore *mkpathTransfer);
+protected:
+ void run();
+public:
+ /// \brief open the destination to open it
+ void open(const QFileInfo &file,const uint64_t &startSize,const bool &buffer,const int &numberOfBlock,const bool &sequential);
+ /// \brief to return the error string
+ std::string errorString() const;
+ /// \brief to stop all
+ void stop();
+ /// \brief to write data
+ bool write(const QByteArray &data);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief to set the id
+ void setId(int id);
+ /// \brief get the write stat
+ enum WriteStat
+ {
+ Idle=0,
+ InodeOperation=1,
+ Write=2,
+ Close=3,
+ Read=5,
+ Checksum=6
+ };
+ WriteStat stat;
+ #endif
+ /// \brief do the fake open
+ void fakeOpen();
+ /// \brief do the fake writeIsStarted
+ void fakeWriteIsStarted();
+ /// \brief do the fake writeIsStopped
+ void fakeWriteIsStopped();
+ /// do the checksum
+ void startCheckSum();
+ /// \brief set block size in KB
+ bool setBlockSize(const int blockSize);
+ /// \brief get the last good position
+ int64_t getLastGoodPosition() const;
+ /// \brief buffer is empty
+ bool bufferIsEmpty();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ /// \brief set the current max speed in KB/s
+ void setMultiForBigSpeed(const int &multiForBigSpeed);
+ #endif
+ void pause();
+ void resume();
+ void reemitStartOpen();
+public slots:
+ /// \brief start the operation
+ void postOperation();
+ /// \brief flush buffer
+ void flushBuffer();
+ /// \brief set the end is detected
+ void endIsDetected();
+ /// \brief reopen the file
+ void reopen();
+ /// \brief flush and seek to zero
+ void flushAndSeekToZero();
+ /// do the checksum
+ void checkSum();
+ void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
+ /// \brief executed at regular interval to do a speed throling
+ void timeOfTheBlockCopyFinished();
+
+ void resumeNotStarted();
+signals:
+ void error() const;
+ void opened() const;
+ void reopened() const;
+ void writeIsStarted() const;
+ void writeIsStopped() const;
+ void flushedAndSeekedToZero() const;
+ void closed() const;
+ void checksumFinish(const QByteArray&) const;
+ //internal signals
+ void internalStartOpen() const;
+ void internalStartChecksum() const;
+ void internalStartReopen() const;
+ void internalStartWrite() const;
+ void internalStartClose() const;
+ void internalStartEndOfFile() const;
+ void internalStartFlushAndSeekToZero() const;
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+private:
+ std::string errorString_internal;
+ AvancedQFile file;
+ volatile bool stopIt;
+ volatile bool postOperationRequested;
+ volatile int blockSize;//only used in checksum
+ int numberOfBlock;
+ QMutex accessList; ///< For use the list
+ static QMultiHash<QString,WriteThread *> writeFileList;
+ static QMutex writeFileListMutex;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ QSemaphore waitNewClockForSpeed,waitNewClockForSpeed2;
+ volatile int numberOfBlockCopied,numberOfBlockCopied2; ///< Multiple for count the number of block copied
+ volatile int multiplicatorForBigSpeed; ///< Multiple for count the number of block needed
+ volatile int MultiForBigSpeed;
+ #endif
+ QSemaphore writeFull;
+ volatile bool writeFullBlocked;
+ QSemaphore isOpen;
+ QSemaphore pauseMutex;
+ volatile bool putInPause;
+ QList<QByteArray> theBlockList; ///< Store the block list
+ uint64_t lastGoodPosition;
+ QByteArray blockArray; ///< temp data for block writing, the data
+ int64_t bytesWriten; ///< temp data for block writing, the bytes writen
+ int id;
+ volatile bool endDetected;
+ uint64_t startSize;
+ QSemaphore *mkpathTransfer;
+ bool fakeMode;
+ bool buffer;
+ bool needRemoveTheFile;
+ volatile bool sequential;
+ bool deletePartiallyTransferredFiles;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ volatile int multiForBigSpeed; ///< Multiple for count the number of block needed
+ #endif
+private slots:
+ bool internalOpen();
+ void internalWrite();
+ void internalCloseSlot();
+ void internalClose(bool emitSignal=true);
+ void internalReopen();
+ void internalEndOfFile();
+ void internalFlushAndSeekToZero();
+};
+
+#endif // WRITETHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier/copyEngineOptions.ui b/plugins/CopyEngine/Ultracopier/copyEngineOptions.ui
new file mode 100644
index 0000000..4870480
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/copyEngineOptions.ui
@@ -0,0 +1,762 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>copyEngineOptions</class>
+ <widget class="QWidget" name="copyEngineOptions">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>801</width>
+ <height>504</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QToolBox" name="toolBox">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page_trasnfer">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>791</width>
+ <height>364</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Transfer</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="3" column="2">
+ <widget class="QCheckBox" name="moveTheWholeFolder"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_18">
+ <property name="text">
+ <string>Move the whole folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Transfer the file rights</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QCheckBox" name="doRightTransfer"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Keep the file date</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QCheckBox" name="autoStart"/>
+ </item>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="keepDate"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Autostart the transfer</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QCheckBox" name="followTheStrictOrder">
+ <property name="toolTip">
+ <string>Less performance if checked</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <spacer name="verticalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>278</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_19">
+ <property name="toolTip">
+ <string>Less performance if checked</string>
+ </property>
+ <property name="text">
+ <string>Follow the strict order</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_rsync">
+ <property name="text">
+ <string notr="true">Rsync</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QCheckBox" name="rsync"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_error_collision">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>502</width>
+ <height>218</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Error and collision</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>When folder error</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QCheckBox" name="checkBoxDestinationFolderExists"/>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_12">
+ <property name="text">
+ <string>When file error</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QComboBox" name="comboBoxFileError">
+ <item>
+ <property name="text">
+ <string notr="true">Ask</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Skip</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Put at the end</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_13">
+ <property name="text">
+ <string>When file collision</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QComboBox" name="comboBoxFileCollision">
+ <item>
+ <property name="text">
+ <string notr="true">Ask</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Skip</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Overwrite</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Overwrite if different</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Overwrite if newer</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Overwrite if older</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Rename</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QComboBox" name="comboBoxFolderError">
+ <item>
+ <property name="text">
+ <string notr="true">Ask</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Skip</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>When folder collision</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QComboBox" name="comboBoxFolderCollision">
+ <item>
+ <property name="text">
+ <string notr="true">Ask</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Merge</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Skip</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Rename</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Check if destination folder exists</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="QPushButton" name="renamingRules">
+ <property name="text">
+ <string>Renaming rules</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <spacer name="verticalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>193</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_20">
+ <property name="text">
+ <string>Delete partially transferred files</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QCheckBox" name="deletePartiallyTransferredFiles"/>
+ </item>
+ <item row="6" column="2">
+ <widget class="QCheckBox" name="renameTheOriginalDestination"/>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_22">
+ <property name="text">
+ <string>Rename the original destination</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ <zorder>label_12</zorder>
+ <zorder>label_13</zorder>
+ <zorder>label_6</zorder>
+ <zorder>label_7</zorder>
+ <zorder>label_8</zorder>
+ <zorder>comboBoxFileError</zorder>
+ <zorder>comboBoxFileCollision</zorder>
+ <zorder>comboBoxFolderError</zorder>
+ <zorder>comboBoxFolderCollision</zorder>
+ <zorder>checkBoxDestinationFolderExists</zorder>
+ <zorder>renamingRules</zorder>
+ <zorder>label_20</zorder>
+ <zorder>deletePartiallyTransferredFiles</zorder>
+ <zorder>renameTheOriginalDestination</zorder>
+ <zorder>label_22</zorder>
+ </widget>
+ <widget class="QWidget" name="page_control">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>172</width>
+ <height>119</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Control</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Checksum</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="checksumOnlyOnError"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Only after error</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>Ignore if impossible</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="checksumIgnoreIfImpossible"/>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="doChecksum">
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>Verify checksums</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>242</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_performance">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>791</width>
+ <height>364</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Performance</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_16">
+ <property name="text">
+ <string>Parallel buffer</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QSpinBox" name="sequentialBuffer">
+ <property name="suffix">
+ <string>KB</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="blockSize">
+ <property name="suffix">
+ <string>KB</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>65536</number>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QSpinBox" name="parallelBuffer">
+ <property name="suffix">
+ <string>KB</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="osBuffer"/>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Block size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_15">
+ <property name="text">
+ <string>Sequential buffer</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Enable OS buffer</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="osBufferLimit">
+ <property name="suffix">
+ <string>KB</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>2048</number>
+ </property>
+ <property name="value">
+ <number>512</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="osBufferLimited">
+ <property name="text">
+ <string>OS buffer only if smaller than</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_14">
+ <property name="text">
+ <string>Transfer algorithm</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QComboBox" name="transferAlgorithm">
+ <item>
+ <property name="text">
+ <string notr="true">Automatic</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Sequential</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Parallel</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="9" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>197</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_17">
+ <property name="text">
+ <string>Parallelize if smaller than</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QSpinBox" name="parallelizeIfSmallerThan">
+ <property name="suffix">
+ <string>KB</string>
+ </property>
+ <property name="maximum">
+ <number>1024</number>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="QSpinBox" name="inodeThreads">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>32</number>
+ </property>
+ <property name="value">
+ <number>16</number>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="label_21">
+ <property name="text">
+ <string>Inode threads</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="QCheckBox" name="copyListOrder">
+ <property name="toolTip">
+ <string>More cpu, but better organisation on the disk</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QLabel" name="label_25">
+ <property name="toolTip">
+ <string>More cpu, but better organisation on the disk</string>
+ </property>
+ <property name="text">
+ <string>Order the list</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_misc">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>449</width>
+ <height>89</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Misc</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_23">
+ <property name="text">
+ <string>Check the disk space</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QCheckBox" name="checkDiskSpace"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_24">
+ <property name="text">
+ <string>Use this folder when destination is not set</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLineEdit" name="defaultDestinationFolder"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="defaultDestinationFolderBrowse">
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>353</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="filters">
+ <property name="text">
+ <string>Filters</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>352</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>159</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>doChecksum</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>label_9</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>583</x>
+ <y>136</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>109</x>
+ <y>161</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>doChecksum</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>checksumOnlyOnError</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>594</x>
+ <y>136</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>586</x>
+ <y>161</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>doChecksum</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>label_10</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>641</x>
+ <y>136</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>132</x>
+ <y>186</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>doChecksum</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>checksumIgnoreIfImpossible</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>665</x>
+ <y>136</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>609</x>
+ <y>186</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/copyEngineResources.qrc b/plugins/CopyEngine/Ultracopier/copyEngineResources.qrc
new file mode 100644
index 0000000..0228c74
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/copyEngineResources.qrc
@@ -0,0 +1,8 @@
+<RCC>
+ <qresource prefix="/CopyEngine/Ultracopier">
+ <file>resources/add.png</file>
+ <file>resources/edit.png</file>
+ <file>resources/remove.png</file>
+ <file>resources/filter.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins/CopyEngine/Ultracopier/debugDialog.ui b/plugins/CopyEngine/Ultracopier/debugDialog.ui
new file mode 100644
index 0000000..80fde7e
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/debugDialog.ui
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>debugDialog</class>
+ <widget class="QWidget" name="debugDialog">
+ <property name="geometry">
+ <rect>
+ <width>665</width>
+ <height>392</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Monitor</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string notr="true">Transfer thread</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QListWidget" name="transferThreadList">
+ <property name="uniformItemSizes">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string notr="true">Transfer list</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QListWidget" name="tranferList">
+ <property name="uniformItemSizes">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string notr="true">Variables</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string notr="true">Active transfer:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="spinBoxActiveTransfer">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="maximum">
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string notr="true">Number of inode manipuled:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="spinBoxNumberOfInode">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="maximum">
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/documentation.dox b/plugins/CopyEngine/Ultracopier/documentation.dox
new file mode 100644
index 0000000..5a0fbf6
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/documentation.dox
@@ -0,0 +1,39 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage Copy engine
+
+ \section mainpage_overview Overview
+
+ The default copy engine for Ultracopier. Support file/folder, copy/move, ...\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>.
+
+ \section mainpage_platforms Platforms
+
+ This plugin might be usable in all environments where you find Qt 5, but Gcc is requiered for some part. You need qtsystem modules for QtSystemInfo\n
+ This plugin requires Qt 5.0 or newer. Tested on Qt 5.0.\n
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section mainpage_algorithm Algorithm
+
+ Like say previously you will have more informations on the wiki.\n
+ Then file transfer is done via pipe mecamism system:\n
+ <ul>
+ <li>push at no blocking into table up to the table is full, after is blocked up to one entry is free</li>
+ <li>Other thread read the table up to have no more data, then is blocked</li>
+ </ul>
+ The transfer thread do listing of the folder, removing folder, make folder is one thread for each.\n
+ The transfer list, have thread pool to do the inode operation (open, close, set date, ...). Do all inode operation in parallele, but transfer the data as sequential.
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.
+
+*/
diff --git a/plugins/CopyEngine/Ultracopier/fileErrorDialog.ui b/plugins/CopyEngine/Ultracopier/fileErrorDialog.ui
new file mode 100644
index 0000000..b603924
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/fileErrorDialog.ui
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>fileErrorDialog</class>
+ <widget class="QWidget" name="fileErrorDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>723</width>
+ <height>185</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Error with file</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Error</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label_error">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::ExpandingFieldsGrow</enum>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_size">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_size">
+ <property name="text">
+ <string notr="true">0 KiB</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_file_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>File name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_file_name">
+ <property name="text">
+ <string notr="true">source.txt</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_file_destination">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Destination</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="label_content_file_destination">
+ <property name="text">
+ <string notr="true">../toto.txt</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_folder">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="label_content_folder">
+ <property name="text">
+ <string notr="true">/folder/</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="checkBoxAlways">
+ <property name="text">
+ <string>&amp;Always perform this action</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Rights">
+ <property name="text">
+ <string>Try in with elevated privileges</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="PutToBottom">
+ <property name="text">
+ <string>Put to bottom</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Retry">
+ <property name="text">
+ <string>Retry</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Skip">
+ <property name="text">
+ <string>&amp;Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Cancel</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>112</x>
+ <y>131</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>438</x>
+ <y>142</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Retry</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>155</x>
+ <y>131</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>309</x>
+ <y>134</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/fileExistsDialog.ui b/plugins/CopyEngine/Ultracopier/fileExistsDialog.ui
new file mode 100644
index 0000000..0c38a57
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/fileExistsDialog.ui
@@ -0,0 +1,412 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>fileExistsDialog</class>
+ <widget class="QWidget" name="fileExistsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>469</width>
+ <height>162</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>The file exists</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Source</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Destination</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_source_size">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_source_size">
+ <property name="text">
+ <string notr="true">0 KiB</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_source_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_source_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_source_file_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>File name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_source_file_name">
+ <property name="text">
+ <string notr="true">source.txt</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="label_content_source_folder">
+ <property name="text">
+ <string notr="true">/source/</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::ExpandingFieldsGrow</enum>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_destination_size">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_destination_size">
+ <property name="text">
+ <string notr="true">0 KiB</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_destination_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_destination_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_destination_file_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>File name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_destination_file_name">
+ <property name="text">
+ <string notr="true">destination.txt</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="label_content_destination_folder">
+ <property name="text">
+ <string notr="true">/destination/</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLineEdit" name="lineEditNewName">
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="placeholderText">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="SuggestNewName">
+ <property name="text">
+ <string>Suggest new &amp;name</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="checkBoxAlways">
+ <property name="text">
+ <string>&amp;Always perform this action</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Rename">
+ <property name="text">
+ <string>&amp;Rename</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="Overwrite">
+ <property name="text">
+ <string>&amp;Overwrite</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::MenuButtonPopup</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Skip">
+ <property name="text">
+ <string>&amp;Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ <action name="actionOverwrite_if_newer">
+ <property name="text">
+ <string>Overwrite if newer</string>
+ </property>
+ </action>
+ <action name="actionOverwrite_if_not_same_modification_date">
+ <property name="text">
+ <string>Overwrite if modification date differs</string>
+ </property>
+ <property name="toolTip">
+ <string>Overwrite if modification date differs</string>
+ </property>
+ </action>
+ <action name="actionOverwrite_if_older">
+ <property name="text">
+ <string>Overwrite if older</string>
+ </property>
+ <property name="toolTip">
+ <string>Overwrite if older</string>
+ </property>
+ </action>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Cancel</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>115</x>
+ <y>130</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>440</x>
+ <y>129</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lineEditNewName</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>62</x>
+ <y>129</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>108</x>
+ <y>93</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SuggestNewName</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>144</x>
+ <y>138</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>326</x>
+ <y>98</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/fileIsSameDialog.ui b/plugins/CopyEngine/Ultracopier/fileIsSameDialog.ui
new file mode 100644
index 0000000..c019a63
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/fileIsSameDialog.ui
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>fileIsSameDialog</class>
+ <widget class="QWidget" name="fileIsSameDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>411</width>
+ <height>142</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>The source and destination are same</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_size">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_size">
+ <property name="text">
+ <string notr="true">0 KiB</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_file_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>File name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_file_name">
+ <property name="text">
+ <string notr="true">source.txt</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="label_content_folder">
+ <property name="text">
+ <string notr="true">/toto/</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLineEdit" name="lineEditNewName">
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="placeholderText">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="SuggestNewName">
+ <property name="text">
+ <string>Suggest new &amp;name</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="checkBoxAlways">
+ <property name="text">
+ <string>&amp;Always perform this action</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Rename">
+ <property name="text">
+ <string>&amp;Rename</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Skip">
+ <property name="text">
+ <string>&amp;Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/folderExistsDialog.ui b/plugins/CopyEngine/Ultracopier/folderExistsDialog.ui
new file mode 100644
index 0000000..440b5ca
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/folderExistsDialog.ui
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>folderExistsDialog</class>
+ <widget class="QDialog" name="folderExistsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>476</width>
+ <height>140</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>The source and destination is identical</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label_source">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Source</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_destination">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Destination</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_source_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_source_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_source_folder_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_source_folder_name">
+ <property name="text">
+ <string notr="true">folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_source_folder">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_source_folder">
+ <property name="text">
+ <string notr="true">/source/</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_destination_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_destination_folder_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_destination_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_destination_folder_name">
+ <property name="text">
+ <string notr="true">folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_destination_folder">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_destination_folder">
+ <property name="text">
+ <string notr="true">/destination/</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLineEdit" name="lineEditNewName">
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="placeholderText">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="SuggestNewName">
+ <property name="text">
+ <string>Suggest new &amp;name</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QCheckBox" name="checkBoxAlways">
+ <property name="text">
+ <string>&amp;Always perform this action</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Rename">
+ <property name="text">
+ <string>&amp;Rename</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Merge">
+ <property name="text">
+ <string>Merge</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Skip">
+ <property name="text">
+ <string>Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>lineEditNewName</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>132</x>
+ <y>126</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>135</x>
+ <y>101</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>SuggestNewName</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>113</x>
+ <y>129</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>304</x>
+ <y>100</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier/informations-rsync.xml b/plugins/CopyEngine/Ultracopier/informations-rsync.xml
new file mode 100644
index 0000000..43befc2
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/informations-rsync.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <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 -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>linux-x86_64-pc</architecture>
+ <!-- Detailed 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>1.0.0.0</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Rsync</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins/CopyEngine/Ultracopier/informations.xml b/plugins/CopyEngine/Ultracopier/informations.xml
new file mode 100644
index 0000000..7968ca8
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Copy engine of Ultracopier]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier]]></title>
+ <!-- What kind of plugin this is -->
+ <category>CopyEngine</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Copy engine of Ultracopier, do in Qt for all platform, and copy by stream]]></description>
+ <description xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier, fait en Qt pour toutes les plateformes, et copie par stream]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Ultracopier</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins/CopyEngine/Ultracopier/plugin.json b/plugins/CopyEngine/Ultracopier/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins/CopyEngine/Ultracopier/resources/add.png b/plugins/CopyEngine/Ultracopier/resources/add.png
new file mode 100644
index 0000000..7932127
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/resources/add.png
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/resources/edit.png b/plugins/CopyEngine/Ultracopier/resources/edit.png
new file mode 100644
index 0000000..5464856
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/resources/edit.png
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/resources/filter.png b/plugins/CopyEngine/Ultracopier/resources/filter.png
new file mode 100644
index 0000000..9bb3164
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/resources/filter.png
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/resources/remove.png b/plugins/CopyEngine/Ultracopier/resources/remove.png
new file mode 100644
index 0000000..b711740
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier/resources/remove.png
Binary files differ
diff --git a/plugins/Languages/ar/flag.png b/plugins/Languages/ar/flag.png
new file mode 100644
index 0000000..538c4f9
--- /dev/null
+++ b/plugins/Languages/ar/flag.png
Binary files differ
diff --git a/plugins/Languages/ar/informations.xml b/plugins/Languages/ar/informations.xml
new file mode 100644
index 0000000..fcaf807
--- /dev/null
+++ b/plugins/Languages/ar/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to arabic]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier-ar.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to arabic. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>ar</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[العربية]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Arabic]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[ar]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[ar_AR]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/ar/translation.ts b/plugins/Languages/ar/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/ar/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/de/flag.png b/plugins/Languages/de/flag.png
new file mode 100644
index 0000000..a096a1c
--- /dev/null
+++ b/plugins/Languages/de/flag.png
Binary files differ
diff --git a/plugins/Languages/de/informations.xml b/plugins/Languages/de/informations.xml
new file mode 100644
index 0000000..7818c1c
--- /dev/null
+++ b/plugins/Languages/de/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to german]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to german. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>de</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Deutsch]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[German]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[de]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[de_DE]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/de/translation.ts b/plugins/Languages/de/translation.ts
new file mode 100644
index 0000000..7e64330
--- /dev/null
+++ b/plugins/Languages/de/translation.ts
@@ -0,0 +1,1277 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="de" sourcelanguage="en">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation>Warnung</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation>Ultracopier wird bereits ausgeführt. Klicken Sie mit der rechten Maustase auf das Icon im Infobereich der Taskleiste</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation>Lesefehler, oder Dateigröße=0</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation>Mögliche Werte sind:</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation>Optionen anzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation>Ungültiger Befehl</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translatorcomment>The original english text does not make sense.</translatorcomment>
+ <translation>Diese Datei wird nicht unterstützt Transferliste</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation>Die Transferlistendatei kann nicht geöffnet werden</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation>Um diese Hilfe anzuzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation>Um andere Instanzen zu beenden (falls laufend)</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation>Transferliste öffnen</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation>Hilfe</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>Warnung</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation>Finde keine kompatible Engine!</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation>Finde keine Engine mit diesem Namen: %1</translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation>Fehler während Empfang der Kopier/Verschieben-Liste
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation>Bekomme keine Instanz der Kopier-Engine</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation>Bekomme keine Instanz der Engine</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation>Die Parameter sind in diesem Modus ungültig</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation>Möchten Sie kopieren? Wenn nicht, wird verschoben.</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation>Konnte Oberfläche nicht laden. Kopiervorgang abgebrochen</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation>Konnte Kopier-Engine nicht laden. Kopiervorgang abgebrochen</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation>Transfermodus</translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation>Kopier-Engine</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation>Kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation>Verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation>Pause</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation>Fortsetzen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation>Überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation>Unbegrenzt</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translatorcomment>seconds?</translatorcomment>
+ <translation>s</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation>Zu groß</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translatorcomment>Byte?</translatorcomment>
+ <translation>B</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translatorcomment>Kilobyte</translatorcomment>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translatorcomment>Megabyte</translatorcomment>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translatorcomment>Gigabyte</translatorcomment>
+ <translation>GB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translatorcomment>Terrabyte</translatorcomment>
+ <translation>TB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translatorcomment>Petabyte</translatorcomment>
+ <translation>PB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translatorcomment>Etabyte</translatorcomment>
+ <translation>EB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translatorcomment>Zetabyte</translatorcomment>
+ <translation>ZB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translatorcomment>Yotabyte</translatorcomment>
+ <translation>YB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation>Weniger als %10 Sekunden</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation>Ungefähr noch %10 Sekunden</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation>Ungefähr noch %1 Minuten</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation>Ungefähr noch %1 Stunden</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translatorcomment>evtl. &quot;Datenübertragung&quot;, aber ich denke &quot;Transfer&quot; ist hier besser</translatorcomment>
+ <translation>Transfer</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation>Start</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation>Quelle</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation>Größe</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation>Ziel</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation>Beenden</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation>Ziel</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation>Verbleibende Zeit:</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation>Auflistung</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation>Kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translatorcomment>not sure... depends on context</translatorcomment>
+ <translation>Auflistung und Kopiervorgang</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation>Fragen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation>Überschreiben</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation>Überschreiben, falls neuer</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation>Überschreiben, falls die letzten Änderungsdaten unterschiedlich sind</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation>Umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation>Ans Ende der Liste verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation>Fertig in %1</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation>Wählen Sie das Quellverzeichnis</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation>Wählen Sie das Zielverzeichnis</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation>Interner Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation>Wählen Sie eine oder mehrere Dateien zum Öffnen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation>Alle Dateien</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation>Transferliste speichern</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation>Transferliste öffnen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation>Transferliste</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation>Auf dieser Plattform nicht unterstützt</translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation>Über Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation>Basiert auf Qt. Erweitertes Tool um Dateien zu kopieren (Lizenz: GPLv3).
+Diese Version wurde kompiliert als Version: %1.</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation>Plattform: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation>Über Qt</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translatorcomment>Clumsy... depends on context</translatorcomment>
+ <translation>Absturz ausführen</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation>Fehlerbericht speichern</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation>Zu http://portableapps.com/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation>Portable und &quot;Alles-in-Einem&quot; Version</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation>Portable Version</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation>&quot;Alles-in-Einem&quot; Version</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation>Normale Version</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation>http://ultracopier-de.first-world.info/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation>http://ultracopier.first-world.info/download.html</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Weitere Informationen finden Sie auf der 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;</translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation>Warnung</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation>Timeout beim Zusammenfügen der Daten von verbundenen Clients</translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation>Log-Datei ist bereits geöffnet, Fehler: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation>Kann Log-Datei nicht öffnen. Fehler: %1</translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation>Warnung</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation>Nicht mehr anzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>Das Ersetzen des Standard Kopier/Verschieben-Systems wird von diesem Datei-Manager nicht unterstützt.&lt;br /&gt;Bitten Sie die Entwickler darum es zu supporten. &lt;br /&gt;Sie müssen das Kopieren/Verschieben daher manuell durchführen.</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation>System neustarten, Falls vorher ähnliche Software instaliert war (wie Teracopy, Supercopier oder ältere Version von Ultracopier).</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation>Das Ersetzen des Standard Kopier/Verschieben-Systems wird vom Mac OS X Finder nicht unterstützt und somit verhindert.&lt;br /&gt;Sie müssen das Kopieren/Verschieben daher manuell durchführen.</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>Das Ersetzen des Standard Kopier/Verschieben-Systems wird von diesem File-Manager nicht unterstützt.&lt;br /&gt;Bitten Sie die Entwickler darum es zu supporten. &lt;br /&gt;Sie müssen das Kopieren/Verschieben daher manuell durchführen.</translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation>Optionen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation>Allgemein</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation>Plugins</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation>Kopier-Engine</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation>Themes</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation>Log</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation>Gruppieren der Fenster bestätigen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation>Nach Updates suchen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation>Version</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation>Sprache</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation>Listener</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation>Plugin loader</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation>Session loader</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation>Sprache wählen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation>Standard Kopier- und Verschiebebefehl ersetzen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation>Mit OS laden</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation>Bei manuellem Start</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation>Fenster gruppieren</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation>OS Warnungen anzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation>Der GPU Zeit geben, um die Entwicklung zu finanzieren</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation>Plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation>Hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation>Entfernen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation>Information</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation>Kopier-Engine in Reihenfolge ihrer Präferenz:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation>Client verbunden</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation>Themes:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation>Konnte das Themes-Plugin nicht laden</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation>Durchsuchen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation>Die Variablen sind %time%, %source%, %size%, %destination%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation>Die Variablen sind %time%, %path%, %size%, %mtime%, %error%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation>Log in folgende Datei schreiben:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation>Schreibe direkt in die Datei, wenn ein neuer Eintrag erreicht wird (50% Leistungsverlust möglich)</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation>Laden</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation>Theme laden?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation>Sprache laden?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation>Nichts tun</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation>Nach Quell-Ordner fragen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation>Nach Quell-Datei fragen</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation>Nie</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation>Falls Quelle gleich ist</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation>Falls Ziel gleich ist</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation>Falls Quelle und Ziel gleich sind</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation>Falls Quelle oder Ziel gleich sind</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation>Immer</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation>Die Variablen sind %1</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation>Protokolle speichern als: </translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation>Synchronisiertes Protokoll</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation>Keine Option für dieses Plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation>Protokolliere Transfers:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation>Protokolliere Fehler:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation>Protokolliere Ordner-Operationen:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation>Die Variablen sind %path% %operation%</translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation>Variablen nicht gefunden: %1 %2</translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation>Über dieses Plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation>Name:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation>Kategorie:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation>Autor:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation>Datum:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation>Beschreibung:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation>Version:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation>Kopier-Engine</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation>Sprachen</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation>Listener</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation>Plugin-Loader</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation>Session-Loader</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation>Themes</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation>Informationen über %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation>Webseite:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation>Titel:</translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation>Auf &quot;informations.xml&quot; kann nicht zugegriffen werden</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translatorcomment>clumsy.</translatorcomment>
+ <translation>Abhängigkeiten-Teil ist falsch</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation>Die Abhängigkeiten &quot;%1&quot; sind nicht erfüllt für Plugin:%2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation>Entferne %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation>Information</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation>%1, Parser-Fehler in Zeile %2, Spalte %3: %4</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation>&quot;informations.xml&quot; für das Plugin nicht gefunden</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation>&quot;package&quot; Root-Tag für die XML-Datei nicht gefunden</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation>Plugin-Duplikat gefunden. Bereits geladen!</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation>Englischer Text fehlt in &quot;informations.xml&quot; für das Tag: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation>XML-Tag nicht gefunden: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation>Sind Sie sicher, dass Sie &quot;%1&quot; in der Version %2 entfernen wollen?</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation>Vorheriger Import wird durchgeführt...</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation>Ultracopier Plugin öffnen</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation>Ultracopier plugin (*.urc)</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation>Plugin-Loader</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation>Kann das Plugin nicht öffnen: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation>Kann Plugin-Inhalte nicht laden. Bitte überprüfen Sie das: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation>Kann keinen Ordner erstellen um das Plugin %1 zu installieren
+</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation>Kann eine Datei nicht erstellen um das Plugin zu installieren:
+%1
+seit: %2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation>Ordner mit demselben Namen existiert bereits. Überspringen Sie die Plugin-Installation:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation>Kann Plugin-Inhalte nicht laden. Bitte überprüfen Sie das</translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation>Speicherzuordnung fehlgeschlagen</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation>Schreibfehler</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation>Grenze des Speicherverbrauchs erreicht</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation>Keine .xz-Datei</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation>Nicht-unterstützte Optionen in den .xz-Headern</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation>Die Datei ist beschädigt</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation>Bug!</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation>Die Eingabedaten sind zu kurz</translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished">Keine Kopie-Listener gefunden. Führen Sie die Kopie manuell durch Rechtsklick auf das Symbol im Systray aus.</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished">Information</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished">Suche Informationen ...</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished">Explorer:-Kopieren/Verschieben nicht ersetzen</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished">Explorer: Kopieren/Verschieben teilweise ersetzen</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished">Explorer:-Kopieren/Verschieben ersetzen</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/el/flag.png b/plugins/Languages/el/flag.png
new file mode 100644
index 0000000..cd96374
--- /dev/null
+++ b/plugins/Languages/el/flag.png
Binary files differ
diff --git a/plugins/Languages/el/informations.xml b/plugins/Languages/el/informations.xml
new file mode 100644
index 0000000..dc30cef
--- /dev/null
+++ b/plugins/Languages/el/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to greek]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to greek. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>el</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[ελληνικά]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Greek]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[el]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[el_EL]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/el/translation.ts b/plugins/Languages/el/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/el/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/es/flag.png b/plugins/Languages/es/flag.png
new file mode 100644
index 0000000..4cb4c0a
--- /dev/null
+++ b/plugins/Languages/es/flag.png
Binary files differ
diff --git a/plugins/Languages/es/informations.xml b/plugins/Languages/es/informations.xml
new file mode 100644
index 0000000..2113692
--- /dev/null
+++ b/plugins/Languages/es/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to spanish]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier-es.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to spanish. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>es</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Español]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Spanish]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[es]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[es_ES]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/es/translation.ts b/plugins/Languages/es/translation.ts
new file mode 100644
index 0000000..c901398
--- /dev/null
+++ b/plugins/Languages/es/translation.ts
@@ -0,0 +1,1266 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="es">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation>Advertencia</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation>Ultracopier ya se está ejecutando, haga clic derecho sobre el icono de la bandeja del sistema (cerca del reloj) para poder utilizarlas</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation>Problema al leer el archivo, o el tamaño del archivo es 0</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation>Los argumentos posibles son:</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation>Para mostrar las opciones</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>Para copiar las fuentes a destino, separados por un espacio. Si el destino es &quot;?&quot;, Ultracopier le preguntará al usuario</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>Para mover las fuentes de destino, separados por un espacio. Si el destino es &quot;?&quot;, Ultracopier le preguntará al usuario</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation>Comando no válido</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation>Este archivo no es compatible con lista de transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation>No se puede abrir el archivo de lista de transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation>Para mostrar esta ayuda</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation>Para salir de los otros casos (si está activo)</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation>Abrir lista de transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation>Ayuda</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>Advertencia</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation>No se puede encontrar un motor compatible!</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation>No se puede encontrar un motor con este nombre: %1</translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation>Error durante la recepción de la lista de copia / movimiento
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation>No se puede obtener una instancia de motor de copia</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation>No se puede obtener una instancia del motor</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation>El argumento para el modo no es válida</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation>¿Quieres copiar? Si no, se puede mover.</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation>No se puede cargar la interfaz, copia abortados</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation>No se puede cargar el motor de copia, copia abortados</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation>Modo de transferencia</translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation>Motor de copia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation>Copia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation>Movimiento</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation>Pausa</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation>Resumen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation>Salto</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation>Ilimitado</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation>s</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation>Demasiado grande</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation>GB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation>TB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation>PB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation>EB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation>ZB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation>YB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation>Menos de %10 segundos</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation>Alrededor de %10 segundos restantes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation>Alrededor de %1 minutos restantes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation>Alrededor de %1 las horas restantes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation>Transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation>Iniciar</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation>Origen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation>Tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation>Destino</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation>Abandonar</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation>Objetivo</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation>Tiempo restante:</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation>Listado</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation>Copia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation>Listado y copia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation>Pedir</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation>Sobrescribir</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation>Sobrescribir si nuevo</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation>Sobrescribir si las fechas de modificación últimos son diferentes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation>Ponga al final de la lista</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation>Terminado en %1</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation>Seleccione el directorio de origen</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation>Seleccione el directorio de destino</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation>Error interno</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation>Seleccione uno o varios archivos para abrirlos</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation>Todos los archivos</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation>Guardar lista de transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation>Abrir lista de transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation>Lista de transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation>No es compatible con esta plataforma</translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation>Acerca Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation>Basado en Qt. Utilidad avanzada para copiar los archivos bajo licencia GPL3.
+Esta versión está compilada en versión:%1.</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation>Plataforma: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation>Acerca de Qt</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation>Hacer a crash</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation>Guardar informe de error</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation>Cerrar</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation>Para http://portableapps.com/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation>Portable y todo en una versión</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation>Version portable</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation>Todo en una sola versión</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation>Version normal</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation>http://ultracopier-es.first-world.info/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation>http://ultracopier-es.first-world.info/descarga.html</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Para obtener más información, consulte el sitio web &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;</translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation>Advertencia</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation>Tiempo de espera, mientras que la recomposición de datos de los clientes conectados</translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation>Entrar archivo ya está abierto, error: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation>No se puede abrir el archivo de registro, error: %1</translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation>Advertencia</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation>No mostrar de nuevo</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>La sustitución de la copia default / sistema de movimiento no está soportado por el gestor de archivos (Dolphin, Nautilus, ...). &lt;br /&gt; Pregunte al desarrollador para apoyarlo. &lt;br /&gt; Es necesario hacer el copiar / mover manualmente.</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation>Reinicie el sistema si previamente se había instalado software similar (como TeraCopy, SuperCopier o una versión anterior de Ultracopier).</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation>La sustitución de la copia default / sistema de movimiento no se admite y bloquea buscador de Mac OS X. &lt;br /&gt; Es necesario hacer el copiar / mover manualmente haciendo clic derecho sobre el icono de la bandeja del sistema, cerca del reloj (no el icono del Dock).</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>La sustitución de incumplimiento de copiar / mover sistema no debe ser soportado por el gestor de archivos. &lt;br /&gt; Pregunte al desarrollador para apoyarlo. &lt;br /&gt; Usted necesita hacer el copiar / mover manualmente.</translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation>Opciones</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation>Plugins</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation>Motor de copia</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation>Themas</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation>Log</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation>Confirmar al grupo de las ventanas</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation>Buscar actualizaciones</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation>Nombre</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation>Version</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation>Lenguaje</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation>Oyente</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation>Plugin cargador</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation>Sesión cargador</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation>Forzar el idioma</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation>Sustituto del sistema de copia</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation>Carga en la carga de la sesión</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation>Cuando apertura manual</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation>Grupo de las ventanas cuando</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation>Muestra la advertencia OS</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation>Dar tiempo GPU para financiar el desarrollo</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation>Plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation>Añadir</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation>Eliminar</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation>Información</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation>Copia del motor por orden de preferencia:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation>Cliente conectado</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation>Temas:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation>No se puede cargar el plugin temas</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation>No hay ninguna opción para este plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation>Navegar</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation>Escriba las transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation>Escriba la carpeta de las operaciones</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation>Las variables son %time%, %source%, %size%, %destination%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation>Escribir los errores</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation>Las variables son %time%, %path%, %size%, %mtime%, %error%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation>Escribir el archivo de registro en:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation>Escriba directamente el archivo cuando se recibe una nueva entrada (se puede producir un 50% de pérdida de rendimiento)</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation>Cargar</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation>Cargue el tema?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation>Cargue el idioma?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation>No hacer nada</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation>Pregunte a la fuente que la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation>Pregunte a las fuentes como archivos</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation>Nunca</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation>Cuando la fuente es la misma</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation>Cuando destino es el mismo</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation>Cuando la fuente y el destino son los mismos</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation>Cuando la fuente o el destino son los mismos</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation>Siempre</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation>Las variables son %1</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation>Guardar registros como: </translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation>Registro de sincronizada</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation>Las variables son %path%, %operation%</translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation>La variable no se ha encontrado: %1 %2</translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation>Acerca de este plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation>Nombre:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation>Categoría:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation>Autor:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation>Fecha:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation>Descripción:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation>Versión:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation>Motor de copia</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation>Idiomas</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation>Oyente</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation>Plugin cargador</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation>Sesión cargador</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation>Themas</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation>Información sobre %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation>Sitio Web:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation>Título:</translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation>informations.xml no es accesible</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation>Parte las dependencias se equivoca</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation>Dependencias %1 no está satisfecho, para el plugin:%2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation>Eliminar %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation>Información</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation>%1, error de análisis en la línea %2, la columna %3: %4</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation>informations.xml no se encuentra el plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation>&quot;package&quot; etiqueta raíz que no se encuentra el archivo xml</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation>Plugin de duplicados encontrados, ya está cargado!</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation>Texto Inglés falta en el informations.xml para la etiqueta: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation>Etiqueta no encontrada: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation>¿Estás seguro de eliminar &quot;%1&quot; en la versión %2?</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation>Previo de importación está en curso ...</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation>Abrir Plugin Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation>Ultracopier plugin (*.urc)</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation>Plugin cargador</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation>No se puede abrir el plugin: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation>No se puede cargar el contenido del plugin, por favor verifique que: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation>No se puede crear una carpeta para instalar el plugin:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation>No se puede crear un archivo para instalar el plugin:
+%1
+desde: %2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation>Carpeta con el mismo nombre está presente, no tome la instalación del plugin:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation>
+
+SpanishFrenchEnglish
+
+No se puede cargar el contenido del plugin, por favor verifique que</translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation>La asignación de memoria no</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation>Error de escritura</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation>Limitar el uso de la memoria alcanza</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation>No es un. Xz archivo</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation>Opciones no admitidas en los encabezados. Xz</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation>El archivo está dañado</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation>Bug!</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation>Los datos de entrada es demasiado corto</translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished">Información</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished">Buscar información...</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished">No sustituya la copia explorer/move</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished">Semi reemplazar la copia explorer/mudanza</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished">Vuelva a colocar la copia explorer/mudanza</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/fr/flag.png b/plugins/Languages/fr/flag.png
new file mode 100644
index 0000000..95c8921
--- /dev/null
+++ b/plugins/Languages/fr/flag.png
Binary files differ
diff --git a/plugins/Languages/fr/informations.xml b/plugins/Languages/fr/informations.xml
new file mode 100644
index 0000000..437ea90
--- /dev/null
+++ b/plugins/Languages/fr/informations.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to French]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Traduction d'ultracopier en Français]]></title>
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info), David Sferruzza (david.sferruzza@gmail.com)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to French. For more details see the web site.]]></description>
+ <description xml:lang="fr"><![CDATA[Traduction d'ultracopier en Français. Pour plus de détails regardez le site web]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>fr</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Français]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[French]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[fr]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[fr_FR]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/fr/translation.ts b/plugins/Languages/fr/translation.ts
new file mode 100644
index 0000000..77868c0
--- /dev/null
+++ b/plugins/Languages/fr/translation.ts
@@ -0,0 +1,1265 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr" sourcelanguage="en">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation>Avertissement</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation>Ultracopier est déjà lancé! Cliquez droit sur l&apos;icône de la zone de notifications (près de l&apos;horloge) pour l&apos;utiliser</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation>Problème à la lecture, ou taille de fichier nulle</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation>Les arguments possible sont:</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation>Afficher les options</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>Pour copier les sources vers la destination, séparées par des espaces. Si la destination est &quot;?&quot;, Ultracopier demandera à l&apos;utilisateur</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>Pour copier les sources vers la destination, séparées par des espaces. Si la destination est &quot;?&quot;, Ultracopier demandera à l&apos;utilisateur</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation>Ligne de commande invalide</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation>Ce fichier n&apos;est pas une list de transfert supporté</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation>Impossible d&apos;ouvrir le fichier de liste de transfert</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation>Pour afficher cette aide</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation>Pour quiter l&apos;autre instance en cour</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation>Ouvrir la liste de transfert</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation>Aide</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>Avertissement</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation>Impossible de trouver un moteur avec le support du déplacement</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation>Ce moteur de copie ne supporte pas les déplacements</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation>Impossible de trouver un moteur de copie compatible!</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation>Impossible de trouver un moteur portant ce nom: %1</translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation>Erreur pendant la réception de la liste de copy/déplacement
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation>Impossible d&apos;obtenir une instance du moteur de copie</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation>Grouper des fenêtres</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation>Voulez vous grouper le transfert avec le transfert actuel?</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation>Impossible d&apos;otenir une instance du moteur de copie</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation>L&apos;argument pour le mode n&apos;est pas valide</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation>Voulez vous faire une copie? Si vous repondez non alors il sera déplacé.</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation>Impossible de charger l&apos;interface, copie annulée</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation>Impossible de charger le moteur de copie, copie annulée</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation>Mode de transfert</translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation>Clef</translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation>Donnez la clef de ce logiciel, plus d&apos;information sur &lt;a href=&quot;http://ultracopier-fr.first-world.info/&quot;&gt;ultracopier-fr.first-world.info&lt;/a&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation>Moteur de copie</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation>Copie</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation>Déplacer</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation>Pause</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation>Reprendre</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation>Illimité</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation>s</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation>Trop grand</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation>o</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation>Ko</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation>Mo</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation>Go</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation>To</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation>Po</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation>Eo</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation>Zo</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation>Yo</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation>Moins de %10 secondes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation>Environ %10 secondes restantes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation>Environ %1 minutes restantes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation>Environ %1 heures restantes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation>Transfert</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation>Démarrer</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation>Source</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation>Destination</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation>Quitter</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation>Cible</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation>Temps restant:</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translatorcomment>Création de la liste? Listage?</translatorcomment>
+ <translation>Listing</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translatorcomment>Copie en cour -&gt; copying in progress</translatorcomment>
+ <translation>Copie</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation>Listing et copie</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation>Demander</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation>Écraser</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation>Écraser si plus récent</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation>Écraser si les dates de modification sont différentes</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation>Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation>Mettre à la fin</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation>Fini en %1</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation>Sélectionner un dossier source</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation>Sélectionner un dossier de destination</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation>Erreur interne</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation>Sélectionner un ou des fichiers à ouvrir</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation>Tous les fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation>Sauvegarder la liste de transfert</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation>Ouvrir la liste de transfert</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation>Liste de transfert</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation>Pas supporté sur cette platforme</translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation>À propos d&apos;Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation>Basé sur Qt. Utilitaire avancé de copie de fichiers sous licence GPL3.
+Cette version est compilée comme version : %1.</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation>Plateforme: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation>À propos de Qt</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation>Faire un crash</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation>Sauver le rapport</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation>Fermer</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation>Pour http://portableapps.com/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation>Portable et tout en un</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation>Version portable</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation>Tout en un</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation>Version normale</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation>http://ultracopier-fr.first-world.info/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation>http://ultracopier-fr.first-world.info/shop.html</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation>http://ultracopier-fr.first-world.info/telecharger.html</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pour plus d&apos;informations voir le site &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;</translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation>Avertissement</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation>Timeout pendant la recompossition des données des clients connectés</translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation>Fichier de log déjà ouvert, erreur: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation>Impossible d&apos;ouvrir le fichier de log, erreur: %1</translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation>Avertissement</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation>Ne plus afficher</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>Le remplacement du systéme de copie/déplacement n&apos;est pas supporté par le gestionnaire de fichier (Dolphin, Nautilus, ...).&lt;br /&gt;Demander aux developpeurs de le supporter.&lt;br /&gt;Vous devez faire la copie/déplacement manuellement.</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation>Redémarrer le système si précédemment vous avez installé un logiciel similaire (comme Teracopy, Supercopier ou une version précédente d&apos;Ultracopier).</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation>Le remplacement du systéme de copie/déplacement n&apos;est pas supporté et bloqué par le finder de Mac OS X.&lt;br /&gt;Vous devez faire la copie/déplacement manuellement en cliquant sur l&apos;icone du systray à coté de l&apos;heure (pas l&apos;icone du dock).</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>Le remplacement du systéme de copie/déplacement n&apos;est pas supporté par le gestionnaire de fichier.&lt;br /&gt;Demander aux developpeurs de le supporter.&lt;br /&gt;Vous devez faire la copie/déplacement manuellement.</translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation>Général</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation>Plugins</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation>Moteurs de copie</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation>Thèmes</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation>Logs</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation>Confirmer pour grouper les fenêtres</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation>Vérifier les mise à jour</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation>Version</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation>Langue</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation>Écouteur</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation>Chargeur de plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation>Chargeur de session</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation>Forcer la langue</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation>Remplacer le système de copie/déplacement par défaut</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation>Lancer à l&apos;ouverture de la session</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation>Quand ouverture manuel</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation>Grouper les fenêtres quand</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation>Afficher les avertissements de l&apos;OS</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation>Donnez du temps GPU pour financer le développement</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation>Algorithme de temps restant</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation>Traditionnel</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation>Logarithmique</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation>Plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation>Ajouter</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation>Supprimer</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation>Informations</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation>Moteurs de copie par ordre de préférence:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation>Client connecté</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation>Thèmes:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation>Impossible de charger le plugin des thèmes</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation>Pas d&apos;options pour ce plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation>Parcourir</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation>Écrire les transferts</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation>Écrire les opérations dossier</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation>Les variables sont %time%, %source%, %size%, %destination%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation>Écrire les erreurs</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation>Les variables sont %time%, %path%, %size%, %mtime%, %error%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation>Écrire le fichier journal dans:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation>Écrire directement le fichier quand il reçoit une nouvelle entrée (peut entrainer 50% de perte de performances)</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation>Charger</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation>Charger le thème?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation>Charger la langue?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation>Ne rien faire</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation>Demander la source comme un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation>Demander la sources comme des fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation>Jamais</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation>Quand la source est la même</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation>Quand la destination est la même</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation>Quand la destination et la source sont les mêmes</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation>Quand la destination ou la source sont les mêmes</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation>Toujours</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation>Les variables sont %1</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation>Sauvegarder les logs sous: </translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation>Log synchronisé</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation>Les variables sont %path%, %operation%</translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation>La variable n&apos;a pas été trouvée: %1 %2</translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation>À propos de ce plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation>Nom:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation>Catégorie:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation>Auteur:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation>Date:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation>Description:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation>Version:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation>Moteur de copie</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation>Langues</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation>Écouteur</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation>Chargeur de plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation>Chargeur de session</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation>Thèmes</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation>Inconnu</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation>Informations à propos de %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation>Site web:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation>Titre:</translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation>informations.xml n&apos;est pas accessible</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation>Le fichier informations.xml n&apos;a pas été trouvé dans le plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation>Texte anglais manquant dans le informations.xml pour la balise: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation>Les dépendances sont fausses</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation>Des dépendances %1 ne sont pas satisfaites, pour le plugin: %2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation>Chargeur de plugin</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation>Supprimer %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation>Informations</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation>%1, erreur à la ligne %2, à l&apos;emplacement %3: %4</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation>La balise racine &quot;package&quot; n&apos;a pas été trouvée pour le fichier xml</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translatorcomment>Le plugins courrant est un doublont, donc déjà chargé!</translatorcomment>
+ <translation>Plugin dupliqué trouvé, déjà chargé!</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation>Balise non trouvée: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation>Êtes vous sûr de vouloir supprimer &quot;%1&quot; en version %2?</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation>Importation précédente en cours...</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation>Ouvrir un plugin d&apos;Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation>Plugin d&apos;Ultracopier (*.urc)</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation>Impossible d&apos;ouvrir le plugin: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation>Impossible de charger le contenu du plugin, veuillez le vérifier: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation>Impossible de créer un dossier pour installer le plugin:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation>Impossible de créer un fichier pour installer le plugin:
+%1
+depuis:%2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation>Le répertoire est déjà présent, on saute l&apos;installation du plugin:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation>Impossible de charger le contenu du plugin, veuillez le vérifier</translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation>Allocation mémoire échouée</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation>Erreur d&apos;écriture</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation>Limite de mémoire atteinte</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation>N&apos;est pas un fichier .xz</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation>Options non supportées dans les entêtes des fichiers .xz</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation>Le fichier est corrompu</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation>Bug!</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation>Données d&apos;entrée trop courtes</translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation>Pas d&apos;écouteur trouvé. Effectuez la copie manuellement par clic droit sur l&apos;icône dans la zone de notification (près de l&apos;horloge).</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation>Recherche d&apos;informations...</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation>Ne remplace pas la copie/déplacement de l&apos;explorateur</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation>Remplace partiellement la copie/déplacement de l&apos;explorateur</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation>Remplace la copie/déplacement de l&apos;explorateur</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation>Informations</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/hi/flag.png b/plugins/Languages/hi/flag.png
new file mode 100644
index 0000000..3ac74be
--- /dev/null
+++ b/plugins/Languages/hi/flag.png
Binary files differ
diff --git a/plugins/Languages/hi/informations.xml b/plugins/Languages/hi/informations.xml
new file mode 100644
index 0000000..4c0bc95
--- /dev/null
+++ b/plugins/Languages/hi/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to hindi]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier-es.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to hindi. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>hi</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[हिंदी]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Hindi]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[hi]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[hi_HI]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/hi/translation.ts b/plugins/Languages/hi/translation.ts
new file mode 100644
index 0000000..8b70d26
--- /dev/null
+++ b/plugins/Languages/hi/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="hi">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/hu/flag.png b/plugins/Languages/hu/flag.png
new file mode 100644
index 0000000..5115e8a
--- /dev/null
+++ b/plugins/Languages/hu/flag.png
Binary files differ
diff --git a/plugins/Languages/hu/informations.xml b/plugins/Languages/hu/informations.xml
new file mode 100644
index 0000000..77ddd43
--- /dev/null
+++ b/plugins/Languages/hu/informations.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Hungarian translation of Ultracopier]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Hungarian translation of Ultracopier]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>hu</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Magyar]]></fullName>
+ <!-- No short name, for do translation not found and leave un-translated -->
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[hu]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/hu/translation.ts b/plugins/Languages/hu/translation.ts
new file mode 100644
index 0000000..fb5e79a
--- /dev/null
+++ b/plugins/Languages/hu/translation.ts
@@ -0,0 +1,1263 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="hu">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation>Figyelmeztetés</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation>Az Ultracopier már fut, kattints a jobb egérombbal a tálcaikonjára (az óra mellett) a használatához</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation>Probléma a fájl olvasásánál vagy a fájlméret 0</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation>A lehetséges argumentumok:</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation>A beállítások megjelenítéséhez</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation>Kilépés a többi példányból (ha fut)</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>A forrás másolása a célba, szóközzel elválasztva. Ha a cél &quot;?&quot;, az Ultracopier rákérdez a felhasználónál</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>A forrás mozgatása a célba, szóközzel elválasztva. Ha a cél &quot;?&quot;, az Ultracopier rákérdez a felhasználónál</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation>A parancs nem érvényes</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation>Ez a fájl nem támogatott átviteli lista</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation>Az átviteli listafájl megnyitása nem lehetséges</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation>Ennek a súgónak a megjelenítéséhez</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation>Átviteli lista megnyitása</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation>Súgó</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>Figyelmzetetés</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation>Nem található semmilyen kompatibilis motor!</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation>Nem található motor ezzel a névvel: %1</translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation>Hiba a másolási/mozgatási lista fogadásakor
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation>Nem lehetséges másoló motor példány észlelése</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation>Motor állapot lekérése nem lehetséges</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation>A mód argumentuma nem érvényes</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation>Szeretnél másolni? Ha nem, akkor átmozgatva lesz.</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation>Kezelőfelület betöltése nem lehetséges, másolás megszakítva</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation>Másoló motor betöltése nem lehetséges, másolás megszakítva</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation>Átviteli mód</translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation>mp</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation>Túl nagy</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation>GB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation>TB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation>PB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation>EB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation>ZB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation>YB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation>Kevesebb mint %10 másodperc</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation>Körülbelül %10 másodperc van hátra</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation>Körülbelül %1 perc van hátra</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation>Körülbelül %1 óra van hátra</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation>Másoló motor</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation>Másolás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation>Átvitel</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation>Mozgatás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation>Indítás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation>Szünet</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation>Folytatás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation>Kihagyás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation>Korlátlan</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation>Forrás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation>Méret</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation>Cél</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation>Kilépés</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation>Cél</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation>Hátralévő idő:</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation>Listázás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation>Másolás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation>Listázás és másolás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation>Rákérdez</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation>Felülírás</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation>Felülírás, ha újabb</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation>Felülír, ha az legutóbbi módosítás dátumai különböznek</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation>Átnevezés</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation>Helyezze a lista végére</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation>Válassz forrásmappát</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation>Válassz célmappát</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation>Belső hiba</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation>Válassz egy vagy több fájlt megnyitásra</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation>Minden fájl</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation>Átviteli lista mentése</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation>Átviteli lista megnyitása</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation>Átviteli lista</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation>Ezen a platformon nem támogatott</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation>Befejezve %1 alatt</translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation>Az Ultracopier névjegye</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation>Qt-n alapul. Fejlett eszöz fájlok másolásához GPL3 licensz alatt.
+Ez a verzió a következő verzióként került lefordításra: %1.</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;További információkért lásd a honlapot &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;</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation>Platform: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation>A Qt névjegye</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation>Összeomlás</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation>Hibajelentés mentése</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation>Bezárás</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation>http://portableapps.com/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation>Hordozható és teljes verzió</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation>Hordozható verzió</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation>Teljes verzió</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation>Normál verzió</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation>http://ultracopier.first-world.info/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation>Figyelmeztetés</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation>Időtúllépés történt az adatok összeilesztése közben a kapcsolódott kliensektől</translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation>Naplófájl már meg van nyitva, hiba: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation>Naplófájl megnyitása nem lehetséges, hiba: %1</translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation>Figyelmeztetés</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation>Ne mutassa újra</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation>Rendben</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translatorcomment>Az alapértelmezett másolás/mozgatás rendszer lecserélését nem támogatja a fájlkezelő (Dolphin, Nautilus, ...).&lt;br /&gt;Kérd meg a fejlesztőt, hogy támogassa.&lt;br /&gt;A másolás/mozgatást manuálisan kell elvégezned.</translatorcomment>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation>Indítsd újra a gépet, ha korábban már volt hasonló alkalmazás telepítve (például Teracopy, Supercopier vagy az Ultracopier korábbi verziója).</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation>Az alapértelmezett másoló/mozgató rendszer lecserélését nem támogatott és blokkolja a Mac OS X fejlesztője.&lt;br /&gt;A másolást/mozgatást manuálisan kell elvégezned a tálcaikonra kattintva jobb egérgombbal, az óra mellett.</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>Az alapértelmezett másoló/mozgató rendszer lecserélését nem szabad támogatnia a fájlkezelőnek.&lt;br /&gt;Kérd meg a fejlesztőt, hogy támogassa.&lt;br /&gt;A másolás/mozgatást manuálisan kell elvégezned.</translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation>Beállítások</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation>Általános</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation>Beépülők</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation>Másoló motor</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation>Figyelő</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation>Beépüő betöltő</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation>Folyamat betöltő</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation>Témák</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation>Napló</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation>Ablakok csoportosításának megerősítése</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation>Frissítések keresése</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation>GPU idő kiosztása a fejlesztés támogatásához</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation>Írás közvetlenül a fájlba, ha új bejegyzést kap (akár 50%-kos teljesítménycsökkenést is okozhat)</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation>Név</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation>Nyelv kényszerítése</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation>Alapértelmezett másolás és mozgatás lecserélése</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation>Betöltés a Windows bejelentkezésekor</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation>Kézi megnyitás esetén</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation>Ablakok csoportosítása, ha</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation>Rendszer figyelmeztetés megjelenítése</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation>Verzió</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation>Nyelv</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation>Beépülő</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation>Hozzáadás</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation>Eltávolítás</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation>Információ</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation>Másoló motor tulajdonság szerint:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation>Kliens kapcsolódva</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation>Témák:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation>A témák beépülő betöltése nem lehetséges</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation>Nincs beállítás ehhez a beépülőhöz</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation>Napló írása ide:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation>Tallózás</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation>Szinkronizált napló</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation>Átvitelek írása</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation>Hibák írása</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation>Mappa műveletek írása</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation>A változók: %time%, %source%, %size%, %destination%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation>A változók: %time%, %path%, %size%, %mtime%, %error%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation>A változók: %path%, %operation%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation>Betöltés</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation>Téma betöltése?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation>Nyelv betöltése?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation>Ne tegyen semmit</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation>Rákérdezés a forrás mint mappa</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation>Rákérdezés a forrásokra mint fájlok</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation>Soha</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation>Amikor a forrás ugyanaz</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation>Amikor a cél ugyanaz</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation>Amikor a forrás és a cél ugyanaz</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation>Amikor a forrás vagy cél ugyanaz</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation>Mindig</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation>A változók: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation>Napló mentése mint:</translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation>A változó nem található: %1 %2</translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation>A beépülő névjegye</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation>Név:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation>Kategória:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation>Fejlesztő:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation>Honlap:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation>Dátum:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation>Leírás:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation>Verzió:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation>Cím:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation>Másoló motor</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation>Nyelvek</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation>Figyelő</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation>Beépülő betöltő</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation>Folyamat betöltő</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation>Témák</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation>%1 információi</translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation>informations.xml nem férhető hozzá</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation>%1, elemzési hiba a(z) %2. sorban, %3. oszlopban: %4</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation>&quot;package&quot; gyökércímke nem található az xml fájlban</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation>Duplikált beépülő található, már be van töltve!</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation>informations.xml nem található a beépülőhöz</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation>Angol szöveg hiányzik az informations.xml-ből a címkéhez: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation>Címke nem található: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation>A függőségek rész hibás</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation>A(z) %1 függőségek nem megfelelőek a következő beépülőhöz: %2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation>%1 eltávolítása</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation>Biztosan el akarod távolítani &quot;%1&quot;-t a(z) %2 verzióban?</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation>Információ</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation>Előző importálás folyamatban van...</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation>Ultracopier beépülő megnyitása</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation>Ultracopier beépülő (*.urc)</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation>Beépülő betöltő</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation>Beéülő megnyitása nem lehetséges: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation>Beépülő tartalmának betöltése nem lehetséges, kérlek ellenőrizd: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation>Mappa létrehozása a beépülő telepítéséhez nem lehetséges:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation>Fájl létrehozása a beépülő telepítéséhez nem lehetséges:
+%1
+óta:%2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation>Mappa már létezik ilyen néven, beépülő telepítésének kihagyása:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation>Beépülő tartalmának betöltése nem lehetséges, kérlek ellenőrizd</translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation>Memória allokáció sikertelen</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation>Írási hiba</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation>Memóriahasználat határ elérve</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation>Nem .xz fájl</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation>Nem támogatott beállítások az .xz fejlécben</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation>A fájl hibás</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation>Hiba!</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation>A bemenő adat túl rövid</translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished">Nem található másoló figyelő. Végezd el manuálisan a másolást a jobb egérgombbal a tálcaikonra kattintva.</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished">Információ</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished">Információ keresése...</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished">Ne cserélje le az Intéző másolását/mozgatását</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished">Az Intéző másolás/mozgatás félig lecserélése</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished">Az Intéző másolás/mozgatás lecserélése</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/id/flag.png b/plugins/Languages/id/flag.png
new file mode 100644
index 0000000..e3c0f12
--- /dev/null
+++ b/plugins/Languages/id/flag.png
Binary files differ
diff --git a/plugins/Languages/id/informations.xml b/plugins/Languages/id/informations.xml
new file mode 100644
index 0000000..817490b
--- /dev/null
+++ b/plugins/Languages/id/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to indonesian]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier-id.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to indonesian. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>id</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Bahasa Indonesia]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Indonesian]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[id]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[id_ID]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/id/translation.ts b/plugins/Languages/id/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/id/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/it/flag.png b/plugins/Languages/it/flag.png
new file mode 100644
index 0000000..cc9f71f
--- /dev/null
+++ b/plugins/Languages/it/flag.png
Binary files differ
diff --git a/plugins/Languages/it/informations.xml b/plugins/Languages/it/informations.xml
new file mode 100644
index 0000000..bd6609d
--- /dev/null
+++ b/plugins/Languages/it/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to italian]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to italian. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>it</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Italian]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Italiano]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[it]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[it_IT]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/it/translation.ts b/plugins/Languages/it/translation.ts
new file mode 100644
index 0000000..28f5b6b
--- /dev/null
+++ b/plugins/Languages/it/translation.ts
@@ -0,0 +1,1270 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="it" sourcelanguage="en">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation>Avviso</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation>Il programma è gia in esecuzione, fare clic con il tasto destro del mouse sulla sua icona della barra di sistema (vicino l&apos;orologio) per usarlo</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation>Problema di lettura o dimensione nulla del file</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation>Gli argomenti possibili sono:</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation>Mostra le opzioni</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>Copiare i file di origine alla destinazione separati da uno spazio. Se la destinazione è &quot;?&quot;, Ultracopier chiederà all&apos;utente</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>Spostare i file di origine alla destinazione separati da uno spazio. Se la destinazione è &quot;?&quot;, Ultracopier chiederà all&apos;utente</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation>Comando non valido</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation>Questo file non è supportato dalla lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation>Impossibile aprire il file della lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation>Mostra questo aiuto</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation>Chiudere le altre istanze (se in esecuzione)</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation>Apri la lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation>Aiuto</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>Avviso</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation>Impossibile trovare un motore per la copia compatibile!</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation>Impossibile trovare un motore per la copia con questo nome: %1</translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation>Errore durante la ricezione della lista di copia/spostamento
+%1</translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation>Impossibile ottenere un&apos;istanza dal motore per la copia</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation>Raggruppa finestre</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation>Vuoi un altro gruppo di trasferimento con un altro trasferimento attualmente avviato?</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation>Impossibile ottenere un&apos;istanza dal motore per la copia</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation>L&apos;argomento per la modalità non è valido</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation>Vuoi copiarlo? se no, verrà spostato.</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation>Impossibile avviare l&apos;interfaccia, copia interrotta</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation>Impossibile avviare il motore per la copia, copia interrotta</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation>Modalità di trasferimento</translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation>Motore per la copia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation>Copia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation>Sposta</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation>Pausa</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation>Riprendi</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation>Salta</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation>Illimitato</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation>s</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation>Troppo grande</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation>GB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation>TB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation>PB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation>EB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation>ZB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation>YB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation>Meno di %10 secondi</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation>Circa %10 secondi rimanenti</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation>Circa %1 minuti rimanenti</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation>Circa %1 ore rimanenti</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation>Trasferisci</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translatorcomment>Uno spostamento</translatorcomment>
+ <translation>Avvia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation>Cartella di origine</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation>Dimensione</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation>Cartella di destinazione</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation>Esci</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation>Obiettivo</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation>Tempo residuo:</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation>Elenco</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation>Copiatura</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation>Elenca e copia</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation>Chiedi</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation>Sovrascrivi</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation>Sovrascrivi se più recente</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation>Sovrascrivi se sono diverse le date dell&apos;ultima modifica</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation>Rinomina</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation>Metti in coda alla lista</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation>Completato in %1</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation>Selezionare la cartella di origine</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation>Selezionare la cartella di destinazione</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation>Errore interno</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation>Selezionare uno o più file da aprire</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation>Tutti i file</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation>Salvare la lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation>Aprire lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation>Lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation>Non supportato su questa piattaforma</translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation>Informazioni su Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translatorcomment>%1 sarà rimpiazzata da una variabile content (normale, debug, ...)</translatorcomment>
+ <translation>Utility avanzata sotto licenza GPL3 per la copia dei file basata su Qt.
+Compilata come versione: %1.</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translatorcomment>%1 sarà rimpiazzata dalla piattaforma (Windows, Mac, Linux, ...)</translatorcomment>
+ <translation>Piattaforma: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation>Informazioni su Qt</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation>Si è verificato un crash</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation>Salva il bug</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation>Su http://portableapps.com/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation>Versione portatile e pluricomprensiva</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation>Versione portatile</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation>Versione pluricomprensiva</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation>Versione normale</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translatorcomment>Questo dovrebbe essere il sito ufficiale di Ultracopier in italiano</translatorcomment>
+ <translation>http://ultracopier-it.first-world.info/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation>http://ultracopier.first-world.info/download.html</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translatorcomment>%1 sarà rimpiazzato dal sito italiano</translatorcomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Per ulteriori informazioni consultare il sito &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;</translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation>Avviso</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation>Tempo scaduto durante la ricomposizione dei dati dai client collegati</translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation>File log già aperto, errore: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation>Impossibile aprire il file di log, errore: %1</translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation>Avviso</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation>Non visualizzare più questo messaggio</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>Il ripristino del sistema predefinito di copia/spostamento non è supportato dal file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Chiedere supporto allo sviluppatore.&lt;br /&gt;Bisogna fare la copia/spostamento manuale.</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation>Riavviare il sistema, se in precedenza avevi installato un software simile a questo (come Teracopy, Supercopier o una versione precedente di Ultracopier).</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation>Il ripristino del sistema predefinito di copia/spostamento non è supportato, quindi viene bloccato dal finder of Mac OS X.&lt;br /&gt;Chiedere supporto allo sviluppatore.&lt;br /&gt;Sarà possibile la copia/spostamento manuale cliccando col tasto destro del mouse sull&apos;icona della barra di sistema vicina all&apos;orologio (non l&apos;icona dock).</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation>Il ripristino del sistema predefinito di copia/spostamento potrebbe non essere supportato dal file manager.&lt;br /&gt;Chiedere supporto allo sviluppatore.&lt;br /&gt;Bisogna fare la copia/spostamento manuale.</translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation>Opzioni</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation>Generale</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation>I plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation>Motore per la copia</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation>Temi</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation>Log</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation>Controlla aggiornamenti automaticamente</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation>Nome</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation>Versione</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation>Lingua</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation>Rilevatore</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation>Caricatore di plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation>Caricatore di sessione</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation>Utilizza la lingua</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation>Ripristina il sistema di copia e spostamento predefinito</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation>Carica il programma all&apos;avvio di sistema</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation>Se avviato manualmente</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation>Quando raggruppare le finestre</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation>Conferma il raggruppamento delle finestre</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation>Mostra l&apos;avviso del Sistema Operativo</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation>Dai tempo alla GPU per sostenere lo sviluppo</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation>Plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation>Aggiungi</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation>Elimina</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation>Informazioni</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation>Motore per la copia in ordine di preferenza:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation>Client connessi</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation>Temi:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation>Impossibile caricare il plug-in dei temi</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation>Non ci sono opzioni per questo plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation>Sfoglia</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation>Scrivere i trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation>Scrivere le operazioni di cartella</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translatorcomment>%time%, %source%, %size%, %destination% non dovranno essere tradotti</translatorcomment>
+ <translation>Le variabili sono %time%, %source%, %size%, %destination%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation>Scrivere gli errori</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translatorcomment>%time%, %path%, %size%, %mtime%, %error% non dovranno essere tradotti</translatorcomment>
+ <translation>Le variabili sono %time%, %path%, %size%, %mtime%, %error%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation>Scrivere il file di log in:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation>Scrivere direttamente il file quando si riceve una nuova voce (può causare il 50% di perdita di prestazioni)</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation>Carica</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation>Caricare i temi?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation>Caricare questa lingua?</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation>Non fare nulla</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation>Chiedere la cartella di origine</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation>Chiedere i file di origine</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation>Mai</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation>Quando la cartella di origine è uguale</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation>Quando la cartella di destinazione è uguale</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation>Quando sia le cartelle di origine che di destinazione sono uguali</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation>Quando le cartelle di origine o di destinazione coincidono</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation>Sempre</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation>Le variabili sono %1</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation>Salvare i log come: </translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation>Log sincronizzato</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translatorcomment>%path% e %operation%, non dovranno essere tradotti</translatorcomment>
+ <translation>Le variabili sono %path%, %operation%</translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation>Variabile non trovata: %1 %2</translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation>Informazioni su questo plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation>Nome:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation>Categoria:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation>Autore:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation>Data:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation>Descrizione:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation>Versione:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation>Motore per la copia</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation>Lingue</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation>Rilevatore</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation>Caricatore di plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation>Caricatore di sessione</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation>Temi</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation>Sconosciuto</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation>Informazioni su %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation>Sito web:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation>Titolo:</translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation>informations.xml non è accessibile</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation>Alcune dipendenze non sono idonee</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation>Le dipendenze %1 per il plug-in: %2, non sono soddisfatte</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation>Elimina %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation>Informazioni</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation>%1, errore di analisi alla riga %2, colonna %3: %4</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation>informations.xml non trovato per il plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation>Tag root &quot;package&quot; non trovato nel file xml</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation>Trovato plug-in duplicato, già caricato!</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation>Testo in inglese mancante in informations.xml per il tag: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation>Tag non trovato: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation>Si desidera eliminare &quot;%1&quot; nella versione %2?</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation>Importazione precedente in corso ...</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation>Apri plug-in di Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation>Plug-in di Ultracopier (*.urc)</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation>Caricatore di plug-in</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation>Impossibile aprire il plug-in: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation>Impossibile caricare il contenuto del plug-in, si prega di controllare: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation>Impossibile creare una cartella per installare il plug-in:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation>Impossibile creare un file per installare il plug-in:
+%1
+da: %2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation>E&apos; presente una cartella con lo stesso nome, non sarà installato il plug-in:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation>Impossibile caricare il contenuto del plug-in, si prega di controllare</translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation>Allocazione di memoria fallita</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation>Errore di scrittura</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation>Limite di memoria raggiunto</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation>Non è un file .xz</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation>Opzioni non supportate nelle intestazioni .xz</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation>Il file è corrotto</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation>Bug!</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation>I dati inseriti sono troppo pochi</translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation>Nessuna copia del rilevatore trovata. Fare una copia manualmente cliccando col tasto destro del mouse sull&apos;icona nella barra di sistema.</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation>Informazioni</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation>Ricerca informazioni...</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation>Non ripristinare la copia/spostamento di Windows explorer</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation>Ripristinare parzialmente la copia/spostamento di Windows explorer</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation>Ripristina la copia/spostamento di Windows explorer</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/ja/flag.png b/plugins/Languages/ja/flag.png
new file mode 100644
index 0000000..5ac331e
--- /dev/null
+++ b/plugins/Languages/ja/flag.png
Binary files differ
diff --git a/plugins/Languages/ja/informations.xml b/plugins/Languages/ja/informations.xml
new file mode 100644
index 0000000..647c3aa
--- /dev/null
+++ b/plugins/Languages/ja/informations.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to japanese]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to japanese. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>jp</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[日本]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Japanese]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[ja]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[jp]]></shortName>
+ <shortName><![CDATA[jp_JP]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/ja/translation.ts b/plugins/Languages/ja/translation.ts
new file mode 100644
index 0000000..ffb9111
--- /dev/null
+++ b/plugins/Languages/ja/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/ko/flag.png b/plugins/Languages/ko/flag.png
new file mode 100644
index 0000000..1dfaf96
--- /dev/null
+++ b/plugins/Languages/ko/flag.png
Binary files differ
diff --git a/plugins/Languages/ko/informations.xml b/plugins/Languages/ko/informations.xml
new file mode 100644
index 0000000..706afb3
--- /dev/null
+++ b/plugins/Languages/ko/informations.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Korean language]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[Jaehyung Lee, webnest.net (kolanp@gmail.com)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[File to define all English language related, Ultracopier is written in English, then not translation file needed]]></description>
+ <description xml:lang="ko"><![CDATA[Ultracopier의 한국어 번역입니다. 더 나은 번역이나 오타, 오역에 대한 제보는 이메일로 연락해주시면 감사하겠습니다.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>ko</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Korean]]></fullName>
+ <!-- No short name, for do translation not found and leave un-translated -->
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[ko]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/ko/translation.ts b/plugins/Languages/ko/translation.ts
new file mode 100644
index 0000000..41d1700
--- /dev/null
+++ b/plugins/Languages/ko/translation.ts
@@ -0,0 +1,1260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ko_KR">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation>알림</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation>Ultracopier가 이미 실행중입니다. 사용하려면 트레이 아이콘에서 우클릭하십시오</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>알림</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation>호환되는 엔진을 찾을 수 없습니다!</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished">오류</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation>오류</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation>인터페이스를 불러올 수 없음, 복사가 취소되었습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation>복사 엔진을 불러올 수 없음, 복사가 취소되었습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation>복사 엔진</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation>복사</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation>이동</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation>일시 중지</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation>다시 시작</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation>건너뛰기</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation>무제한</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation>초</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation>너무 큽니다</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation>GB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation>TB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation>PB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation>EB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation>ZB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation>YB</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished">오류</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation>플랫폼: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation>Qt에 대해</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation>충돌 발생시</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation>버그 보고서 저장</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation>닫기</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation>http://portableapps.com을 위해</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation>포터블 버전</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation>일반 버전</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation>http://ultracopier.first-world.info/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation>알림</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation>연결된 클라이언트로부터 데이터를 재구성하는 동안에 시간이 초과되었습니다</translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation>오류</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished">알림</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation>옵션</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation>일반</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation>플러그인</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation>복사 엔진</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation>테마</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation>로그</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation>이름</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation>버전</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation>언어</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation>리스너</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation>플러그인 로더</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation>섹션 로더</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation>플러그인</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation>추가</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation>제거</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation>정보</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation>복사 엔진 순서 환경 설정:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation>테마:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation>테마 플러그인을 불러올 수 없습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation>이 플러그인에 대한 옵션이 없습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation>찾아보기</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation>변수는 %time%, %source%, %size%, %destination% 입니다</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation>변수는 %time%, %path%, %size%, %mtime%, %error% 입니다</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation>로그 파일 작성:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation>로그 따로 저장:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation>로그 동기화됨</translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation>플러그인 정보</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation>이름:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation>분류:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation>저작자:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation>날짜:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation>설명:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation>버전:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished">복사 엔진</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation>언어</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation>리스너</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished">플러그인 로더</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished">섹션 로더</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation>테마</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation>%1 파일 정보</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation>웹사이트:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation>제목:</translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation>informations.xml 파일에 연결할 수 없습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation>종속된 부분이 잘못되었습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation>플러그인 %2에 대한 %1 종속성이 충족되지 않습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation>%1 제거</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation>오류</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation>정보</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation>%1, %2 라인에서 문법 오류, %3 열: %4</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation>xml 파일을 위한 &quot;패키지&quot; 루트 태그를 찾을 수 없습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation>중복된 플러그인 발견, 이미 호출되었습니다!</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation>태그를 찾을 수 없음: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation>%2 버전에서 %1을 제거하시겠습니까?</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation>이전의 가져오기가 진행중입니다...</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation>Ultracopier 플러그인 열기</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation>Ultracopier (*.urc)</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation>플러그인 로더</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation>플러그인 열기 불가: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation>플러그인 내용을 불러올 수 없습니다. 확인해주십시오: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation>플러그인을 설치할 폴더를 생성할 수 없음:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation>플러그인을 설치할 파일을 만들 수 없음:
+%1
+since:%2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation>동일한 이름의 폴더가 존재합니다. 플러그인 설치 건너뛰기:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation>플러그인 컨태츠를 불러올 수 없습니다. 확인해주십시오</translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation>메모리 할당 실패</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation>오류 작성</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation>메모리 사용량이 제한에 도달했습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation>.xz 파일이 아닙니다</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation>.xz 헤더에서 지원되지 않는 옵션입니다</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation>파일이 손상되었습니다</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation>버그입니다!</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation>입력 데이터가 너무 짧습니다</translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished">복사 리스너를 찾을 수 없습니다. 트레이 아이콘에서 우클릭하여 수동으로 복사하십시오.</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished">정보</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished">정보 검색중...</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/nl/flag.png b/plugins/Languages/nl/flag.png
new file mode 100644
index 0000000..0d00e1a
--- /dev/null
+++ b/plugins/Languages/nl/flag.png
Binary files differ
diff --git a/plugins/Languages/nl/informations.xml b/plugins/Languages/nl/informations.xml
new file mode 100644
index 0000000..b50e36b
--- /dev/null
+++ b/plugins/Languages/nl/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to dutch]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to dutch. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>nl</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Dutch]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Nederlands]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[nl]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[nl_NL]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/nl/translation.ts b/plugins/Languages/nl/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/nl/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/no/flag.png b/plugins/Languages/no/flag.png
new file mode 100644
index 0000000..16ec28a
--- /dev/null
+++ b/plugins/Languages/no/flag.png
Binary files differ
diff --git a/plugins/Languages/no/informations.xml b/plugins/Languages/no/informations.xml
new file mode 100644
index 0000000..21d465b
--- /dev/null
+++ b/plugins/Languages/no/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to norwegian]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to norwegian. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>no</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Norske]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Norwegian]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[no]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[no_NO]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/no/translation.ts b/plugins/Languages/no/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/no/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/pl/flag.png b/plugins/Languages/pl/flag.png
new file mode 100644
index 0000000..439ee97
--- /dev/null
+++ b/plugins/Languages/pl/flag.png
Binary files differ
diff --git a/plugins/Languages/pl/informations.xml b/plugins/Languages/pl/informations.xml
new file mode 100644
index 0000000..7617a00
--- /dev/null
+++ b/plugins/Languages/pl/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to polish]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to polish. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>pl</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Polski]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Polish]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[pl]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[pl_PL]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/pl/translation.ts b/plugins/Languages/pl/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/pl/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/pt/flag.png b/plugins/Languages/pt/flag.png
new file mode 100644
index 0000000..3fb1e36
--- /dev/null
+++ b/plugins/Languages/pt/flag.png
Binary files differ
diff --git a/plugins/Languages/pt/informations.xml b/plugins/Languages/pt/informations.xml
new file mode 100644
index 0000000..9c3d0e3
--- /dev/null
+++ b/plugins/Languages/pt/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to portuguese]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to portuguese. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>pt</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Português]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Portuguese]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[pt]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[pt_PT]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/pt/translation.ts b/plugins/Languages/pt/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/pt/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/ru/flag.png b/plugins/Languages/ru/flag.png
new file mode 100644
index 0000000..583e627
--- /dev/null
+++ b/plugins/Languages/ru/flag.png
Binary files differ
diff --git a/plugins/Languages/ru/informations.xml b/plugins/Languages/ru/informations.xml
new file mode 100644
index 0000000..49ea3f6
--- /dev/null
+++ b/plugins/Languages/ru/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to russian]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to russian. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>ru</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[русский]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Russian]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[ru]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[ru_RU]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/ru/translation.ts b/plugins/Languages/ru/translation.ts
new file mode 100644
index 0000000..444e5ab
--- /dev/null
+++ b/plugins/Languages/ru/translation.ts
@@ -0,0 +1,1260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ru" sourcelanguage="en">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation>Предупреждение</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation>Ultracopier уже запущен, щелкните правой кнопкой мыши на значок панели задач (рядом с часами), чтобы использовать его</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation>Проблема с чтением файла, или размер файла равен 0</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation>Возможные аргументы:</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation>Чтобы отобразить опции</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation>Чтобы копировать исходники в место назначения, разделенными пробелом. If destination is &quot;?&quot;, ultracopier will ask the user</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation>Этот файл не поддерживается передача списка</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation>Не удается открыть файл трансфер</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished">Откройте трансфер</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation>Помогите</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>Предупреждение</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation>Не могу найти любой совместимый двигатель!</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation>Не могу найти любой двигатель с таким именем: %1</translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished">ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation>ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation>Не удалось получить экземпляр копии двигателей</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation>Не удалось загрузить интерфейс, копирование прервана</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation>Не удается загрузить копию двигателя, скопируйте прервана</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation>режим передачи</translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation>Копировать двигатель</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation>копия</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation>двигаться</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation>пауза</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation>резюме</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation>пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation>неограниченный</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation>Слишком большой</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation>Менее %10 секунд</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation>О %10 секунды осталось</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation>О %1 минуты до конца</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation>О %1 часов, оставшихся</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation>источник</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation>размер</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation>назначение</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation>выход</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation>цель</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation>Оставшееся время:</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation>список</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation>копирование</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation>Листинг и копирования</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation>просить</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation>переписывать</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation>Заменить, если новее</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation>Заменить, если последняя даты модификации отличаются</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation>переименовать</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation>Выберите исходный каталог</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation>Выберите папку назначения</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation>Внутренняя ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation>Выберите один или более файлов, чтобы открыть</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation>Все файлы</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation>Сохранить трансфер</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation>Откройте трансфер</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation>Передача списка</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation>ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation>Не поддерживается на этой платформе</translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation>Платформа: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation>О Qt</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation>У аварии</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation>Сохранить отчет об ошибке</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation>закрывать</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation>для http://portableapps.com/</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation>Портативная версия</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation>Нормальная версия</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Для получения дополнительной информации посетите веб-сайт &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;</translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation>Предупреждение</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation>Тайм-аут в то время как композицию кадра данных из подключенных клиентов</translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation>ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation>Лог-файл уже открыт, ошибки: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished">Предупреждение</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation>опции</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation>общий</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation>плагины</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation>Копировать двигатель</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation>Темы</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation>имя</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation>версия</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation>язык</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation>слушатель</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation>плагин погрузчика</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation>сессия погрузчика</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation>плагин</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation>добавлять</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation>удаление</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation>информация</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation>Скопируйте двигателя порядке предпочтения:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation>Темы:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation>Не удается загрузить плагин темы</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation>просматривать</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation>Переменные are %time%, %source%, %size%, %destination%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation>Переменные %time%, %path%, %size%, %mtime%, %error%</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation>Запись в файл журнала:</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation>ничего не делать</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation>Спросите источника папку</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation>Спросите источников в виде файлов</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation>никогда</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation>Когда же источник</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation>Когда же назначения</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation>Когда источника и назначения те же</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation>Когда источника или назначения те же</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation>всегда</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation>Сохранить журналы, как: </translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation>Синхронное журнала</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation>Нет опции для этого плагина</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation>Переменные %path%, %operation%</translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation>Об этом плагине</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation>Имя:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation>Категория:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation>Автор:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation>Дата:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation>Описание:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation>Версия:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished">Копировать двигатель</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation>Языки</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation>слушатель</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished">плагин погрузчика</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished">сессия погрузчика</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation>Темы</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation>Информация о %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation>Сайт:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation>Название:</translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation>informations.xml не доступен</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation>Зависимости часть неправильно</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation>Зависимости %1 не выполняется, для плагина: %2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation>удаление: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation>ошибка</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation>информация</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation>%1, вызовет ошибку в строке %2, столбце %3: %4</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation>&quot;package&quot; Корневой тег не найден для XML-файла</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation>Дублированный плагин нашел, уже загружены!</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation>Тег не найден: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation>Вы уверены, что об удалении &quot;%1&quot; в версии %2?</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation>Предыдущая импорта идет ...</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation>Открытое плагин Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation>Ultracopier плагина (*.urc)</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation>плагин погрузчика</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation>Невозможно открыть плагин: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation>Не удается загрузить плагин содержания, пожалуйста, проверьте его: %1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation>Невозможно создать папку для установки плагина:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation>Невозможно создать файл, чтобы установить плагин:
+%1
+С: %2</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation>Папка с таким же именем существует, пропустить установки плагина:
+%1</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation>Не удается загрузить плагин содержания, пожалуйста, проверьте его</translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation>Ошибка выделения памяти</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation>Написать об ошибке</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation>Ограничить использование памяти достиг</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation>Не. Хг файл</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation>Неподдерживаемые варианты. Заголовки XZ</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation>Файл поврежден</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation>Ошибка!</translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation>Входных данных слишком короткий</translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished">Нет копии слушатель найдено. Сделайте копию вручную, щелкните правой кнопкой мыши один из иконки в системном трее.</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished">информация</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished">Поиск информации ...</translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/th/flag.png b/plugins/Languages/th/flag.png
new file mode 100644
index 0000000..76d9cc3
--- /dev/null
+++ b/plugins/Languages/th/flag.png
Binary files differ
diff --git a/plugins/Languages/th/informations.xml b/plugins/Languages/th/informations.xml
new file mode 100644
index 0000000..bc66718
--- /dev/null
+++ b/plugins/Languages/th/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to thai]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to thai. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>th</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[ไทย]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Thai]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[th]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[th_TH]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/th/translation.ts b/plugins/Languages/th/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/th/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/tr/flag.png b/plugins/Languages/tr/flag.png
new file mode 100644
index 0000000..e26b94b
--- /dev/null
+++ b/plugins/Languages/tr/flag.png
Binary files differ
diff --git a/plugins/Languages/tr/informations.xml b/plugins/Languages/tr/informations.xml
new file mode 100644
index 0000000..bc26b50
--- /dev/null
+++ b/plugins/Languages/tr/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to turkish]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to turkish. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>tr</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[Türk]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Turkish]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[tr]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[tr_TR]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/tr/translation.ts b/plugins/Languages/tr/translation.ts
new file mode 100644
index 0000000..d364f81
--- /dev/null
+++ b/plugins/Languages/tr/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/zh/flag.png b/plugins/Languages/zh/flag.png
new file mode 100644
index 0000000..928b698
--- /dev/null
+++ b/plugins/Languages/zh/flag.png
Binary files differ
diff --git a/plugins/Languages/zh/informations.xml b/plugins/Languages/zh/informations.xml
new file mode 100644
index 0000000..ca01be8
--- /dev/null
+++ b/plugins/Languages/zh/informations.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to chinese]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to chinese. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>ch</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[中国]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Chinese]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[zh]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[zh_CN]]></shortName>
+ <shortName><![CDATA[zh_HK]]></shortName>
+ <shortName><![CDATA[zh_TW]]></shortName>
+ <shortName><![CDATA[cn]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/plugins/Languages/zh/translation.ts b/plugins/Languages/zh/translation.ts
new file mode 100644
index 0000000..4172800
--- /dev/null
+++ b/plugins/Languages/zh/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished">警告</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>警告</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished">警告</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished">警告</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Languages/zh_TW/flag.png b/plugins/Languages/zh_TW/flag.png
new file mode 100644
index 0000000..4f00c2d
--- /dev/null
+++ b/plugins/Languages/zh_TW/flag.png
Binary files differ
diff --git a/plugins/Languages/zh_TW/informations.xml b/plugins/Languages/zh_TW/informations.xml
new file mode 100644
index 0000000..214150d
--- /dev/null
+++ b/plugins/Languages/zh_TW/informations.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Translation of Ultracopier to chinese traditional]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Translation of Ultracopier to chinese traditional. For more details see the web site.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>zh_tw</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[台灣]]></fullName>
+ <!-- Short name, language name in English -->
+ <shortName><![CDATA[Chinese Traditional]]></shortName>
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[zh_TW]]></shortName>
+ <!-- Short name, language ISO country code -->
+ <shortName><![CDATA[zh_TW]]></shortName>
+ </categorySpecific>
+</package>
diff --git a/plugins/Languages/zh_TW/translation.ts b/plugins/Languages/zh_TW/translation.ts
new file mode 100644
index 0000000..cfe9ac3
--- /dev/null
+++ b/plugins/Languages/zh_TW/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_TW">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation>警告</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished">Ultracopier 正在執行中,right click on its system tray icon (near the clock) to use it</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation>顯示幫助</translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation>幫助</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation>警告</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation>錯誤</translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation>錯誤</translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation>金鑰</translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation>秒</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished">錯誤</translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation>關於 Ultracopier</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation>警告</translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation>錯誤</translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation>警告</translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished">選項</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation>一般</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation>佈景</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation>紀錄</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation>名稱</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation>版本</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation>語言</translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished">關於這的插件</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation>名稱:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation>分類:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation>作者:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation>日期:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation>描述:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation>版本:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation>語言</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation>佈景</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation>未知</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation>網站:</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation>標題:</translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished">錯誤</translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Listener/catchcopy-v0002/DebugEngineMacro.h b/plugins/Listener/catchcopy-v0002/DebugEngineMacro.h
new file mode 100644
index 0000000..4582010
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins/Listener/catchcopy-v0002/Environment.h b/plugins/Listener/catchcopy-v0002/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins/Listener/catchcopy-v0002/StructEnumDefinition.h b/plugins/Listener/catchcopy-v0002/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins/Listener/catchcopy-v0002/Variable.h b/plugins/Listener/catchcopy-v0002/Variable.h
new file mode 100644
index 0000000..963d0c8
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/Variable.h
@@ -0,0 +1,15 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.cpp b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.cpp
new file mode 100644
index 0000000..c466630
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.cpp
@@ -0,0 +1,379 @@
+/** \file ClientCatchcopy.cpp
+\brief Define the catchcopy client
+\author alpha_one_x86 */
+
+#include "ClientCatchcopy.h"
+#include "VariablesCatchcopy.h"
+#include "ExtraSocketCatchcopy.h"
+
+#include <QDataStream>
+
+ClientCatchcopy::ClientCatchcopy()
+{
+ disconnectedFromSocket();
+ error_string="Unknown error";
+ detectTimeOut.setSingleShot(true);
+ detectTimeOut.setInterval(CATCHCOPY_COMMUNICATION_TIMEOUT); // the max time to without send packet
+ connect(&socket, SIGNAL(connected()), this, SIGNAL(connected()));
+ connect(&socket, SIGNAL(disconnected()), this, SIGNAL(disconnected()));
+ connect(&socket, SIGNAL(disconnected()), this, SLOT(disconnectedFromSocket()));
+ connect(&socket, SIGNAL(stateChanged(QLocalSocket::LocalSocketState)), this, SIGNAL(stateChanged(QLocalSocket::LocalSocketState)));
+ connect(&socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SIGNAL(errorSocket(QLocalSocket::LocalSocketError)));
+ connect(&socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
+ connect(&detectTimeOut, SIGNAL(timeout()), this, SLOT(checkTimeOut()));
+ connect(&socket, SIGNAL(connected()), this, SLOT(socketIsConnected()));
+}
+
+void ClientCatchcopy::checkTimeOut()
+{
+ if(haveData)
+ {
+ error_string="The server is too long to send the next part of the reply";
+ emit error(error_string);
+ disconnectFromServer();
+ }
+}
+
+const QString ClientCatchcopy::errorString()
+{
+ return error_string;
+}
+
+void ClientCatchcopy::socketIsConnected()
+{
+ orderIdFirstSendProtocol=sendProtocol();
+}
+
+void ClientCatchcopy::connectToServer()
+{
+ socket.connectToServer(QString::fromStdString(ExtraSocketCatchcopy::pathSocket()));
+}
+
+void ClientCatchcopy::disconnectFromServer()
+{
+ socket.abort();
+ socket.disconnectFromServer();
+}
+
+const QString ClientCatchcopy::errorStringSocket()
+{
+ return socket.errorString();
+}
+
+/// \brief to send stream of string list
+quint32 ClientCatchcopy::sendRawOrderList(const QStringList & order)
+{
+ if(!socket.isValid())
+ {
+ error_string="Socket is not valid, try send: "+order.join(";");
+ emit error(error_string);
+ return -1;
+ }
+ if(socket.state()!=QLocalSocket::ConnectedState)
+ {
+ error_string="Socket is not connected "+QString::number(socket.state());
+ emit error(error_string);
+ return -1;
+ }
+ do
+ {
+ idNextOrder++;
+ if(idNextOrder>2000000000)
+ idNextOrder=0;
+ } while(notRepliedQuery.contains(idNextOrder));
+ notRepliedQuery << idNextOrder;
+ 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();
+ if(idNextOrder!=1) // drop if internal protocol send
+ {
+ emit dataSend(idNextOrder,block);
+ emit dataSend(idNextOrder,order);
+ }
+ 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())
+ {
+ error_string="Socket is not valid";
+ emit error(error_string);
+ return -1;
+ }
+ if(socket.errorString()!="Unknown error" && socket.errorString()!="")
+ {
+ error_string=socket.errorString();
+ emit error(error_string);
+ return -1;
+ }
+ if(blockToSend.size()!=byteWriten)
+ {
+ error_string="All the bytes have not be written";
+ emit error(error_string);
+ return -1;
+ }
+ }
+ while(block.size());
+ return idNextOrder;
+}
+
+void ClientCatchcopy::readyRead()
+{
+ while(socket.bytesAvailable()>0)
+ {
+ if(!haveData)
+ {
+ if(socket.bytesAvailable()<(int)sizeof(int))//int of size cuted
+ {
+ /* error_string="Bytes available is not sufficient to do a int";
+ emit error(error_string);
+ disconnectFromServer();*/
+ return;
+ }
+ QDataStream in(&socket);
+ in.setVersion(QDataStream::Qt_4_4);
+ in >> dataSize;
+ dataSize-=sizeof(int);
+ if(dataSize>64*1024*1024) // 64MB
+ {
+ error_string="Reply size is >64MB, seam corrupted";
+ emit error(error_string);
+ disconnectFromServer();
+ return;
+ }
+ if(dataSize<(int)(sizeof(int) //orderId
+ + sizeof(quint32) //returnCode
+ + sizeof(quint32) //string list size
+ ))
+ {
+ error_string="Reply size is too small to have correct code";
+ emit error(error_string);
+ disconnectFromServer();
+ return;
+ }
+ }
+ if(dataSize<(data.size()+socket.bytesAvailable()))
+ data.append(socket.read(dataSize-data.size()));
+ else
+ data.append(socket.readAll());
+ if(dataSize==data.size())
+ {
+ if(!checkDataIntegrity(data))
+ {
+ data.clear();
+ qWarning() << "Data of the reply is wrong";
+ return;
+ }
+ QStringList returnList;
+ quint32 orderId;
+ quint32 returnCode;
+ QDataStream in(data);
+ in.setVersion(QDataStream::Qt_4_4);
+ in >> orderId;
+ in >> returnCode;
+ in >> returnList;
+ data.clear();
+ if(orderId!=orderIdFirstSendProtocol)
+ {
+ if(!notRepliedQuery.contains(orderId))
+ qWarning() << "Unknown query not replied:" << orderId;
+ else
+ {
+ if(!parseReply(orderId,returnCode,returnList))
+ emit unknowReply(orderId);
+ emit newReply(orderId,returnCode,returnList);
+ }
+ }
+ else
+ {
+ if(!sendProtocolReplied)
+ {
+ sendProtocolReplied=true;
+ if(returnCode!=1000)
+ {
+ error_string="Protocol not supported";
+ emit error(error_string);
+ disconnectFromServer();
+ return;
+ }
+ }
+ else
+ {
+ error_string=QStringLiteral("First send protocol send with the query id %1 have been already previously replied").arg(orderIdFirstSendProtocol);
+ emit error(error_string);
+ disconnectFromServer();
+ return;
+ }
+ }
+ }
+ }
+ if(haveData)
+ detectTimeOut.start();
+ else
+ detectTimeOut.stop();
+}
+
+bool ClientCatchcopy::checkDataIntegrity(QByteArray data)
+{
+ quint32 orderId;
+ qint32 replyCode;
+ qint32 listSize;
+ QDataStream in(data);
+ in.setVersion(QDataStream::Qt_4_4);
+ in >> orderId;
+ in >> replyCode;
+ in >> listSize;
+ if(listSize>65535)
+ {
+ emit error("List size is wrong");
+ qWarning() << "List size is wrong";
+ return false;
+ }
+ int index=0;
+ while(index<listSize)
+ {
+ qint32 stringSize;
+ in >> stringSize;
+ if(stringSize>65535)
+ {
+ emit error("String size is wrong");
+ qWarning() << "String size is wrong";
+ return false;
+ }
+ if(stringSize>(in.device()->size()-in.device()->pos()))
+ {
+ emit error(QStringLiteral("String size is greater than the data: %1>(%2-%3)").arg(stringSize).arg(in.device()->size()).arg(in.device()->pos()));
+ qWarning() << QStringLiteral("String size is greater than the data: %1>(%2-%3)").arg(stringSize).arg(in.device()->size()).arg(in.device()->pos());
+ return false;
+ }
+ in.device()->seek(in.device()->pos()+stringSize);
+ index++;
+ }
+ if(in.device()->size()!=in.device()->pos())
+ {
+ emit error("Remaining data after string list parsing");
+ qWarning() << "Remaining data after string list parsing";
+ return false;
+ }
+ return true;
+}
+
+QLocalSocket::LocalSocketState ClientCatchcopy::state()
+{
+ return socket.state();
+}
+
+void ClientCatchcopy::disconnectedFromSocket()
+{
+ haveData = false;
+ orderIdFirstSendProtocol= 0;
+ idNextOrder = 0;
+ sendProtocolReplied = false;
+ notRepliedQuery.clear();
+}
+
+/// \brief to send the protocol version used
+quint32 ClientCatchcopy::sendProtocol()
+{
+ return sendRawOrderList(QStringList() << "protocol" << CATCHCOPY_PROTOCOL_VERSION);
+}
+
+quint32 ClientCatchcopy::askServerName()
+{
+ return sendRawOrderList(QStringList() << "server" << "name?");
+}
+
+quint32 ClientCatchcopy::setClientName(const QString & name)
+{
+ return sendRawOrderList(QStringList() << "client" << name);
+}
+
+quint32 ClientCatchcopy::checkProtocolExtension(const QString & name)
+{
+ return sendRawOrderList(QStringList() << "protocol extension" << name);
+}
+
+quint32 ClientCatchcopy::checkProtocolExtension(const QString & name,const QString & version)
+{
+ return sendRawOrderList(QStringList() << "protocol extension" << name << version);
+}
+
+quint32 ClientCatchcopy::addCopyWithDestination(const QStringList & sources,const QString & destination)
+{
+ return sendRawOrderList(QStringList() << "cp" << sources << destination);
+}
+
+quint32 ClientCatchcopy::addCopyWithoutDestination(const QStringList & sources)
+{
+ return sendRawOrderList(QStringList() << "cp-?" << sources);
+}
+
+quint32 ClientCatchcopy::addMoveWithDestination(const QStringList & sources,const QString & destination)
+{
+ return sendRawOrderList(QStringList() << "mv" << sources << destination);
+}
+
+quint32 ClientCatchcopy::addMoveWithoutDestination(const QStringList & sources)
+{
+ return sendRawOrderList(QStringList() << "mv-?" << sources);
+}
+
+bool ClientCatchcopy::parseReply(quint32 orderId,quint32 returnCode,QStringList returnList)
+{
+ switch(returnCode)
+ {
+ case 1000:
+ emit protocolSupported(orderId);
+ break;
+ case 1001:
+ case 1002:
+ if(returnCode==1001)
+ emit protocolExtensionSupported(orderId,true);
+ else
+ emit protocolExtensionSupported(orderId,false);
+ break;
+ case 1003:
+ emit clientRegistered(orderId);
+ break;
+ case 1004:
+ if(returnList.size()!=1)
+ emit unknowOrder(orderId);
+ else
+ emit serverName(orderId,returnList.last());
+ break;
+ case 1005:
+ case 1006:
+ if(returnCode==1005)
+ emit copyFinished(orderId,false);
+ else
+ emit copyFinished(orderId,true);
+ break;
+ case 1007:
+ emit copyCanceled(orderId);
+ break;
+ case 5000:
+ emit incorrectArgumentListSize(orderId);
+ break;
+ case 5001:
+ emit incorrectArgument(orderId);
+ break;
+ case 5002:
+ emit unknowOrder(orderId); //the server have not understand the order
+ break;
+ case 5003:
+ emit protocolNotSupported(orderId);
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
diff --git a/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.h b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.h
new file mode 100644
index 0000000..4c15890
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.h
@@ -0,0 +1,113 @@
+/** \file ClientCatchcopy.h
+\brief Define the catchcopy client
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef CLIENTCATCHCOPY_H
+#define CLIENTCATCHCOPY_H
+
+#include <QObject>
+#include <QLocalSocket>
+#include <QStringList>
+#include <QString>
+#include <QByteArray>
+#include <QTimer>
+
+/// \brief Define the catchcopy client
+class ClientCatchcopy : public QObject
+{
+ Q_OBJECT
+ public:
+ ClientCatchcopy();
+ /// \brief get the socket stat
+ QLocalSocket::LocalSocketState state();
+ /// \brief error string about the socket
+ const QString errorStringSocket();
+ /// \brief general error string
+ const QString errorString();
+ public slots:
+ void connectToServer();
+ void disconnectFromServer();
+ //to test and internal use
+ /// \brief to send order
+ quint32 sendProtocol();
+ /// \brief ask the server name
+ quint32 askServerName();
+ /// \brief set the client name
+ quint32 setClientName(const QString & name);
+ /// \brief check protocol extension
+ quint32 checkProtocolExtension(const QString & name);
+ /// \brief check protocol extension and version
+ quint32 checkProtocolExtension(const QString & name,const QString & version);
+ /// \brief add copy with destination
+ quint32 addCopyWithDestination(const QStringList & sources,const QString & destination);
+ /// \brief add copy without destination
+ quint32 addCopyWithoutDestination(const QStringList & sources);
+ /// \brief add move with destination
+ quint32 addMoveWithDestination(const QStringList & sources,const QString & destination);
+ /// \brief add move without destination
+ quint32 addMoveWithoutDestination(const QStringList & sources);
+ /// \brief to send stream of string list
+ quint32 sendRawOrderList(const QStringList & order);
+ signals:
+ /// \brief is connected
+ void connected();
+ /// \brief is disconnected
+ void disconnected();
+ /// \brief the socket state have changed
+ void stateChanged(QLocalSocket::LocalSocketState socketState);
+ /// \brief send the error string
+ void error(QString error);
+ /// \brief send socket error
+ void errorSocket(QLocalSocket::LocalSocketError socketError);
+ /// \brief have new reply
+ void newReply(quint32 orderId,quint32 returnCode,QStringList returnList);
+ /// \brief have data send
+ void dataSend(quint32 orderId,QByteArray data);
+ /// \brief have data send by string list
+ void dataSend(quint32 orderId,QStringList data);
+ /// \brief have unknow reply
+ void unknowReply(quint32 orderId);
+ //reply
+ /// \brief protocol is supported
+ void protocolSupported(quint32 orderId);
+ /// \brief incorrect argument list size
+ void incorrectArgumentListSize(quint32 orderId);
+ /// \brief incorrect argument
+ void incorrectArgument(quint32 orderId);
+ /// \brief protocol not supported
+ void protocolNotSupported(quint32 orderId);
+ /// \brief protocol extension supported
+ void protocolExtensionSupported(quint32 orderId,bool isSupported);
+ /// \brief client is registred
+ void clientRegistered(quint32 orderId);
+ /// \brief have the server name
+ void serverName(quint32 orderId,QString name);
+ /// \brief copy finished
+ void copyFinished(quint32 orderId,bool withError);
+ /// \brief copy canceled
+ void copyCanceled(quint32 orderId);
+ /// \brief have unknow order
+ void unknowOrder(quint32 orderId); //the server have not understand the order
+ private:
+ QLocalSocket socket;
+ QString error_string;
+ quint32 idNextOrder;
+ QByteArray data;
+ bool haveData;
+ int dataSize;
+ quint32 orderIdFirstSendProtocol;
+ QTimer detectTimeOut;
+ bool sendProtocolReplied;
+ QList<quint32> notRepliedQuery;
+ bool checkDataIntegrity(QByteArray data);
+ private slots:
+ void readyRead();
+ void disconnectedFromSocket();
+ void socketIsConnected();
+ void checkTimeOut();
+ protected:
+ bool parseReply(quint32 orderId,quint32 returnCode,QStringList returnList);
+};
+
+#endif // CLIENTCATCHCOPY_H
diff --git a/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.cpp b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.cpp
new file mode 100644
index 0000000..9cd8373
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.cpp
@@ -0,0 +1,38 @@
+/** \file ExtraSocketCatchcopy.cpp
+\brief Define the socket of catchcopy
+\author alpha_one_x86 */
+
+#include "ExtraSocketCatchcopy.h"
+
+#include <stdio.h>
+
+const std::string ExtraSocketCatchcopy::pathSocket()
+{
+#ifdef Q_OS_UNIX
+ return "advanced-copier-"+std::to_string(getuid());
+#else
+ QString userName;
+ char uname[1024];
+ DWORD len=1023;
+ if(GetUserNameA(uname, &len)!=FALSE)
+ userName=QString::fromLatin1(toHex(uname));
+ return "advanced-copier-"+userName.toStdString();
+#endif
+}
+
+char * ExtraSocketCatchcopy::toHex(const char *str)
+{
+ char *p, *sz;
+ size_t len;
+ if (str==NULL)
+ return NULL;
+ len= strlen(str);
+ p = sz = (char *) malloc((len+1)*4);
+ for (size_t i=0; i<len; i++)
+ {
+ sprintf(p, "%.2x00", str[i]);
+ p+=4;
+ }
+ *p=0;
+ return sz;
+}
diff --git a/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.h b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.h
new file mode 100644
index 0000000..fb4201c
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.h
@@ -0,0 +1,31 @@
+/** \file ExtraSocketCatchcopy.h
+\brief Define the socket of catchcopy
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef EXTRASOCKETCATCHCOPY_H
+#define EXTRASOCKETCATCHCOPY_H
+
+#include <string>
+#include <QString>
+
+#ifdef Q_OS_UNIX
+ #include <unistd.h>
+ #include <sys/types.h>
+#else
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#endif
+
+/// \brief to have extra socket function
+class ExtraSocketCatchcopy
+{
+public:
+ /// \brief to get the socket path
+ static const std::string pathSocket();
+ static char * toHex(const char *str);
+};
+
+#endif // EXTRASOCKETCATCHCOPY_H
diff --git a/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.cpp b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.cpp
new file mode 100644
index 0000000..6fd1172
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.cpp
@@ -0,0 +1,740 @@
+/** \file ServerCatchcopy.cpp
+\brief Define the server of catchcopy
+\author alpha_one_x86*/
+
+#include "ServerCatchcopy.h"
+#include "VariablesCatchcopy.h"
+#include "ExtraSocketCatchcopy.h"
+
+#include <QFile>
+#include <QDataStream>
+#include <queue>
+#include <vector>
+#include <string>
+
+std::string stringimplode2(const std::vector<std::string>& elems, const std::string &delim)
+{
+ std::string newString;
+ for (std::vector<std::string>::const_iterator ii = elems.begin(); ii != elems.cend(); ++ii)
+ {
+ newString += (*ii);
+ if ( ii + 1 != elems.end() ) {
+ newString += delim;
+ }
+ }
+ return newString;
+}
+
+ServerCatchcopy::ServerCatchcopy()
+{
+ name="Default avanced copier";
+ idNextClient=0;
+ error_string="Unknown error";
+ connect(&server, &QLocalServer::newConnection, this, &ServerCatchcopy::newConnection);
+}
+
+ServerCatchcopy::~ServerCatchcopy()
+{
+ close();
+}
+
+bool ServerCatchcopy::isListening() const
+{
+ return server.isListening();
+}
+
+void ServerCatchcopy::setName(const std::string & name)
+{
+ this->name=name;
+}
+
+std::string ServerCatchcopy::getName() const
+{
+ return name;
+}
+
+/// \brief to get a client list
+std::vector<std::string> ServerCatchcopy::clientsList() const
+{
+ std::vector<std::string> clients;
+ int index=0;
+ int size=clientList.size();
+ while(index<size)
+ {
+ clients.push_back(clientList[index].name);
+ index++;
+ }
+ return clients;
+}
+
+bool ServerCatchcopy::listen()
+{
+ QLocalSocket socketTestConnection;
+ pathSocket=ExtraSocketCatchcopy::pathSocket();
+ socketTestConnection.connectToServer(QString::fromStdString(pathSocket));
+ if(socketTestConnection.waitForConnected(CATCHCOPY_COMMUNICATION_TIMEOUT))
+ {
+ error_string="Other server is listening";
+ emit error(error_string);
+ return false;
+ }
+ else
+ {
+ if(!server.removeServer(QString::fromStdString(pathSocket)))
+ {
+ error_string="Unable to remove the old server";
+ emit error(error_string);
+ }
+ #ifndef Q_OS_MAC
+ server.setSocketOptions(QLocalServer::UserAccessOption);
+ #endif
+ if(server.listen(QString::fromStdString(pathSocket)))
+ return true;
+ else
+ {
+ error_string=QStringLiteral("Unable to listen %1: %2").arg(QString::fromStdString(pathSocket)).arg(server.errorString()).toStdString();
+ emit error(error_string);
+ return false;
+ }
+ }
+}
+
+void ServerCatchcopy::close()
+{
+ if(server.isListening())
+ {
+ int index=0;
+ while(index<clientList.size())
+ {
+ clientList.at(index).socket->disconnectFromServer();
+ index++;
+ }
+ server.close();
+ if(!server.removeServer(QString::fromStdString(pathSocket)))
+ {
+ error_string="Unable to remove the old server";
+ emit error(error_string);
+ }
+ }
+}
+
+const std::string ServerCatchcopy::errorStringServer() const
+{
+ return server.errorString().toStdString();
+}
+
+const std::string ServerCatchcopy::errorString() const
+{
+ return error_string;
+}
+
+/// \brief New connexion
+void ServerCatchcopy::newConnection()
+{
+ while(server.hasPendingConnections())
+ {
+ QLocalSocket *clientSocket = server.nextPendingConnection();
+ if(clientSocket!=NULL)
+ {
+ do
+ {
+ idNextClient++;
+ if(idNextClient>2000000000)
+ idNextClient=0;
+ } while(clientIdFound(idNextClient));
+ Client newClient;
+ newClient.id = idNextClient;
+ newClient.socket = clientSocket;
+ newClient.haveData = false;
+ newClient.firstProtocolReplied = false;
+ newClient.detectTimeOut = new QTimer(this);
+ newClient.detectTimeOut->setSingleShot(true);
+ newClient.detectTimeOut->setInterval(CATCHCOPY_COMMUNICATION_TIMEOUT);
+ newClient.name="Unknown";
+ connect(newClient.socket, static_cast<void(QLocalSocket::*)(QLocalSocket::LocalSocketError)>(&QLocalSocket::error), this, &ServerCatchcopy::connectionError,Qt::QueuedConnection);
+ connect(newClient.socket, &QIODevice::readyRead, this, &ServerCatchcopy::readyRead,Qt::QueuedConnection);
+ connect(newClient.socket, &QLocalSocket::disconnected, this, &ServerCatchcopy::disconnected,Qt::QueuedConnection);
+ connect(newClient.detectTimeOut,&QTimer::timeout, this, &ServerCatchcopy::checkTimeOut,Qt::QueuedConnection);
+ clientList << newClient;
+ emit connectedClient(newClient.id);
+ }
+ }
+}
+
+bool ServerCatchcopy::clientIdFound(const uint32_t &id) const
+{
+ int index=0;
+ while(index<clientList.size())
+ {
+ if(clientList.at(index).id==id)
+ return true;
+ index++;
+ }
+ return false;
+}
+
+/// \brief new error at connexion
+void ServerCatchcopy::connectionError(const QLocalSocket::LocalSocketError &error)
+{
+ QLocalSocket *socket=qobject_cast<QLocalSocket *>(QObject::sender());
+ if(socket==NULL)
+ {
+ qWarning() << "Unlocated client socket!";
+ return;
+ }
+ int index=0;
+ while(index<clientList.size())
+ {
+ if(clientList.at(index).socket==socket)
+ {
+ if(error!=QLocalSocket::PeerClosedError)
+ {
+ qWarning() << "error detected for the client: " << index << ", type: " << error;
+ clientList.at(index).socket->disconnectFromServer();
+ }
+ return;
+ }
+ index++;
+ }
+}
+
+void ServerCatchcopy::disconnected()
+{
+ QLocalSocket *socket=qobject_cast<QLocalSocket *>(QObject::sender());
+ if(socket==NULL)
+ {
+ qWarning() << "Unlocated client socket!";
+ return;
+ }
+ int index=0;
+ while(index<clientList.size())
+ {
+ if(clientList.at(index).socket==socket)
+ {
+ const uint32_t &id=clientList.at(index).id;
+ //ClientList.at(index).socket->disconnectFromServer();//already disconnected
+ delete clientList.at(index).detectTimeOut;
+ clientList.at(index).socket->deleteLater();
+ clientList.removeAt(index);
+ emit disconnectedClient(id);
+ return;
+ }
+ index++;
+ }
+ qWarning() << "Unlocated client!";
+}
+
+void ServerCatchcopy::disconnectClient(const uint32_t &id)
+{
+ int index=0;
+ while(index<clientList.size())
+ {
+ if(clientList.at(index).id==id)
+ {
+ clientList.at(index).socket->disconnectFromServer();
+ return;
+ }
+ index++;
+ }
+ qWarning() << "Unlocated client!";
+}
+
+void ServerCatchcopy::readyRead()
+{
+ QLocalSocket *socket=qobject_cast<QLocalSocket *>(QObject::sender());
+ if(socket==NULL)
+ {
+ qWarning() << "Unlocated client socket!";
+ return;
+ }
+ int index=0;
+ while(index<clientList.size())
+ {
+ if(clientList.at(index).socket==socket)
+ {
+ while(socket->bytesAvailable()>0)
+ {
+ if(!clientList.at(index).haveData)
+ {
+ if(socket->bytesAvailable()<(int)sizeof(int))//ignore because first int is cuted!
+ {
+ /*error_string="Bytes available is not sufficient to do a int";
+ emit error(error_string);
+ disconnectClient(ClientList.at(index).id);*/
+ return;
+ }
+ QDataStream in(socket);
+ in.setVersion(QDataStream::Qt_4_4);
+ in >> clientList[index].dataSize;
+ clientList[index].dataSize-=sizeof(int);
+ if(clientList.at(index).dataSize>64*1024*1024) // 64MB
+ {
+ error_string="Reply size is >64MB, seam corrupted";
+ emit communicationError(error_string);
+ disconnectClient(clientList.at(index).id);
+ return;
+ }
+ if(clientList.at(index).dataSize<(int)(sizeof(int) //orderId
+ + sizeof(uint32_t) //returnCode
+ + sizeof(uint32_t) //string list size
+ ))
+ {
+ error_string="Reply size is too small to have correct code";
+ emit communicationError(error_string);
+ disconnectClient(clientList.at(index).id);
+ return;
+ }
+ clientList[index].haveData=true;
+ }
+ if(clientList.at(index).dataSize<(clientList.at(index).data.size()+socket->bytesAvailable()))
+ clientList[index].data.append(socket->read(clientList.at(index).dataSize-clientList.at(index).data.size()));
+ else
+ clientList[index].data.append(socket->readAll());
+ if(clientList.at(index).dataSize==(uint32_t)clientList.at(index).data.size())
+ {
+ if(!checkDataIntegrity(clientList.at(index).data))
+ {
+ emit communicationError("Data integrity wrong: "+QString(clientList.at(index).data.toHex()).toStdString());
+ clientList[index].data.clear();
+ clientList[index].haveData=false;
+ qWarning() << "Data integrity wrong";
+ return;
+ }
+ std::vector<std::string> returnList;
+ QStringList returnListQt;
+ uint32_t orderId;
+ QDataStream in(clientList.at(index).data);
+ in.setVersion(QDataStream::Qt_4_4);
+ in >> orderId;
+ in >> returnListQt;
+ {
+ int index=0;
+ while(index<returnListQt.size())
+ {
+ returnList.push_back(returnListQt.at(index).toStdString());
+ index++;
+ }
+ }
+ clientList[index].data.clear();
+ clientList[index].haveData=false;
+ if(clientList.at(index).queryNoReplied.contains(orderId))
+ {
+ emit communicationError("Duplicate query id");
+ qWarning() << "Duplicate query id";
+ return;
+ }
+ clientList[index].queryNoReplied << orderId;
+ if(!clientList.at(index).firstProtocolReplied && returnList.size()==2 && returnList.front()=="protocol")
+ {
+ clientList[index].firstProtocolReplied=true;
+ protocolSupported(clientList.at(index).id,orderId,(returnList.back()==CATCHCOPY_PROTOCOL_VERSION));
+ }
+ else
+ parseInput(clientList.at(index).id,orderId,returnList);
+ }
+ }
+ if(clientList.at(index).haveData)
+ clientList.at(index).detectTimeOut->start();
+ else
+ clientList.at(index).detectTimeOut->stop();
+ return;
+ }
+ index++;
+ }
+ emit error("Unallocated client!");
+ qWarning() << "Unallocated client!";
+}
+
+bool ServerCatchcopy::checkDataIntegrity(const QByteArray &data)
+{
+ uint32_t orderId;
+ qint32 listSize;
+ QDataStream in(data);
+ in.setVersion(QDataStream::Qt_4_4);
+ in >> orderId;
+ in >> listSize;
+ if(listSize>65535)
+ {
+ emit error("List size is wrong");
+ qWarning() << "List size is wrong";
+ return false;
+ }
+ int index=0;
+ while(index<listSize)
+ {
+ qint32 stringSize;
+ in >> stringSize;
+ if(stringSize>65535)
+ {
+ emit error("String size is wrong");
+ return false;
+ }
+ if(stringSize>(in.device()->size()-in.device()->pos()))
+ {
+ emit error(QStringLiteral("String size is greater than the data: %1>(%2-%3)").arg(stringSize).arg(in.device()->size()).arg(in.device()->pos()).toStdString());
+ return false;
+ }
+ in.device()->seek(in.device()->pos()+stringSize);
+ index++;
+ }
+ if(in.device()->size()!=in.device()->pos())
+ {
+ emit error("Remaining data after string list parsing");
+ return false;
+ }
+ return true;
+}
+
+void ServerCatchcopy::parseInput(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &returnList)
+{
+ const ServerCatchcopy::inputReturnType returnVal=parseInputCurrentProtocol(client,orderId,returnList);
+ switch(returnVal)
+ {
+ case Ok:
+ emit newQuery(client,orderId,returnList);
+ break;
+ case Replied:
+ break;
+ case ExtensionWrong:
+ //protocolExtensionSupported(client,orderId,false);
+ break;
+ case WrongArgument:
+ incorrectArgument(client,orderId);
+ break;
+ case WrongArgumentListSize:
+ incorrectArgumentListSize(client,orderId);
+ break;
+ case UnknowOrder:
+ emit error("Unknown query: "+std::to_string(returnVal)+", with client: "+std::to_string(client)+", orderId: "+std::to_string(orderId)+", returnList: "+stringimplode2(returnList,", "));
+ qWarning() << "Unknown query";
+ unknowOrder(client,orderId);
+ break;
+ }
+}
+
+ServerCatchcopy::inputReturnType ServerCatchcopy::parseInputCurrentProtocol(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &returnList)
+{
+ if(returnList.size()==0)
+ return WrongArgumentListSize;
+ //if is supported
+ std::string firstArgument=returnList.front();
+ if(firstArgument=="protocol")
+ {
+ if(returnList.size()!=2)
+ return WrongArgumentListSize;
+ emit askProtocolCompatibility(client,orderId,returnList.back());
+ return Ok;
+ }
+ else if(firstArgument=="protocol extension")
+ {
+ if(returnList.size()>3 || returnList.size()<2)
+ return WrongArgumentListSize;
+ return ExtensionWrong;
+ }
+ else if(firstArgument=="client")
+ {
+ if(returnList.size()!=2)
+ return WrongArgumentListSize;
+ int index=0;
+ int size=clientList.size();
+ while(index<size)
+ {
+ if(clientList.at(index).id==client)
+ {
+ clientList[index].name=returnList.back();
+ break;
+ }
+ index++;
+ }
+ emit clientName(client,returnList.back());
+ clientRegistered(client,orderId);
+ return Replied;
+ }
+ else if(firstArgument=="server")
+ {
+ if(returnList.size()!=2)
+ return WrongArgumentListSize;
+ if(returnList.back()!="name?")
+ return WrongArgument;
+ serverName(client,orderId,name);
+ return Replied;
+ }
+ else if(firstArgument=="cp")
+ {
+ if(returnList.size()<3)
+ return WrongArgumentListSize;
+ std::vector<std::string> sourceList=returnList;
+ sourceList.erase(sourceList.cbegin());
+ sourceList.pop_back();
+ emitNewCopy(client,orderId,sourceList,returnList.back());
+ return Ok;
+ }
+ else if(firstArgument=="cp-?")
+ {
+ if(returnList.size()<2)
+ return WrongArgumentListSize;
+ std::vector<std::string> sourceList=returnList;
+ sourceList.erase(sourceList.cbegin());
+ emitNewCopyWithoutDestination(client,orderId,sourceList);
+ return Ok;
+ }
+ else if(firstArgument=="mv")
+ {
+ if(returnList.size()<3)
+ return WrongArgumentListSize;
+ std::vector<std::string> sourceList=returnList;
+ sourceList.erase(sourceList.cbegin());
+ sourceList.pop_back();
+ emitNewMove(client,orderId,sourceList,returnList.back());
+ return Ok;
+ }
+ else if(firstArgument=="mv-?")
+ {
+ if(returnList.size()<2)
+ return WrongArgumentListSize;
+ std::vector<std::string> sourceList=returnList;
+ sourceList.erase(sourceList.cbegin());
+ emitNewMoveWithoutDestination(client,orderId,sourceList);
+ return Ok;
+ }
+ else //if is not supported
+ return UnknowOrder;
+}
+
+void ServerCatchcopy::emitNewCopyWithoutDestination(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &sources)
+{
+ LinkGlobalToLocalClient newAssociation;
+ newAssociation.idClient=client;
+ newAssociation.orderId=orderId;
+ newAssociation.globalOrderId=incrementOrderId();
+ LinkGlobalToLocalClientList << newAssociation;
+ emit newCopyWithoutDestination(newAssociation.globalOrderId,sources);
+}
+
+void ServerCatchcopy::emitNewCopy(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination)
+{
+ LinkGlobalToLocalClient newAssociation;
+ newAssociation.idClient=client;
+ newAssociation.orderId=orderId;
+ newAssociation.globalOrderId=incrementOrderId();
+ LinkGlobalToLocalClientList << newAssociation;
+ emit newCopy(newAssociation.globalOrderId,sources,destination);
+}
+
+void ServerCatchcopy::emitNewMoveWithoutDestination(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &sources)
+{
+ LinkGlobalToLocalClient newAssociation;
+ newAssociation.idClient=client;
+ newAssociation.orderId=orderId;
+ newAssociation.globalOrderId=incrementOrderId();
+ LinkGlobalToLocalClientList << newAssociation;
+ emit newMoveWithoutDestination(newAssociation.globalOrderId,sources);
+}
+
+void ServerCatchcopy::emitNewMove(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination)
+{
+ LinkGlobalToLocalClient newAssociation;
+ newAssociation.idClient=client;
+ newAssociation.orderId=orderId;
+ newAssociation.globalOrderId=incrementOrderId();
+ LinkGlobalToLocalClientList << newAssociation;
+ emit newMove(newAssociation.globalOrderId,sources,destination);
+}
+
+void ServerCatchcopy::copyFinished(const uint32_t &globalOrderId,const bool &withError)
+{
+ int index=0;
+ while(index<LinkGlobalToLocalClientList.size())
+ {
+ if(LinkGlobalToLocalClientList.at(index).globalOrderId==globalOrderId)
+ {
+ copyFinished(LinkGlobalToLocalClientList.at(index).idClient,LinkGlobalToLocalClientList.at(index).orderId,withError);
+ LinkGlobalToLocalClientList.removeAt(index);
+ orderList.removeOne(globalOrderId);
+ return;
+ }
+ index++;
+ }
+}
+
+void ServerCatchcopy::copyCanceled(const uint32_t &globalOrderId)
+{
+ int index=0;
+ while(index<LinkGlobalToLocalClientList.size())
+ {
+ if(LinkGlobalToLocalClientList.at(index).globalOrderId==globalOrderId)
+ {
+ copyCanceled(LinkGlobalToLocalClientList.at(index).idClient,LinkGlobalToLocalClientList.at(index).orderId);
+ LinkGlobalToLocalClientList.removeAt(index);
+ orderList.removeOne(globalOrderId);
+ return;
+ }
+ index++;
+ }
+}
+
+void ServerCatchcopy::reply(const uint32_t &client,const uint32_t &orderId,const uint32_t &returnCode,const std::string &returnString)
+{
+ std::vector<std::string> returnList;
+ returnList.push_back(returnString);
+ reply(client,orderId,returnCode,returnList);
+}
+
+void ServerCatchcopy::reply(const uint32_t &client,const uint32_t &orderId,const uint32_t &returnCode,const std::vector<std::string> &returnList)
+{
+ int index=0;
+ while(index<clientList.size())
+ {
+ if(clientList.at(index).id==client)
+ {
+ if(clientList.at(index).socket->isValid() && clientList.at(index).socket->state()==QLocalSocket::ConnectedState)
+ {
+ if(!clientList.at(index).queryNoReplied.contains(orderId))
+ {
+ qWarning() << "Reply to missing query or previously replied";
+ return;
+ }
+ clientList[index].queryNoReplied.removeOne(orderId);
+ //cut string list and send it as block of 32KB
+ QByteArray block;
+ QDataStream out(&block, QIODevice::WriteOnly);
+ out.setVersion(QDataStream::Qt_4_4);
+ out << int(0);
+ out << orderId;
+ out << returnCode;
+ QStringList returnListQt;
+ {
+ unsigned int index=0;
+ while(index<returnList.size())
+ {
+ returnListQt << QString::fromStdString(returnList.at(index));
+ index++;
+ }
+ }
+ out << returnListQt;
+ out.device()->seek(0);
+ out << block.size();
+ do
+ {
+ QByteArray blockToSend;
+ int byteWriten;
+ blockToSend=block.left(32*1024);//32KB
+ block.remove(0,blockToSend.size());
+ byteWriten = clientList[index].socket->write(blockToSend);
+ if(!clientList[index].socket->isValid())
+ {
+ error_string="Socket is not valid";
+ emit error(error_string);
+ return;
+ }
+ if(clientList[index].socket->error()!=QLocalSocket::UnknownSocketError && clientList[index].socket->error()!=QLocalSocket::PeerClosedError)
+ {
+ error_string="Error with socket: "+clientList[index].socket->errorString().toStdString();
+ emit error(error_string);
+ return;
+ }
+ if(blockToSend.size()!=byteWriten)
+ {
+ error_string="All the bytes have not be written";
+ emit error(error_string);
+ return;
+ }
+ }
+ while(block.size());
+ }
+ else
+ {
+ error_string="Socket is not valid or not connected";
+ emit error(error_string);
+ }
+ return;
+ }
+ index++;
+ }
+ qWarning() << "Client id not found:" << client;
+}
+
+void ServerCatchcopy::protocolSupported(const uint32_t &client,const uint32_t &orderId,const bool &value)
+{
+ if(value)
+ reply(client,orderId,1000,"protocol supported");
+ else
+ reply(client,orderId,5003,"protocol not supported");
+}
+
+void ServerCatchcopy::incorrectArgumentListSize(const uint32_t &client,const uint32_t &orderId)
+{
+ reply(client,orderId,5000,"incorrect argument list size");
+}
+
+void ServerCatchcopy::incorrectArgument(const uint32_t &client,const uint32_t &orderId)
+{
+ reply(client,orderId,5001,"incorrect argument");
+}
+
+void ServerCatchcopy::clientRegistered(const uint32_t &client,const uint32_t &orderId)
+{
+ reply(client,orderId,1003,"client registered");
+}
+
+void ServerCatchcopy::serverName(const uint32_t &client,const uint32_t &orderId,const std::string &name)
+{
+ reply(client,orderId,1004,name);
+}
+
+void ServerCatchcopy::copyFinished(const uint32_t &client,const uint32_t &orderId,const bool &withError)
+{
+ if(!withError)
+ reply(client,orderId,1005,"finished");
+ else
+ reply(client,orderId,1006,"finished with error(s)");
+}
+
+void ServerCatchcopy::copyCanceled(const uint32_t &client,const uint32_t &orderId)
+{
+ reply(client,orderId,1007,"canceled");
+}
+
+void ServerCatchcopy::unknowOrder(const uint32_t &client,const uint32_t &orderId)
+{
+ reply(client,orderId,5002,"unknown order");
+}
+
+void ServerCatchcopy::checkTimeOut()
+{
+ QTimer *timer=qobject_cast<QTimer *>(QObject::sender());
+ if(timer==NULL)
+ {
+ qWarning() << "Unallocated client timer!";
+ return;
+ }
+ int index=0;
+ while(index<clientList.size())
+ {
+ if(clientList.at(index).detectTimeOut==timer)
+ {
+ clientList.at(index).detectTimeOut->stop();
+ if(clientList.at(index).haveData)
+ {
+ error_string="The client is too long to send the next part of the reply: "+QString(clientList.at(index).data.toHex()).toStdString();
+ clientList[index].haveData=false;
+ clientList[index].data.clear();
+ clientList.at(index).socket->disconnectFromServer();
+ emit error(error_string);
+ }
+ return;
+ }
+ index++;
+ }
+}
+
+uint32_t ServerCatchcopy::incrementOrderId()
+{
+ do
+ {
+ nextOrderId++;
+ if(nextOrderId>2000000)
+ nextOrderId=0;
+ } while(orderList.contains(nextOrderId));
+ return nextOrderId;
+}
diff --git a/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.h b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.h
new file mode 100644
index 0000000..85acff9
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.h
@@ -0,0 +1,144 @@
+/** \file ServerCatchcopy.h
+\brief Define the server of catchcopy
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef SERVERCATCHCOPY_H
+#define SERVERCATCHCOPY_H
+
+#include <QObject>
+#include <QLocalSocket>
+#include <QLocalServer>
+#include <vector>
+#include <string>
+#include <QByteArray>
+#include <QTimer>
+
+/// \brief Define the server of catchcopy
+class ServerCatchcopy : public QObject
+{
+ Q_OBJECT
+ public:
+ ServerCatchcopy();
+ ~ServerCatchcopy();
+ /// \brief return if is listening
+ bool isListening() const;
+ /// \brief try listen
+ bool listen();
+ /// \brief try close the server
+ void close();
+ /// \brief get the error string on the QLocalServer
+ const std::string errorStringServer() const;
+ /// \brief get the general error string
+ const std::string errorString() const;
+ /// \brief set the name of the server
+ void setName(const std::string & name);
+ /// \brief get the name
+ std::string getName() const;
+ /// \brief to get a client list
+ std::vector<std::string> clientsList() const;
+ private:
+ std::string pathSocket;
+ std::string name;
+ std::string error_string;
+ QLocalServer server;
+ uint32_t idNextClient;
+ struct Client
+ {
+ uint32_t id;
+ QLocalSocket *socket;
+ QByteArray data;
+ bool haveData;
+ uint32_t dataSize;
+ bool firstProtocolReplied;
+ QList<uint32_t> queryNoReplied;
+ QTimer *detectTimeOut;
+ std::string name;
+ };
+ QList<Client> clientList;
+ struct LinkGlobalToLocalClient
+ {
+ uint32_t idClient;
+ uint32_t orderId;
+ uint32_t globalOrderId;
+ };
+ QList<LinkGlobalToLocalClient> LinkGlobalToLocalClientList;
+ enum inputReturnType{Ok,Replied,ExtensionWrong,WrongArgument,WrongArgumentListSize,UnknowOrder};
+ inputReturnType parseInputCurrentProtocol(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &returnList);
+ bool clientIdFound(const uint32_t &id) const;
+ uint32_t nextOrderId;
+ QList<uint32_t> orderList;
+ uint32_t incrementOrderId();
+ void emitNewCopyWithoutDestination(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &sources);
+ void emitNewCopy(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination);
+ void emitNewMoveWithoutDestination(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &sources);
+ void emitNewMove(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination);
+ bool checkDataIntegrity(const QByteArray &data);
+ protected:
+ void parseInput(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &returnList);
+ private slots:
+ void newConnection();
+ void connectionError(const QLocalSocket::LocalSocketError &error);
+ void disconnected();
+ void readyRead();
+ void checkTimeOut();
+ public slots:
+ /// \brief disconnect one client
+ void disconnectClient(const uint32_t &id);
+ /// \brief reply to a client with std::vector<std::string>
+ void reply(const uint32_t &client,const uint32_t &orderId,const uint32_t &returnCode,const std::vector<std::string> &returnList);
+ /// \brief reply to a client
+ void reply(const uint32_t &client,const uint32_t &orderId,const uint32_t &returnCode,const std::string &returnString);
+ //reply
+ /// \brief send if the protocol is supported
+ void protocolSupported(const uint32_t &client,const uint32_t &orderId,const bool &value);
+ /// \brief send incorrect arguement list size
+ void incorrectArgumentListSize(const uint32_t &client,const uint32_t &orderId);
+ /// \brief send incorrect arguement
+ void incorrectArgument(const uint32_t &client,const uint32_t &orderId);
+ /// \brief the client is registred
+ void clientRegistered(const uint32_t &client,const uint32_t &orderId);
+ /// \brief send the server name
+ void serverName(const uint32_t &client,const uint32_t &orderId,const std::string &name);
+ /// \brief send the copy is finished
+ void copyFinished(const uint32_t &client,const uint32_t &orderId,const bool &withError);
+ /// \brief send the copy is canceled
+ void copyCanceled(const uint32_t &client,const uint32_t &orderId);
+ /// \brief send the copy is finished by global is order
+ void copyFinished(const uint32_t &globalOrderId,const bool &withError);
+ /// \brief send copy cancel by global is order
+ void copyCanceled(const uint32_t &globalOrderId);
+ /// \brief send the unknow order
+ void unknowOrder(const uint32_t &client,const uint32_t &orderId);
+ signals:
+ /// \brief send connected client
+ void connectedClient(const uint32_t &id);
+ /// \brief send disconnect client
+ void disconnectedClient(const uint32_t &id);
+ /// \brief have new query
+ void newQuery(const uint32_t &client,const uint32_t &orderId,const std::vector<std::string> &returnList);
+ /// \brief have new error
+ void error(const std::string &error);
+ void communicationError(const std::string &error);
+ //query
+ /// \brief ask the protocol compatility
+ void askProtocolCompatibility(const uint32_t &client,const uint32_t &orderId,const std::string &version);
+ /// \brief ask protocol extension
+ void askProtocolExtension(const uint32_t &client,const uint32_t &orderId,const std::string &extension);
+ /// \brief ask protocol extension with version
+ void askProtocolExtension(const uint32_t &client,const uint32_t &orderId,const std::string &extension,const std::string &version);
+ /// \brief send the client name, without query id
+ void clientName(const uint32_t &client,const std::string &name);
+ /// \brief send the client have ask the server name
+ void askServerName(const uint32_t &client,const uint32_t &orderId);
+ /// \brief copy is send, by globalOrderId, without destination
+ void newCopyWithoutDestination(const uint32_t &globalOrderId,const std::vector<std::string> &sources);
+ /// \brief copy is send, by globalOrderId, with destination
+ void newCopy(const uint32_t &globalOrderId,const std::vector<std::string> &sources,const std::string &destination);
+ /// \brief move is send, by globalOrderId, without destination
+ void newMoveWithoutDestination(const uint32_t &globalOrderId,const std::vector<std::string> &sources);
+ /// \brief move is send, by globalOrderId, with destination
+ void newMove(const uint32_t &globalOrderId,const std::vector<std::string> &sources,const std::string &destination);
+};
+
+#endif // SERVERCATCHCOPY_H
diff --git a/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/VariablesCatchcopy.h b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/VariablesCatchcopy.h
new file mode 100644
index 0000000..135c087
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/VariablesCatchcopy.h
@@ -0,0 +1,13 @@
+/** \file VariablesCatchcopy.h
+\brief Define the variable for catchcopy
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLECATCHCOPY_H
+#define VARIABLECATCHCOPY_H
+
+#define CATCHCOPY_PROTOCOL_VERSION "0002"
+#define CATCHCOPY_COMMUNICATION_TIMEOUT 200
+
+#endif // VARIABLECATCHCOPY_H
+
diff --git a/plugins/Listener/catchcopy-v0002/documentation.dox b/plugins/Listener/catchcopy-v0002/documentation.dox
new file mode 100644
index 0000000..51aa937
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/documentation.dox
@@ -0,0 +1,32 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage catchcopy-v0002
+
+ \section mainpage_overview Overview
+
+ Is the default listener to wait a copy/move. It use the catchcopy protocol.\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section mainpage_algorithm Protocol
+
+ The protocol in version 0.0.0.2 is used, you can see the documentation on <a href="http://catchcopy.first-world.info/">Catchcopy web site</a>
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.
+
+*/
diff --git a/plugins/Listener/catchcopy-v0002/informations.xml b/plugins/Listener/catchcopy-v0002/informations.xml
new file mode 100644
index 0000000..9efc7ce
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Listener for catchcopy v0002]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Écouteur pour catchcopy v0002]]></title>
+ <!-- What kind of plugin this is -->
+ <category>Listener</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Listener for catchcopy v0002. Allow to receive copy list from plugin/explorer compatible with catchcopy.]]></description>
+ <description xml:lang="fr"><![CDATA[Écouteur pour catchcopy v0002. Permet de recevoir un liste de copie venant d'un plugin/explorateur avec catchcopy.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>catchcopy-v0002</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins/Listener/catchcopy-v0002/listener.cpp b/plugins/Listener/catchcopy-v0002/listener.cpp
new file mode 100644
index 0000000..e45a08b
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/listener.cpp
@@ -0,0 +1,123 @@
+#include "listener.h"
+#include "catchcopy-api-0002/ExtraSocketCatchcopy.h"
+#include "../../../cpp11addition.h"
+
+Listener::Listener()
+{
+ server.setName(tr("Ultracopier").toStdString());
+ connect(&server,&ServerCatchcopy::newCopyWithoutDestination, this,&Listener::copyWithoutDestination);
+ connect(&server,&ServerCatchcopy::newCopy, this,&Listener::copy);
+ connect(&server,&ServerCatchcopy::newMoveWithoutDestination, this,&Listener::moveWithoutDestination);
+ connect(&server,&ServerCatchcopy::newMove, this,&Listener::move);
+ connect(&server,&ServerCatchcopy::error, this,&Listener::errorInternal);
+ connect(&server,&ServerCatchcopy::communicationError, this,&Listener::communicationErrorInternal);
+ connect(&server,&ServerCatchcopy::clientName, this,&Listener::clientName);
+ connect(&server,&ServerCatchcopy::clientName, this,&Listener::newClientList);
+ connect(&server,&ServerCatchcopy::connectedClient, this,&Listener::newClientList);
+ connect(&server,&ServerCatchcopy::disconnectedClient, this,&Listener::newClientList);
+
+}
+
+void Listener::listen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+ExtraSocketCatchcopy::pathSocket());
+ if(server.listen())
+ emit newState(Ultracopier::FullListening);
+ else
+ emit newState(Ultracopier::NotListening);
+}
+
+void Listener::close()
+{
+ server.close();
+ emit newState(Ultracopier::NotListening);
+}
+
+const std::string Listener::errorString() const
+{
+ return server.errorString();
+}
+
+void Listener::setResources(OptionInterface * options, const std::string &writePath, const std::string &pluginPath, const bool &portableVersion)
+{
+ Q_UNUSED(options);
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ Q_UNUSED(portableVersion);
+}
+
+/// \brief to get the options widget, NULL if not have
+QWidget * Listener::options()
+{
+ return NULL;
+}
+
+/// \brief to get a client list
+std::vector<std::string> Listener::clientsList() const
+{
+ return server.clientsList();
+}
+
+void Listener::transferFinished(const uint32_t &orderId, const bool &withError)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, orderId: "+std::to_string(orderId)+", withError: "+std::to_string(withError));
+ server.copyFinished(orderId,withError);
+}
+
+void Listener::transferCanceled(const uint32_t &orderId)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, orderId: "+std::to_string(orderId));
+ server.copyCanceled(orderId);
+}
+
+/// \brief to reload the translation, because the new language have been loaded
+void Listener::newLanguageLoaded()
+{
+}
+
+void Listener::errorInternal(const std::string &string)
+{
+ Q_UNUSED(string);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"warning emited from Catchcopy lib: "+string);
+}
+
+void Listener::communicationErrorInternal(const std::string &string)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"warning emited from Catchcopy lib: "+string);
+ emit error(string);
+}
+
+void Listener::clientName(uint32_t client,std::string name)
+{
+ Q_UNUSED(client);
+ Q_UNUSED(name);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("clientName: %1, for the id: %2").arg(QString::fromStdString(name)).arg(client).toStdString());
+}
+
+void Listener::copyWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("copyWithoutDestination(%1,%2)")
+ .arg(orderId)
+ .arg(QString::fromStdString(stringimplode(sources,";")))
+ .toStdString()
+ );
+ emit newCopyWithoutDestination(orderId,sources);
+}
+
+void Listener::copy(const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("copy(%1,%2,%3)").arg(orderId).arg(QString::fromStdString(stringimplode(sources,";")).arg(QString::fromStdString(destination))).toStdString());
+ emit newCopy(orderId,sources,destination);
+}
+
+void Listener::moveWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("moveWithoutDestination(%1,%2)").arg(orderId).arg(QString::fromStdString(stringimplode(sources,";"))).toStdString());
+ emit newMoveWithoutDestination(orderId,sources);
+}
+
+void Listener::move(const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("move(%1,%2,%3)").arg(orderId).arg(QString::fromStdString(stringimplode(sources,";")).arg(QString::fromStdString(destination))).toStdString());
+ emit newMove(orderId,sources,destination);
+}
diff --git a/plugins/Listener/catchcopy-v0002/listener.h b/plugins/Listener/catchcopy-v0002/listener.h
new file mode 100644
index 0000000..8cab248
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/listener.h
@@ -0,0 +1,59 @@
+/** \file listener.h
+\brief Define the server compatible with Ultracopier interface
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef SERVER_H
+#define SERVER_H
+
+#include <string>
+#ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+#include <QtPlugin>
+#endif
+
+#include "Environment.h"
+#include "../../../interface/PluginInterface_Listener.h"
+#include "catchcopy-api-0002/ServerCatchcopy.h"
+
+/// \brief Define the server compatible with Ultracopier interface
+class Listener : public PluginInterface_Listener
+{
+ Q_OBJECT
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.Listener/1.0.0.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_Listener)
+ #endif
+public:
+ Listener();
+ /// \brief try listen the copy/move
+ void listen();
+ /// \brief stop listen to copy/move
+ void close();
+ /// \brief return the error strong
+ const std::string errorString() const;
+ /// \brief set resources for this plugins
+ void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,const bool &portableVersion);
+ /// \brief to get the options widget, NULL if not have
+ QWidget * options();
+ /// \brief to get a client list
+ std::vector<std::string> clientsList() const;
+public slots:
+ /// \brief say to the client that's the copy/move is finished
+ void transferFinished(const uint32_t &orderId,const bool &withError);
+ /// \brief say to the client that's the copy/move is finished
+ void transferCanceled(const uint32_t &orderId);
+ /// \brief to reload the translation, because the new language have been loaded
+ void newLanguageLoaded();
+private:
+ ServerCatchcopy server;
+private slots:
+ void errorInternal(const std::string &string);
+ void communicationErrorInternal(const std::string &string);
+ void clientName(uint32_t client,std::string name);
+ void copyWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources);
+ void copy(const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination);
+ void moveWithoutDestination(const uint32_t &orderId,const std::vector<std::string> &sources);
+ void move(const uint32_t &orderId,const std::vector<std::string> &sources,const std::string &destination);
+};
+
+#endif // SERVER_H
diff --git a/plugins/Listener/catchcopy-v0002/listener.pro b/plugins/Listener/catchcopy-v0002/listener.pro
new file mode 100644
index 0000000..b21289a
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/listener.pro
@@ -0,0 +1,26 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+TEMPLATE = lib
+CONFIG += plugin
+QT += network
+win32:LIBS += -ladvapi32
+HEADERS = \
+ $$PWD/listener.h \
+ $$PWD/catchcopy-api-0002/VariablesCatchcopy.h \
+ $$PWD/catchcopy-api-0002/ServerCatchcopy.h \
+ $$PWD/catchcopy-api-0002/ExtraSocketCatchcopy.h \
+ $$PWD/Environment.h \
+ $$PWD/Variable.h \
+ $$PWD/DebugEngineMacro.h \
+ $$PWD/StructEnumDefinition.h \
+ $$PWD/../../../interface/PluginInterface_Listener.h \
+ $$PWD/../../../cpp11addition.h
+SOURCES = \
+ $$PWD/listener.cpp \
+ $$PWD/catchcopy-api-0002/ServerCatchcopy.cpp \
+ $$PWD/catchcopy-api-0002/ExtraSocketCatchcopy.cpp \
+ $$PWD/../../../cpp11addition.cpp \
+ $$PWD/../../../cpp11additionstringtointcpp.cpp
+TARGET = $$qtLibraryTarget(listener)
diff --git a/plugins/Listener/catchcopy-v0002/plugin.json b/plugins/Listener/catchcopy-v0002/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins/Listener/catchcopy-v0002/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins/PluginLoader/catchcopy-v0002/DebugEngineMacro.h b/plugins/PluginLoader/catchcopy-v0002/DebugEngineMacro.h
new file mode 100644
index 0000000..f9b5349
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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/PluginLoader/catchcopy-v0002/Environment.h b/plugins/PluginLoader/catchcopy-v0002/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/ar/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/ar/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/ar/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/de/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/de/translation.ts
new file mode 100644
index 0000000..dd3552b
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/de/translation.ts
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de" sourcelanguage="en">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation>Im Normalfall ist für 32 oder 64-Bit-Beriebsysteme nur die jeweilige dll wichtig. Die UAC kann geöffnet werden um die dll zu laden.</translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translatorcomment>fix english</translatorcomment>
+ <translation>Alle DLLs sind wichtig (32Bit + 64Bit)</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/el/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/el/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/el/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/en/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/en/translation.ts
new file mode 100644
index 0000000..e4aa3ce
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/en/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/es/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/es/translation.ts
new file mode 100644
index 0000000..577444d
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/es/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es" sourcelanguage="en">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation>Todas las dlls son importantes</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/fr/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/fr/translation.ts
new file mode 100644
index 0000000..809ffee
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/fr/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation>Dans la plupart des cas, seule la DLL 64 bits est importante pour un OS 64 bits, et la DLL 32 bits pour un OS 32 bits. Lorsqu&apos;elle est importante,le chargement d&apos;une DLL peut nécessiter une confirmation (UAC).</translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation>Toutes les dlls sont importantes</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/hi/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/hi/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/hi/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/hu/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/hu/translation.ts
new file mode 100644
index 0000000..30fce33
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/hu/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="hu">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation>Normális esetben csak a 64 bites dll fontos a 64 bites és a 32 bites dll a 32 bites operációs rendszer számára.Amikor lényeges, az UAC megnyitható a dll betöltéséhez.</translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation>Az összes dll fontos</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/id/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/id/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/id/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/it/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/it/translation.ts
new file mode 100644
index 0000000..ba6fb10
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/it/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="it_IT">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation>Solitamente, la dll 64Bit è indispensabile solo per sistemi operativi a 64Bit, e la dll 32Bit per sistemi operativi a 32Bits. Quando è necessario, l&apos; UAC (il controllo dell&apos;account utente) può essere aperto per caricare la dll.</translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation>Tutte le dll sono necessarie</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/ja/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/ja/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/ja/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/ko/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/ko/translation.ts
new file mode 100644
index 0000000..48aea93
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/ko/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ko_KR">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="+17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/nl/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/nl/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/nl/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/no/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/no/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/no/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/pl/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/pl/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/pl/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/pt/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/pt/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/pt/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/ru/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/ru/translation.ts
new file mode 100644
index 0000000..239b785
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/ru/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru" sourcelanguage="en">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation>Все библиотеки являются важным</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/th/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/th/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/th/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/tr/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/tr/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/tr/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/Languages/zh/translation.ts b/plugins/PluginLoader/catchcopy-v0002/Languages/zh/translation.ts
new file mode 100644
index 0000000..a1b2048
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Languages/zh/translation.ts
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>OptionsWidget</name>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="17"/>
+ <source>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it&apos;s important, the UAC can be opened to load the dll.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../OptionsWidget.ui" line="20"/>
+ <source>All the dlls are importants</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.cpp b/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.cpp
new file mode 100644
index 0000000..563e855
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.cpp
@@ -0,0 +1,39 @@
+#include "OptionsWidget.h"
+#include "ui_OptionsWidget.h"
+
+OptionsWidget::OptionsWidget(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::OptionsWidget)
+{
+ ui->setupUi(this);
+}
+
+OptionsWidget::~OptionsWidget()
+{
+ //delete ui;//attached to the main program, then it's the main program responsive the delete
+}
+
+void OptionsWidget::setAllDllIsImportant(bool allDllIsImportant)
+{
+ ui->allDllIsImportant->setChecked(allDllIsImportant);
+}
+
+void OptionsWidget::setDebug(bool Debug)
+{
+ ui->Debug->setChecked(Debug);
+}
+
+void OptionsWidget::on_allDllIsImportant_toggled(bool checked)
+{
+ emit sendAllDllIsImportant(checked);
+}
+
+void OptionsWidget::retranslate()
+{
+ ui->retranslateUi(this);
+}
+
+void OptionsWidget::on_Debug_toggled(bool checked)
+{
+ emit sendDebug(checked);
+}
diff --git a/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.h b/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.h
new file mode 100644
index 0000000..cbbf61c
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.h
@@ -0,0 +1,30 @@
+#ifndef OptionsWidget_H
+#define OptionsWidget_H
+
+#include <QWidget>
+
+namespace Ui {
+class OptionsWidget;
+}
+
+class OptionsWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit OptionsWidget(QWidget *parent = 0);
+ ~OptionsWidget();
+ void setAllDllIsImportant(bool allDllIsImportant);
+ void setDebug(bool Debug);
+ void retranslate();
+private:
+ Ui::OptionsWidget *ui;
+signals:
+ void sendAllDllIsImportant(bool allDllIsImportant);
+ void sendDebug(bool Debug);
+private slots:
+ void on_allDllIsImportant_toggled(bool checked);
+ void on_Debug_toggled(bool checked);
+};
+
+#endif // OptionsWidget_H
diff --git a/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.ui b/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.ui
new file mode 100644
index 0000000..c741676
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.ui
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OptionsWidget</class>
+ <widget class="QWidget" name="OptionsWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>195</width>
+ <height>58</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout">
+ <item>
+ <widget class="QCheckBox" name="allDllIsImportant">
+ <property name="toolTip">
+ <string>In normal case, only the dll 64Bits is important with 64Bits OS, and 32Bits dll with 32Bits OS. When it's important, the UAC can be opened to load the dll.</string>
+ </property>
+ <property name="text">
+ <string>All the dlls are importants</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="Debug">
+ <property name="text">
+ <string notr="true">Debug</string>
+ </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>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/plugins/PluginLoader/catchcopy-v0002/PlatformMacro.h b/plugins/PluginLoader/catchcopy-v0002/PlatformMacro.h
new file mode 100644
index 0000000..f7586b0
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/PlatformMacro.h
@@ -0,0 +1 @@
+#include "../../../PlatformMacro.h"
diff --git a/plugins/PluginLoader/catchcopy-v0002/StructEnumDefinition.h b/plugins/PluginLoader/catchcopy-v0002/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins/PluginLoader/catchcopy-v0002/Variable.h b/plugins/PluginLoader/catchcopy-v0002/Variable.h
new file mode 100644
index 0000000..90e1557
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/Variable.h
@@ -0,0 +1,16 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+//#define ULTRACOPIER_PLUGIN_ALL_IN_ONE
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins/PluginLoader/catchcopy-v0002/documentation.dox b/plugins/PluginLoader/catchcopy-v0002/documentation.dox
new file mode 100644
index 0000000..b9c9d13
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/documentation.dox
@@ -0,0 +1,33 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage catchcopy-v0002
+
+ \section mainpage_overview Overview
+
+ Is the plugin to load the catchcopy plugin into the windows file manager. Mostly it use the command: regsvr32 /s catchcopy32.dll/catchcopy64.dll\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section mainpage_algorithm Requirements
+
+ You can see the documentation on <a href="http://catchcopy.first-world.info/">Catchcopy web site</a>. It use catchcopy32.dll/catchcopy64.dll as explorer plugin for the windows's file manager. Need it into the plugins.\n
+ In function if Ultracopier is compiled by portable version, try load the dll by other way.
+
+ \section license GPL Version 3
+ The code source is under GPL3.
+
+*/
diff --git a/plugins/PluginLoader/catchcopy-v0002/informations.xml b/plugins/PluginLoader/catchcopy-v0002/informations.xml
new file mode 100644
index 0000000..95861a6
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Plugin loader for catchcopy v0002]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Chargeur de plugin pour catchcopy v0002]]></title>
+ <!-- What kind of plugin this is -->
+ <category>PluginLoader</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Plugin loader for catchcopy v0002. Allow to receive copy list from plugin/explorer compatible with catchcopy.]]></description>
+ <description xml:lang="fr"><![CDATA[Chargeur de plugin pour catchcopy v0002. Permet de recevoir un liste de copie venant d'un plugin/explorateur avec catchcopy.]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>catchcopy-v0002</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins/PluginLoader/catchcopy-v0002/plugin.json b/plugins/PluginLoader/catchcopy-v0002/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins/PluginLoader/catchcopy-v0002/pluginLoader.cpp b/plugins/PluginLoader/catchcopy-v0002/pluginLoader.cpp
new file mode 100644
index 0000000..363f372
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/pluginLoader.cpp
@@ -0,0 +1,450 @@
+/** \file pluginLoader.cpp
+\brief Define the session plugin loader test
+\author alpha_one_x86 */
+
+#include "pluginLoader.h"
+#include "PlatformMacro.h"
+#include "../../../cpp11addition.h"
+
+#include <QFile>
+#include <QDir>
+#ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+#include <QCoreApplication>
+#endif
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #define NORMAL_EXT "d.dll"
+ #define SECOND_EXT ".dll"
+#else
+ #define NORMAL_EXT ".dll"
+ #define SECOND_EXT "d.dll"
+#endif
+#define CATCHCOPY_DLL_32 "catchcopy32"
+#define CATCHCOPY_DLL_64 "catchcopy64"
+
+WindowsExplorerLoader::WindowsExplorerLoader()
+{
+ //set the startup value into the variable
+ dllChecked=false;
+ optionsEngine=NULL;
+ allDllIsImportant=false;
+ Debug=false;
+ needBeRegistred=false;
+ changeOfArchDetected=false;
+ is64Bits=false;
+ optionsWidget=new OptionsWidget();
+ connect(optionsWidget,&OptionsWidget::sendAllDllIsImportant,this,&WindowsExplorerLoader::setAllDllIsImportant);
+ connect(optionsWidget,&OptionsWidget::sendDebug,this,&WindowsExplorerLoader::setDebug);
+
+#if defined(_M_X64)//64Bits
+ is64Bits=true;
+#else//32Bits
+ char *arch=getenv("windir");
+ if(arch!=NULL)
+ {
+ QDir dir;
+ if(dir.exists(QString(arch)+"\\SysWOW64\\"))
+ is64Bits=true;
+ /// \note commented because it do a crash at the startup, and useless, because is global variable, it should be removed only by the OS
+ //delete arch;
+ }
+#endif
+}
+
+WindowsExplorerLoader::~WindowsExplorerLoader()
+{
+ //delete optionsWidget;//attached to the main program, then it's the main program responsive the delete
+ setEnabled(false);
+}
+
+void WindowsExplorerLoader::setEnabled(const bool &needBeRegistred)
+{
+ if(!checkExistsDll())
+ {
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ if(needBeRegistred)
+ emit newState(Ultracopier::Caught);
+ else
+ emit newState(Ultracopier::Uncaught);
+ #else
+ emit newState(Ultracopier::Uncaught);
+ #endif
+ if(!needBeRegistred)
+ correctlyLoaded.clear();
+ return;
+ }
+ if(this->needBeRegistred==needBeRegistred)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Double event dropped: %1").arg(needBeRegistred).toStdString());
+ if(needBeRegistred)
+ emit newState(Ultracopier::Caught);
+ else
+ emit newState(Ultracopier::Uncaught);
+ return;
+ }
+ this->needBeRegistred=needBeRegistred;
+ unsigned int index=0;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("start, needBeRegistred: %1, allDllIsImportant: %2").arg(needBeRegistred).arg(allDllIsImportant).toStdString());
+
+ bool oneHaveFound=false;
+ index=0;
+ while(index<importantDll.size())
+ {
+ if(QFile::exists(QString::fromStdString(pluginPath+importantDll.at(index))))
+ {
+ oneHaveFound=true;
+ break;
+ }
+ index++;
+ }
+ if(!oneHaveFound)
+ {
+ index=0;
+ while(index<secondDll.size())
+ {
+ if(QFile::exists(QString::fromStdString(pluginPath+secondDll.at(index))))
+ {
+ oneHaveFound=true;
+ break;
+ }
+ index++;
+ }
+ }
+ if(!oneHaveFound)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"No dll have found");
+ emit newState(Ultracopier::Uncaught);
+ if(!needBeRegistred)
+ correctlyLoaded.clear();
+ return;
+ }
+
+ index=0;
+ bool importantDll_is_loaded=false,secondDll_is_loaded=false;
+ bool importantDll_have_bug=false,secondDll_have_bug=false;
+ int importantDll_count=0,secondDll_count=0;
+ while(index<importantDll.size())
+ {
+ if(!RegisterShellExtDll(pluginPath+importantDll.at(index),needBeRegistred,
+ !(
+ (needBeRegistred)
+ ||
+ (!needBeRegistred && correctlyLoaded.find(importantDll.at(index))!=correctlyLoaded.cend())
+ )
+ ))
+ {
+ if(changeOfArchDetected)
+ {
+ setEnabled(needBeRegistred);
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the important dll have failed: "+importantDll.at(index));
+ importantDll_have_bug=true;
+ }
+ else
+ {
+ importantDll_is_loaded=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the important dll have been loaded: "+importantDll.at(index));
+ }
+ importantDll_count++;
+ index++;
+ }
+ index=0;
+ while(index<secondDll.size())
+ {
+ if(!RegisterShellExtDll(pluginPath+secondDll.at(index),needBeRegistred,
+ !(
+ (needBeRegistred && allDllIsImportant)
+ ||
+ (!needBeRegistred && correctlyLoaded.find(secondDll.at(index))!=correctlyLoaded.cend())
+ )
+ ))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the second dll have failed: "+secondDll.at(index));
+ secondDll_have_bug=true;
+ }
+ else
+ {
+ secondDll_is_loaded=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the second dll have been loaded: "+secondDll.at(index));
+ }
+ secondDll_count++;
+ index++;
+ }
+
+ Ultracopier::CatchState importantDll_state,secondDll_state;
+ if(importantDll_count==0)
+ {
+ if(needBeRegistred)
+ importantDll_state=Ultracopier::Caught;
+ else
+ importantDll_state=Ultracopier::Uncaught;
+ }
+ else
+ {
+ if(importantDll_is_loaded)
+ {
+ if(!importantDll_have_bug)
+ importantDll_state=Ultracopier::Caught;
+ else
+ importantDll_state=Ultracopier::Semiuncaught;
+ }
+ else
+ importantDll_state=Ultracopier::Uncaught;
+ }
+ if(secondDll_count==0)
+ if(needBeRegistred)
+ secondDll_state=Ultracopier::Caught;
+ else
+ secondDll_state=Ultracopier::Uncaught;
+ else
+ {
+ if(secondDll_is_loaded)
+ {
+ if(!secondDll_have_bug)
+ secondDll_state=Ultracopier::Caught;
+ else
+ secondDll_state=Ultracopier::Semiuncaught;
+ }
+ else
+ secondDll_state=Ultracopier::Uncaught;
+ }
+
+ if((importantDll_state==Ultracopier::Uncaught && secondDll_state==Ultracopier::Uncaught) || !needBeRegistred || (importantDll_count==0 && secondDll_count==0))
+ emit newState(Ultracopier::Uncaught);
+ else if(importantDll_state==Ultracopier::Caught)
+ emit newState(Ultracopier::Caught);
+ else
+ emit newState(Ultracopier::Semiuncaught);
+
+ if(!needBeRegistred)
+ correctlyLoaded.clear();
+}
+
+bool WindowsExplorerLoader::checkExistsDll()
+{
+ if(dllChecked)
+ {
+ if(importantDll.size()>0 || secondDll.size()>0)
+ return true;
+ else
+ return false;
+ }
+ dllChecked=true;
+
+ if(is64Bits)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"64Bits is important");
+ importantDll.push_back(CATCHCOPY_DLL_64);
+ secondDll.push_back(CATCHCOPY_DLL_32);
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"32Bits is important");
+ importantDll.push_back(CATCHCOPY_DLL_32);
+ secondDll.push_back(CATCHCOPY_DLL_64);
+ }
+
+ unsigned int index=0;
+ while(index<importantDll.size())
+ {
+ if(!QFile::exists(QString::fromStdString(pluginPath+importantDll.at(index)+NORMAL_EXT)))
+ {
+ if(!QFile::exists(QString::fromStdString(pluginPath+importantDll.at(index)+SECOND_EXT)))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"file not found, drop to the list: "+
+ pluginPath+importantDll.at(index)+NORMAL_EXT+
+ " and "+
+ pluginPath+importantDll.at(index)+SECOND_EXT
+ );
+ importantDll.erase(importantDll.cbegin()+index);
+ index--;
+ }
+ else
+ importantDll[index]+=SECOND_EXT;
+ }
+ else
+ importantDll[index]+=NORMAL_EXT;
+ index++;
+ }
+ index=0;
+ while(index<secondDll.size())
+ {
+ if(!QFile::exists(QString::fromStdString(pluginPath+secondDll.at(index)+NORMAL_EXT)))
+ {
+ if(!QFile::exists(QString::fromStdString(pluginPath+secondDll.at(index)+SECOND_EXT)))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,
+ "file not found, drop to the list: "+pluginPath+secondDll.at(index)+NORMAL_EXT+
+ " and "+pluginPath+secondDll.at(index)+SECOND_EXT
+ );
+ secondDll.erase(secondDll.cbegin()+index);
+ index--;
+ }
+ else
+ secondDll[index]+=SECOND_EXT;
+ }
+ else
+ secondDll[index]+=NORMAL_EXT;
+ index++;
+ }
+ if(importantDll.size()>0 || secondDll.size()>0)
+ return true;
+ else
+ return false;
+}
+
+void WindowsExplorerLoader::setResources(OptionInterface * options, const std::string &writePath, const std::string &pluginPath, const bool &portableVersion)
+{
+ Q_UNUSED(options);
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ Q_UNUSED(portableVersion);
+ #ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+ this->pluginPath=QCoreApplication::applicationDirPath().toStdString()+"/";
+ #else
+ this->pluginPath=pluginPath;
+ #endif
+ this->optionsEngine=options;
+ if(optionsEngine!=NULL)
+ {
+ std::vector<std::pair<std::string, std::string> > KeysList;
+ KeysList.push_back(std::pair<std::string, std::string>("allDllIsImportant","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("Debug","false"));
+ optionsEngine->addOptionGroup(KeysList);
+ allDllIsImportant=stringtobool(optionsEngine->getOptionValue("allDllIsImportant"));
+ Debug=stringtobool(optionsEngine->getOptionValue("Debug"));
+ optionsWidget->setAllDllIsImportant(allDllIsImportant);
+ optionsWidget->setDebug(Debug);
+ }
+}
+
+bool WindowsExplorerLoader::RegisterShellExtDll(const std::string &dllPath, const bool &bRegister, const bool &quiet)
+{
+ if(Debug)
+ {
+ std::string message;
+ if(bRegister)
+ message+="Try load the dll: %1, and "+dllPath;
+ else
+ message+="Try unload the dll: %1, and "+dllPath;
+ if(quiet)
+ message+="don't open the UAC";
+ else
+ message+="open the UAC if needed";
+ QMessageBox::information(NULL,"Debug",QString::fromStdString(message));
+ }
+ if(bRegister && correctlyLoaded.find(dllPath)!=correctlyLoaded.cend())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Try dual load: "+dllPath);
+ return false;
+ }
+ ////////////////////////////// First way to load //////////////////////////////
+ QStringList arguments;
+ if(!Debug)
+ arguments.append("/s");
+ if(!bRegister)
+ arguments.append("/u");
+ arguments.append(QString::fromStdString(dllPath));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: regsvr32 "+arguments.join(" ").toStdString());
+ int result;
+ #ifdef Q_OS_WIN32
+ QProcess process;
+ process.start("regsvr32",arguments);
+ if(!process.waitForStarted())
+ result=985;
+ else if(!process.waitForFinished())
+ result=984;
+ else
+ {
+ result=process.exitCode();
+ QString out=QString::fromLocal8Bit(process.readAllStandardOutput());
+ QString outError=QString::fromLocal8Bit(process.readAllStandardError());
+ if(!out.isEmpty())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"regsvr32 output: "+out.toStdString());
+ if(!outError.isEmpty())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"regsvr32 error output: "+outError.toStdString());
+ }
+ #else
+ result=0;
+ #endif
+ bool ok=false;
+ if(result==0)
+ {
+ if(bRegister)
+ correctlyLoaded.insert(dllPath);
+ ok=true;
+ }
+ #if ! defined(_M_X64)
+ if(result==999 && !changeOfArchDetected)//code of wrong arch for the dll
+ {
+ changeOfArchDetected=true;
+ std::vector<std::string> temp;
+ temp = importantDll;
+ secondDll = importantDll;
+ importantDll = temp;
+ return false;
+ }
+ #endif
+ if(result==5)
+ {
+ if(!quiet || (!bRegister && correctlyLoaded.find(dllPath)!=correctlyLoaded.cend()))
+ {
+ arguments.last()=QStringLiteral("\"%1\"").arg(arguments.last());
+ ////////////////////////////// Last way to load //////////////////////////////
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"try it in win32");
+ // try with regsvr32, win32 because for admin dialog
+
+ #ifdef Q_OS_WIN32
+ wchar_t arrayArg[65535];
+ int size_lenght=arguments.join(" ").toWCharArray(arrayArg);
+ //size_lenght*sizeof(wchar_t)
+ wcscpy(arrayArg+size_lenght*sizeof(wchar_t),TEXT("\0"));
+ SHELLEXECUTEINFO sei;
+ memset(&sei, 0, sizeof(sei));
+ sei.cbSize = sizeof(sei);
+ sei.fMask = SEE_MASK_UNICODE;
+ sei.lpVerb = TEXT("runas");
+ sei.lpFile = TEXT("regsvr32.exe");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"in win32 mode: arrayArg: "+QString::fromWCharArray(arrayArg,size_lenght).toStdString());
+ sei.lpParameters = arrayArg;
+ sei.nShow = SW_SHOW;
+ ok=ShellExecuteEx(&sei);
+ #else
+ ok=true;
+ #endif
+ if(ok && bRegister)
+ correctlyLoaded.insert(dllPath);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"not try because need be quiet: "+dllPath);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"regsvr32 terminated with: "+std::to_string(result));
+ if(!bRegister)
+ correctlyLoaded.erase(dllPath);
+ return ok;
+}
+
+/// \brief to get the options widget, NULL if not have
+QWidget * WindowsExplorerLoader::options()
+{
+ return optionsWidget;
+}
+
+void WindowsExplorerLoader::newLanguageLoaded()
+{
+ optionsWidget->retranslate();
+}
+
+void WindowsExplorerLoader::setAllDllIsImportant(bool allDllIsImportant)
+{
+ this->allDllIsImportant=allDllIsImportant;
+ optionsEngine->setOptionValue("allDllIsImportant",std::to_string(allDllIsImportant));
+}
+
+void WindowsExplorerLoader::setDebug(bool Debug)
+{
+ this->Debug=Debug;
+ optionsEngine->setOptionValue("Debug",std::to_string(Debug));
+}
diff --git a/plugins/PluginLoader/catchcopy-v0002/pluginLoader.h b/plugins/PluginLoader/catchcopy-v0002/pluginLoader.h
new file mode 100644
index 0000000..d18248d
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/pluginLoader.h
@@ -0,0 +1,64 @@
+/** \file pluginLoader.h
+\brief Define the plugin loader
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef PLUGIN_LOADER_TEST_H
+#define PLUGIN_LOADER_TEST_H
+
+#include <QObject>
+#include <QMessageBox>
+#include <unordered_set>
+
+#include <QString>
+#include <QStringList>
+#include <QProcess>
+#include <QSet>
+#ifdef Q_OS_WIN32
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+ #include <tlhelp32.h>
+#endif
+
+#include "../../../interface/PluginInterface_PluginLoader.h"
+#include "Environment.h"
+#include "OptionsWidget.h"
+
+/// \brief \brief Define the plugin loader
+class WindowsExplorerLoader : public PluginInterface_PluginLoader
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.PluginLoader/1.2.4.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_PluginLoader)
+public:
+ WindowsExplorerLoader();
+ ~WindowsExplorerLoader();
+ /// \brief try enable/disable the catching
+ void setEnabled(const bool &needBeRegistred);
+ /// \brief to set resources, writePath can be empty if read only mode
+ void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,const bool &portableVersion);
+ /// \brief to get the options widget, NULL if not have
+ QWidget * options();
+public slots:
+ /// \brief to reload the translation, because the new language have been loaded
+ void newLanguageLoaded();
+private:
+ std::string pluginPath;
+ std::vector<std::string> importantDll,secondDll;
+ std::unordered_set<std::string> correctlyLoaded;
+ bool RegisterShellExtDll(const std::string &dllPath, const bool &bRegister,const bool &quiet);
+ bool checkExistsDll();
+ bool dllChecked;
+ bool needBeRegistred;
+ OptionInterface * optionsEngine;
+ OptionsWidget *optionsWidget;
+ bool allDllIsImportant,Debug;
+ bool changeOfArchDetected,is64Bits;
+private slots:
+ void setAllDllIsImportant(bool allDllIsImportant);
+ void setDebug(bool Debug);
+};
+
+#endif // PLUGIN_LOADER_TEST_H
diff --git a/plugins/PluginLoader/catchcopy-v0002/pluginLoader.pro b/plugins/PluginLoader/catchcopy-v0002/pluginLoader.pro
new file mode 100644
index 0000000..40d5e5e
--- /dev/null
+++ b/plugins/PluginLoader/catchcopy-v0002/pluginLoader.pro
@@ -0,0 +1,53 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+QT += widgets
+TEMPLATE = lib
+CONFIG += plugin
+HEADERS = \
+ $$PWD/StructEnumDefinition.h \
+ $$PWD/pluginLoader.h \
+ $$PWD/DebugEngineMacro.h \
+ $$PWD/Environment.h \
+ $$PWD/Variable.h \
+ $$PWD/PlatformMacro.h \
+ $$PWD/../../../interface/PluginInterface_PluginLoader.h \
+ $$PWD/../../../cpp11addition.h \
+ $$PWD/OptionsWidget.h
+SOURCES = \
+ $$PWD/pluginLoader.cpp \
+ $$PWD/OptionsWidget.cpp \
+ $$PWD/../../../cpp11addition.cpp \
+ $$PWD/../../../cpp11additionstringtointcpp.cpp
+TARGET = $$qtLibraryTarget(pluginLoader)
+TRANSLATIONS += \
+ $$PWD/Languages/ar/translation.ts \
+ $$PWD/Languages/de/translation.ts \
+ $$PWD/Languages/el/translation.ts \
+ $$PWD/Languages/en/translation.ts \
+ $$PWD/Languages/es/translation.ts \
+ $$PWD/Languages/fr/translation.ts \
+ $$PWD/Languages/hi/translation.ts \
+ $$PWD/Languages/hu/translation.ts \
+ $$PWD/Languages/id/translation.ts \
+ $$PWD/Languages/it/translation.ts \
+ $$PWD/Languages/ja/translation.ts \
+ $$PWD/Languages/ko/translation.ts \
+ $$PWD/Languages/nl/translation.ts \
+ $$PWD/Languages/no/translation.ts \
+ $$PWD/Languages/pl/translation.ts \
+ $$PWD/Languages/pt/translation.ts \
+ $$PWD/Languages/ru/translation.ts \
+ $$PWD/Languages/th/translation.ts \
+ $$PWD/Languages/tr/translation.ts \
+ $$PWD/Languages/zh/translation.ts
+
+win32:LIBS += -lole32 -lshell32
+
+FORMS += \
+ $$PWD/OptionsWidget.ui
+
+CONFIG(static, static|shared) {
+DEFINES += ULTRACOPIER_PLUGIN_ALL_IN_ONE
+}
diff --git a/plugins/SessionLoader/Windows/DebugEngineMacro.h b/plugins/SessionLoader/Windows/DebugEngineMacro.h
new file mode 100644
index 0000000..4582010
--- /dev/null
+++ b/plugins/SessionLoader/Windows/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins/SessionLoader/Windows/Environment.h b/plugins/SessionLoader/Windows/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins/SessionLoader/Windows/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins/SessionLoader/Windows/StructEnumDefinition.h b/plugins/SessionLoader/Windows/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins/SessionLoader/Windows/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins/SessionLoader/Windows/Variable.h b/plugins/SessionLoader/Windows/Variable.h
new file mode 100644
index 0000000..963d0c8
--- /dev/null
+++ b/plugins/SessionLoader/Windows/Variable.h
@@ -0,0 +1,15 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins/SessionLoader/Windows/documentation.dox b/plugins/SessionLoader/Windows/documentation.dox
new file mode 100644
index 0000000..bfe77f3
--- /dev/null
+++ b/plugins/SessionLoader/Windows/documentation.dox
@@ -0,0 +1,32 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage Windows
+
+ \section mainpage_overview Overview
+
+ It control if it loaded with the session. Use HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run. \n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section mainpage_algorithm Method
+
+ It pass by the registry key to set/get it.
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.
+
+*/
diff --git a/plugins/SessionLoader/Windows/informations.xml b/plugins/SessionLoader/Windows/informations.xml
new file mode 100644
index 0000000..4bfbab1
--- /dev/null
+++ b/plugins/SessionLoader/Windows/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Session loader for windows]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Chargeur de session pour windows]]></title>
+ <!-- What kind of plugin this is -->
+ <category>SessionLoader</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[This plugin allow Ultracopier to be loaded at the session opening under windows]]></description>
+ <description xml:lang="fr"><![CDATA[Ce plugin permet de charger Ultracopier à l'ouverture de la sessions sous windows]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Windows</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins/SessionLoader/Windows/plugin.json b/plugins/SessionLoader/Windows/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins/SessionLoader/Windows/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins/SessionLoader/Windows/sessionLoader.cpp b/plugins/SessionLoader/Windows/sessionLoader.cpp
new file mode 100644
index 0000000..121bae0
--- /dev/null
+++ b/plugins/SessionLoader/Windows/sessionLoader.cpp
@@ -0,0 +1,80 @@
+/** \file session-loader.cpp
+\brief Define the session plugin loader test
+\author alpha_one_x86 */
+
+#include "sessionLoader.h"
+
+#include <QCoreApplication>
+
+#ifdef Q_OS_WIN32
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#else
+ #error "This plugin will only work under Windows"
+#endif
+
+void WindowsSessionLoader::setEnabled(const bool &newValue)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, newValue: "+std::to_string(newValue));
+ //set value into the variable
+ HKEY ultracopier_regkey;
+ //for autostart
+ QString runStringApp = "\"" + QCoreApplication::applicationFilePath() + "\"";
+ runStringApp.replace( "/", "\\" );
+ wchar_t windowsString[255];
+ runStringApp.toWCharArray(windowsString);
+ if(RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, 0, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, 0, &ultracopier_regkey, 0)==ERROR_SUCCESS)
+ {
+ if(newValue)
+ {
+ if(RegSetValueEx(ultracopier_regkey, TEXT("ultracopier"), 0, REG_SZ, (BYTE*)windowsString, runStringApp.length()*2)!=ERROR_SUCCESS)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"newValue: "+std::to_string(newValue)+" failed");
+ }
+ else
+ {
+ if(RegDeleteValue(ultracopier_regkey, TEXT("ultracopier"))!=ERROR_SUCCESS)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"newValue: "+std::to_string(newValue)+" failed");
+ }
+ RegCloseKey(ultracopier_regkey);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"RegCreateKeyEx: Software\\Microsoft\\Windows\\CurrentVersion\\Run failed");
+}
+
+bool WindowsSessionLoader::getEnabled() const
+{
+ //return the value into the variable
+ HKEY ultracopier_regkey;
+ bool temp=false;
+ if(RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, 0, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, 0, &ultracopier_regkey, 0)==ERROR_SUCCESS)
+ {
+ DWORD kSize=254;
+ if(RegQueryValueEx(ultracopier_regkey,TEXT("ultracopier"),NULL,NULL,(LPBYTE)0,&kSize) == ERROR_SUCCESS)
+ temp=true;
+ RegCloseKey(ultracopier_regkey);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"RegCreateKeyEx: Software\\Microsoft\\Windows\\CurrentVersion\\Run failed");
+ return temp;
+}
+
+void WindowsSessionLoader::setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,const bool &portableVersion)
+{
+ Q_UNUSED(options);
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ Q_UNUSED(portableVersion);
+}
+
+/// \brief to get the options widget, NULL if not have
+QWidget * WindowsSessionLoader::options()
+{
+ return NULL;
+}
+
+/// \brief to reload the translation, because the new language have been loaded
+void WindowsSessionLoader::newLanguageLoaded()
+{
+}
diff --git a/plugins/SessionLoader/Windows/sessionLoader.h b/plugins/SessionLoader/Windows/sessionLoader.h
new file mode 100644
index 0000000..b064e50
--- /dev/null
+++ b/plugins/SessionLoader/Windows/sessionLoader.h
@@ -0,0 +1,33 @@
+/** \file sessionLoader.h
+\brief Define the session loader
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef SESSION_LOADER_H
+#define SESSION_LOADER_H
+
+#include <QObject>
+#include "Environment.h"
+#include "../../../interface/PluginInterface_SessionLoader.h"
+
+/// \brief Define the session loader
+class WindowsSessionLoader : public PluginInterface_SessionLoader
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.SessionLoader/1.0.0.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_SessionLoader)
+public:
+ /// \brief to set if it's enabled or not
+ void setEnabled(const bool &newValue);
+ /// \brief to get if is enabled
+ bool getEnabled() const;
+ /// \brief set the resources for the plugins
+ void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,const bool &portableVersion);
+ /// \brief to get the options widget, NULL if not have
+ QWidget * options();
+public slots:
+ /// \brief to reload the translation, because the new language have been loaded
+ void newLanguageLoaded();
+};
+
+#endif // SESSION_LOADER_H
diff --git a/plugins/SessionLoader/Windows/sessionLoader.pro b/plugins/SessionLoader/Windows/sessionLoader.pro
new file mode 100644
index 0000000..1059692
--- /dev/null
+++ b/plugins/SessionLoader/Windows/sessionLoader.pro
@@ -0,0 +1,16 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+TEMPLATE = lib
+CONFIG += plugin
+LIBS += -ladvapi32
+HEADERS = \
+ $$PWD/sessionLoader.h \
+ $$PWD/StructEnumDefinition.h \
+ $$PWD/Variable.h \
+ $$PWD/Environment.h \
+ $$PWD/DebugEngineMacro.h \
+ $$PWD/../../../interface/PluginInterface_SessionLoader.h
+SOURCES = sessionLoader.cpp
+TARGET = $$qtLibraryTarget(sessionLoader)
diff --git a/plugins/Themes/Oxygen/DebugEngineMacro.h b/plugins/Themes/Oxygen/DebugEngineMacro.h
new file mode 100644
index 0000000..4582010
--- /dev/null
+++ b/plugins/Themes/Oxygen/DebugEngineMacro.h
@@ -0,0 +1,28 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+#ifdef WIN32
+# define __func__ __FUNCTION__
+#endif
+
+/// \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_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins/Themes/Oxygen/Environment.h b/plugins/Themes/Oxygen/Environment.h
new file mode 100644
index 0000000..265a5a6
--- /dev/null
+++ b/plugins/Themes/Oxygen/Environment.h
@@ -0,0 +1,10 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "DebugEngineMacro.h"
+
diff --git a/plugins/Themes/Oxygen/Languages/ar/translation.ts b/plugins/Themes/Oxygen/Languages/ar/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/ar/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/de/translation.ts b/plugins/Themes/Oxygen/Languages/de/translation.ts
new file mode 100644
index 0000000..8f51f95
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/de/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation>Kaufe die Ultimate Version um die Entwicklung zu finanzieren</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation>Datei %1/%2, Größe:%3/%4</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation>Zu kopierende Dateien</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation>Zu verschiebende Dateien</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>Nicht schließen, wenn Fehler aufgetreten sind</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation>Niemals schließen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation>Immer schließen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation>Dateiname, 0KB</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation>Farbe auswählen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>Nicht schließen, wenn Fehler aufgetreten sind</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation>Niemals schließen</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation>Immer schließen</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation>Wählen Sie eine Farbe</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation>Von:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation>Nach:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation>&amp;Mehr</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Pause</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation>Über&amp;springen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation>Abbrechen (&amp;C)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation>Dateiliste</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation>Ausgewählte Einträge löschen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation>Dateiliste exportieren</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation>Dateiliste importieren</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation>Vorherige</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation>Nächste</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation>Darstellungsoptionen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation>Ausgewählte Einträge an den Listenanfang verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation>Am Ende des Transfers schließen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation>Begrenze Kopiergeschwindigkeit auf:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation>Ausgewählte Einträge einen Platz nach oben verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation>Ausgewählte Einträge einen Platz nach unten verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation>Ausgewählte Einträge an das Listenende verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation>Datei/Ordner hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation>In Dateiliste suchen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation>Fehlerprotokoll</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation>Fehlgeschlagene Dateien exportieren</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation>Quelle</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation>Ziel</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation>Datei hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation>Ordner hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation>Datei(en) verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation>Ordner verschieben</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation>Datei(en) kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation>Verzeichnis kopieren</translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation>Zweifachen Fortschritt anzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation>Geschwindigkeitsbegrenzungsschieberegler anzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation>Benutzung</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation>Standardmäßig &quot;Mehr&quot; Informationen anzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation>Beim Schließen ins Systray minimieren</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation>Am Ende des Vorgangs</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation>Begrenze Übertragungsgeschwindigkeit auf</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation>Zum Bearbeiten der Farbe klicken</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation> KB/s</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation>Informationen</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation>Anzeige</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation>Geschwindigkeit als Fortschrittsbalken anzeigen</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation>Farbe des Fortschrittsbalken</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation>Fortschritt im Fenstertitel zeigen</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation>Fenster immer im Vordergrund</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/el/translation.ts b/plugins/Themes/Oxygen/Languages/el/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/el/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/en/translation.ts b/plugins/Themes/Oxygen/Languages/en/translation.ts
new file mode 100644
index 0000000..73e399d
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/en/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/es/translation.ts b/plugins/Themes/Oxygen/Languages/es/translation.ts
new file mode 100644
index 0000000..fff5a9c
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/es/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation>Comprar la versión Ultimate para financiar el desarrollo</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation>El archivo %1/%2, el tamaño: %3/%4</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation>Lista de copia</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation>Lista de movimiento</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>No cierre si se encuentran errores</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation>Nunca cierre</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation>Siempre cerrar</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation>Nombre de archivo, 0KB</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation>Seleccione un color</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>No cierre si se encuentran errores</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation>Nunca cierre</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation>Siempre cerrar</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation>Seleccione un color</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation>De:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation>Para:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation>&amp;Más</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Pausa</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation>Cerca de finalización de transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation>Limitar la velocidad de copia en:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation>Lista de transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation>Mueve los elementos seleccionados a la parte superior</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation>Mueva los elementos seleccionados</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation>Bajar los elementos seleccionados</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation>Mueve los elementos seleccionados a la parte inferior</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation>Agregar archivo/carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation>Eliminar los elementos seleccionados</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation>Buscar</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation>Exportar la lista de transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation>Importe la lista de transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation>Anterior</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation>Próximo</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation>Exportar los errores en la lista de transferencias</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation>Fuente</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation>Destino</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation>Interfaz</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation>Añadir archivo</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation>Añadir carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation>Mover archivo(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation>Mueva la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation>Copia el archivo(s)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation>Copia la carpeta</translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation>Mostrar progresión dual</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation>Mostrar la velocidad como principales informaciones</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation>Uso</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation>Comience con el &quot;botón más&quot; empujada</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation>Minimizar en cerca de la bandeja del sistema</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation>Al final de la copia</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation>Limitar la velocidad de copia de</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation>Haga clic para editar el color</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation> KB/s</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation>Informations</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation>Visualización</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation>Velocidad con barra de progreso</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation>Progresión de color</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation>Mostrar progresión en el título</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation>Siempre visible</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/fr/translation.ts b/plugins/Themes/Oxygen/Languages/fr/translation.ts
new file mode 100644
index 0000000..c3aa909
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/fr/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="+298"/>
+ <location line="+15"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-12"/>
+ <location line="+15"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation>Achetez la version Ultimate pour financer le développement</translation>
+ </message>
+ <message>
+ <location line="+85"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation>Fichier %1/%2, taille: %3/%4</translation>
+ </message>
+ <message>
+ <location line="+234"/>
+ <source>Copy list</source>
+ <translation>Liste de copies</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Move list</source>
+ <translation>Liste de déplacements</translation>
+ </message>
+ <message>
+ <location line="+421"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>Garder ouvert s&apos;il y a des erreurs</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Never close</source>
+ <translation>Ne jamais fermer</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Always close</source>
+ <translation>Toujours fermer</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>File Name, 0KB</source>
+ <translation>Nom de fichier, 0Ko</translation>
+ </message>
+ <message>
+ <location line="+187"/>
+ <location line="+12"/>
+ <location line="+12"/>
+ <source>Select a color</source>
+ <translation>Selectionner une coleur</translation>
+ </message>
+ <message>
+ <location line="+75"/>
+ <location line="+4"/>
+ <location line="+2"/>
+ <source>%1 %2% of %3</source>
+ <translation>%1 de %2% de %3</translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="+228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>Garder ouvert s&apos;il y a des erreurs</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Never close</source>
+ <translation>Ne jamais fermer</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Always close</source>
+ <translation>Toujours fermer</translation>
+ </message>
+ <message>
+ <location line="+196"/>
+ <location line="+15"/>
+ <location line="+15"/>
+ <source>Select a color</source>
+ <translation>Selectionner une coleur</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="+35"/>
+ <source>From:</source>
+ <translation>Depuis:</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>To:</source>
+ <translation>Vers:</translation>
+ </message>
+ <message>
+ <location line="+161"/>
+ <source>&amp;More</source>
+ <translation>Pl&amp;us</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Pause</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location line="-153"/>
+ <source>Close on transfer completion</source>
+ <translation>Fermer à la fin des transferts</translation>
+ </message>
+ <message>
+ <location line="+168"/>
+ <source>Limit copy speed to:</source>
+ <translation>Limiter la vitesse de copie à:</translation>
+ </message>
+ <message>
+ <location line="+43"/>
+ <source>Transfer list</source>
+ <translation>Liste de transferts</translation>
+ </message>
+ <message>
+ <location line="+23"/>
+ <source>Move the selected items to the top</source>
+ <translation>Déplacer l&apos;item selectionné au debut</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Move up the selected items</source>
+ <translation>Déplacer l&apos;item selectionné vers le haut</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Move down the selected items</source>
+ <translation>Déplacer l&apos;item selectionné vers le bas</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Move the selected items to the bottom</source>
+ <translation>Déplacer l&apos;item selectionné à la fin</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Add file/folder</source>
+ <translation>Ajouter fichier/dossier</translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>Delete the selected items</source>
+ <translation>Supprimer les items sélectionnés</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Search</source>
+ <translation>Rechercher</translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>Export the transfer list</source>
+ <translation>Exporter la liste de transfert</translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Import the transfer list</source>
+ <translation>Importer la liste de transfert</translation>
+ </message>
+ <message>
+ <location line="+55"/>
+ <source>Previous</source>
+ <translation>Précédent</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Next</source>
+ <translation>Suivant</translation>
+ </message>
+ <message>
+ <location line="+35"/>
+ <location line="+69"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location line="-49"/>
+ <source>Export the errors into transfer list</source>
+ <translation>Exporter les erreurs dans une liste de transfert</translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>Source</source>
+ <translation>Source</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Destination</source>
+ <translation>Destination</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>Interface</source>
+ <translation>Interface</translation>
+ </message>
+ <message>
+ <location line="+37"/>
+ <source>Add file</source>
+ <translation>Ajouter un fichier</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Add folder</source>
+ <translation>Ajouter un répertoire</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move file(s)</source>
+ <translation>Déplacer le(s) fichier(s)</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move folder</source>
+ <translation>Déplacer un répertoire</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy file(s)</source>
+ <translation>Copier le(s) fichier(s)</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy folder</source>
+ <translation>Copier un répertoire</translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="+253"/>
+ <source>Show dual progression</source>
+ <translation>Afficher une double progression</translation>
+ </message>
+ <message>
+ <location line="-48"/>
+ <source>Show speed as main information</source>
+ <translation>Afficher la vitesse comme information principale</translation>
+ </message>
+ <message>
+ <location line="-161"/>
+ <source>Use</source>
+ <translation>Utilisation</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation>Déplier automatiquement les détails</translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Minimize on close to systray</source>
+ <translation>Minimiser à la fermeture dans le systray</translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>At the end of the copy</source>
+ <translation>À la fin de la copie</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <location line="+34"/>
+ <source>Limit copy speed to</source>
+ <translation>Limiter la vitesse de copie à</translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+116"/>
+ <source>Click to edit the color</source>
+ <translation>Cliquer pour éditer la couleur</translation>
+ </message>
+ <message>
+ <location line="-145"/>
+ <source> KB/s</source>
+ <translation> Ko/s</translation>
+ </message>
+ <message>
+ <location line="+52"/>
+ <source>Informations</source>
+ <translation>Informations</translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Display</source>
+ <translation>Affichage</translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Speed with progress bar</source>
+ <translation>Vitesse avec barre de progression</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>Progression color</source>
+ <translation>Couleur de progression</translation>
+ </message>
+ <message>
+ <location line="-10"/>
+ <source>Show progression in the title</source>
+ <translation>Afficher la progression dans le titre</translation>
+ </message>
+ <message>
+ <location line="-203"/>
+ <source>Always on top</source>
+ <translation>Toujours au 1er plan</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/hi/translation.ts b/plugins/Themes/Oxygen/Languages/hi/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/hi/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/hu/translation.ts b/plugins/Themes/Oxygen/Languages/hu/translation.ts
new file mode 100644
index 0000000..409e6ea
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/hu/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="hu">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation>Vásárold meg az Ultimate verziót a fejlesztés támogatásához</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation>Fájl %1/%2, méret: %3/%4</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation>Lista másolása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation>Lista mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>Ne zárja be, ha hiba történik</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation>Sose zárja be</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation>Mindig zárja be</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation>Fájlnév, 0KB</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation>Válassz egy színt</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>Ne zárja be, ha hiba történik</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation>Sose zárja be</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation>Mindig zárja be</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation>Válassz egy színt</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation>Forrás:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation>Cél:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation>&amp;Több</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Szünet</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Kihagy</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Mégse</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation>Átviteli lista</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation>Előző</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation>Következő</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation>Kezelőfelület</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation>Kijelölések elemek mozgatása legfelülre</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation>Átvitel végeztével zárja be</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation>Másolási sebesség korlátozása:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation>Kijelölt elemek mozgatása fel</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation>Kijelölt elemek mozgatása le</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation>Kijelölések elemek mozgatása legalulra</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation>Fájl/mappa hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation>Kijelölt elemek törlése</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation>Keresés</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation>Átviteli lista exportálása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation>Átviteli lista importálása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation>Hiba</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation>Hibák exportálása az átviteli listába</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation>Forrás</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation>Cél</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation>Fájl hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation>Mappa hozzáadása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation>Fájl(ok) mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation>Mappa mozgatása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation>Fájl(ok) másolása</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation>Mappa másolása</translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation>Páros folyamat mutatása</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation>Sebesség mutatása, mint fő információ</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation>Használ</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation>Indítás a &quot;több gomb&quot; lenyomásával</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation>Bezáráskor minimalizálás a tálcára</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation>A másolás befejezésekor</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation>Másolási sebesség korlátozása</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation>Kattints a szín szerkesztéséhez</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation> KB/s</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation>Információk</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation>Megjelenítés</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation>Sebesség folyamatsávval</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation>Folyamat színe</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation>Folyamat mutatása a címsorban</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation>Mindig legfelül</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/id/translation.ts b/plugins/Themes/Oxygen/Languages/id/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/id/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/it/translation.ts b/plugins/Themes/Oxygen/Languages/it/translation.ts
new file mode 100644
index 0000000..c813017
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/it/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="it" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation>Acquista la versione Ultimate per finanziare lo sviluppo del programma</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation>File %1/%2, dimensione: %3/%4</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation>Lista della copia</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation>Lista dello spostamento</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>Non chiudere se vengono rilevati errori</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation>Non chiudere mai</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation>Chiudere sempre</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation>Nome del file, 0KB</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation>Scegliere un colore</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation>%1 %2% di %3</translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation>Non chiudere se vengono rilevati errori</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation>Non chiudere mai</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation>Chiudere sempre</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation>Scegliere un colore</translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation>Da:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation>a:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation>Altr&amp;o</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Pausa</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Salta</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annulla</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation>Arresta il sistema a trasferimento comletato</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation>Limitare la velocità di copia a:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation>Lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation>Sposta in cima gli elementi selezionati</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation>Sposta sopra gli elementi selezionati</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation>Sposta sotto gli elementi selezionati</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation>Sposta in coda gli elementi selezionati</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation>Aggiungi file/cartelle</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation>Elimina gli elementi selezionati</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation>Cerca</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation>Esporta la lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation>Importa la lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation>Precedente</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation>Successivo</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation>Errore</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation>Esporta gli errori nella lista dei trasferimenti</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation>Cartella di origine</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation>Cartella di destinazione</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation>Interfaccia</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation>Aggiungi file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation>Aggiungi cartella</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation>Sposta file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation>Sposta la cartella</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation>Copia file</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation>Copia la cartella</translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation>Mostrare la doppia progressione</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation>Mostrare la velocità come principale informazione</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation>Utilità</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation>Iniziare col pulsante &quot;Altro&quot; attivo</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation>Alla chiusura riduci nella&apos;area di notifica</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation>Al termine della copia</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation>Limitare la velocità di copia a</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation>Clicca per modificare il colore</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation> KB/s</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation>Informazioni</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation>Visualizza</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation>Velocità nella barra di progresso</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation>Colore della progressione</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation>Mostrare la percentuale di progresso sul titolo</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation>Sempre in primo piano</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/ja/translation.ts b/plugins/Themes/Oxygen/Languages/ja/translation.ts
new file mode 100644
index 0000000..2099b73
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/ja/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/ko/translation.ts b/plugins/Themes/Oxygen/Languages/ko/translation.ts
new file mode 100644
index 0000000..c446d72
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/ko/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ko_KR">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="+298"/>
+ <location line="+15"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-12"/>
+ <location line="+15"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+85"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished">파일 %1/%2, 크기: %3/%4</translation>
+ </message>
+ <message>
+ <location line="+234"/>
+ <source>Copy list</source>
+ <translation type="unfinished">복사 목록</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+421"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished">오류 발견시 종료 안함</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Never close</source>
+ <translation type="unfinished">절대 종료 안함</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Always close</source>
+ <translation type="unfinished">항상 종료</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished">파일명, 0KB</translation>
+ </message>
+ <message>
+ <location line="+187"/>
+ <location line="+12"/>
+ <location line="+12"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+75"/>
+ <location line="+4"/>
+ <location line="+2"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="+228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished">오류 발견시 종료 안함</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Never close</source>
+ <translation type="unfinished">절대 종료 안함</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Always close</source>
+ <translation type="unfinished">항상 종료</translation>
+ </message>
+ <message>
+ <location line="+196"/>
+ <location line="+15"/>
+ <location line="+15"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="+35"/>
+ <source>From:</source>
+ <translation type="unfinished">원본:</translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>To:</source>
+ <translation type="unfinished">대상:</translation>
+ </message>
+ <message>
+ <location line="+161"/>
+ <source>&amp;More</source>
+ <translation type="unfinished">&amp;자세히</translation>
+ </message>
+ <message>
+ <location line="+20"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished">&amp;일시 정지</translation>
+ </message>
+ <message>
+ <location line="+14"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished">&amp;건너뛰기</translation>
+ </message>
+ <message>
+ <location line="+11"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;취소</translation>
+ </message>
+ <message>
+ <location line="+58"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+156"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+55"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+55"/>
+ <source>Previous</source>
+ <translation type="unfinished">이전</translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <source>Next</source>
+ <translation type="unfinished">다음</translation>
+ </message>
+ <message>
+ <location line="+113"/>
+ <source>Interface</source>
+ <translation type="unfinished">인터페이스</translation>
+ </message>
+ <message>
+ <location line="-389"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-234"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+168"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+92"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+26"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+55"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+152"/>
+ <location line="+69"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-49"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+51"/>
+ <source>Add file</source>
+ <translation type="unfinished">파일 추가</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Add folder</source>
+ <translation type="unfinished">폴더 추가</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished">파일 이동</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Move folder</source>
+ <translation type="unfinished">폴더 이동</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished">파일 복사</translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Copy folder</source>
+ <translation type="unfinished">폴더 복사</translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="+253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-48"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished">메인 정보에 속도 표시</translation>
+ </message>
+ <message>
+ <location line="-161"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+17"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+29"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
+ <location line="+34"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+39"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+116"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-145"/>
+ <source> KB/s</source>
+ <translation type="unfinished"> KB/초</translation>
+ </message>
+ <message>
+ <location line="+52"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+38"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+30"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-10"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-203"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/nl/translation.ts b/plugins/Themes/Oxygen/Languages/nl/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/nl/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/no/translation.ts b/plugins/Themes/Oxygen/Languages/no/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/no/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/pl/translation.ts b/plugins/Themes/Oxygen/Languages/pl/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/pl/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/pt/translation.ts b/plugins/Themes/Oxygen/Languages/pt/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/pt/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/ru/translation.ts b/plugins/Themes/Oxygen/Languages/ru/translation.ts
new file mode 100644
index 0000000..1ef7093
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/ru/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="ru" sourcelanguage="en">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation>Файл %1/%2, размер: %3/%4</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished">Копировать список</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished">Не закрывать, если найдены ошибки</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished">Никогда не закрывать</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished">Всегда закрывайте</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation>Имя файла, 0KB</translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished">Не закрывать, если найдены ошибки</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished">Никогда не закрывать</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished">Всегда закрывайте</translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation>С:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation>к:</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation>больше</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation>пауза</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation>пропускать</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation>отменить</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation>предыдущий</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation>следующий</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation>интерфейс</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation>Добавить файл</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation>Добавить папку</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation>Перемещение файла(ов)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation>Перемещение папки</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation>Копировать файл (ы)</translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation>Копировать папку</translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished">Показать скорости в качестве основной информации</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"> Кб/с</translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/th/translation.ts b/plugins/Themes/Oxygen/Languages/th/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/th/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/tr/translation.ts b/plugins/Themes/Oxygen/Languages/tr/translation.ts
new file mode 100644
index 0000000..c7b2fdd
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/tr/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/Languages/zh/translation.ts b/plugins/Themes/Oxygen/Languages/zh/translation.ts
new file mode 100644
index 0000000..2099b73
--- /dev/null
+++ b/plugins/Themes/Oxygen/Languages/zh/translation.ts
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>Themes</name>
+ <message>
+ <location filename="../../interface.cpp" line="298"/>
+ <location filename="../../interface.cpp" line="313"/>
+ <source>%1 is deprecated, Use %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="301"/>
+ <location filename="../../interface.cpp" line="316"/>
+ <source>This will be the last version for Mac, but you can compile from source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="318"/>
+ <source>Buy the Ultimate version to fund development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="403"/>
+ <source>File %1/%2, size: %3/%4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="637"/>
+ <source>Copy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="639"/>
+ <source>Move list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1060"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1061"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1062"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1064"/>
+ <source>File Name, 0KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1251"/>
+ <location filename="../../interface.cpp" line="1263"/>
+ <location filename="../../interface.cpp" line="1275"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.cpp" line="1350"/>
+ <location filename="../../interface.cpp" line="1354"/>
+ <location filename="../../interface.cpp" line="1356"/>
+ <source>%1 %2% of %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ThemesFactory</name>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="228"/>
+ <source>Don&apos;t close if errors are found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="229"/>
+ <source>Never close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="230"/>
+ <source>Always close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ThemesFactory.cpp" line="426"/>
+ <location filename="../../ThemesFactory.cpp" line="441"/>
+ <location filename="../../ThemesFactory.cpp" line="456"/>
+ <source>Select a color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>interfaceCopy</name>
+ <message>
+ <location filename="../../interface.ui" line="35"/>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="65"/>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="226"/>
+ <source>&amp;More</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="246"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="260"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="271"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="329"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="485"/>
+ <source>Delete the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="540"/>
+ <source>Export the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="566"/>
+ <source>Import the transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="621"/>
+ <source>Previous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="628"/>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="741"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="352"/>
+ <source>Move the selected items to the top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="118"/>
+ <source>Close on transfer completion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="286"/>
+ <source>Limit copy speed to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="378"/>
+ <source>Move up the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="404"/>
+ <source>Move down the selected items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="430"/>
+ <source>Move the selected items to the bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="456"/>
+ <source>Add file/folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="511"/>
+ <source>Search</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="663"/>
+ <location filename="../../interface.ui" line="732"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="683"/>
+ <source>Export the errors into transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="722"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="727"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="778"/>
+ <source>Add file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="787"/>
+ <source>Add folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="796"/>
+ <source>Move file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="805"/>
+ <source>Move folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="814"/>
+ <source>Copy file(s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../interface.ui" line="823"/>
+ <source>Copy folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>themesOptions</name>
+ <message>
+ <location filename="../../themesOptions.ui" line="253"/>
+ <source>Show dual progression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="205"/>
+ <source>Show speed as main information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="44"/>
+ <source>Use</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="50"/>
+ <source>Start with the &quot;more button&quot; pushed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="67"/>
+ <source>Minimize on close to systray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="96"/>
+ <source>At the end of the copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="103"/>
+ <location filename="../../themesOptions.ui" line="137"/>
+ <source>Limit copy speed to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="147"/>
+ <source> KB/s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="176"/>
+ <source>Start minimized</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="199"/>
+ <source>Informations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="237"/>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="243"/>
+ <source>Speed with progress bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="273"/>
+ <source>Progression color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="292"/>
+ <source>Click to edit the color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="263"/>
+ <source>Show progression in the title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../themesOptions.ui" line="60"/>
+ <source>Always on top</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/Themes/Oxygen/StructEnumDefinition.h b/plugins/Themes/Oxygen/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins/Themes/Oxygen/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins/Themes/Oxygen/ThemesFactory.cpp b/plugins/Themes/Oxygen/ThemesFactory.cpp
new file mode 100644
index 0000000..28961f0
--- /dev/null
+++ b/plugins/Themes/Oxygen/ThemesFactory.cpp
@@ -0,0 +1,481 @@
+/** \file factory.cpp
+\brief Define the factory core
+\author alpha_one_x86 */
+
+#include <QColorDialog>
+
+#include "ThemesFactory.h"
+#include "../../../cpp11addition.h"
+
+ThemesFactory::ThemesFactory()
+{
+ optionsEngine=NULL;
+ tempWidget=new QWidget();
+ ui=new Ui::themesOptions();
+ ui->setupUi(tempWidget);
+ ui->toolBox->setCurrentIndex(0);
+ currentSpeed = 0;
+ updateSpeed();
+
+ qRegisterMetaType<QList<QPersistentModelIndex> >("QList<QPersistentModelIndex>");
+}
+
+ThemesFactory::~ThemesFactory()
+{
+}
+
+PluginInterface_Themes * ThemesFactory::getInstance()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, currentSpeed: "+std::to_string(currentSpeed));
+
+ Themes * newInterface=new Themes(
+ ui->alwaysOnTop->isChecked(),
+ ui->showProgressionInTheTitle->isChecked(),
+ progressColorWrite,progressColorRead,progressColorRemaining,
+ ui->showDualProgression->isChecked(),
+ ui->comboBox_copyEnd->currentIndex(),
+ ui->speedWithProgressBar->isChecked(),
+ currentSpeed,
+ ui->checkBoxShowSpeed->isChecked(),
+ facilityEngine,
+ ui->checkBoxStartWithMoreButtonPushed->isChecked(),
+ ui->minimizeToSystray->isChecked(),
+ ui->startMinimized->isChecked()
+ );
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(newInterface,&Themes::debugInformation,this,&PluginInterface_ThemesFactory::debugInformation);
+ #endif
+ connect(this,&ThemesFactory::reloadLanguage,newInterface,&Themes::newLanguageLoaded);
+ return newInterface;
+}
+
+void ThemesFactory::setResources(OptionInterface * optionsEngine,const std::string &
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ writePath
+ #endif
+ ,const std::string &
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ pluginPath
+ #endif
+ ,FacilityInterface * facilityEngine,const bool &
+ )
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, writePath: "+writePath+", pluginPath: "+pluginPath);
+ this->facilityEngine=facilityEngine;
+ if(optionsEngine!=NULL)
+ {
+ this->optionsEngine=optionsEngine;
+ //load the options
+ std::vector<std::pair<std::string, std::string> > KeysList;
+ KeysList.push_back(std::pair<std::string, std::string>("checkBoxShowSpeed","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("moreButtonPushed","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("speedWithProgressBar","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("currentSpeed","0"));
+ KeysList.push_back(std::pair<std::string, std::string>("comboBox_copyEnd","0"));
+ KeysList.push_back(std::pair<std::string, std::string>("showDualProgression","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("showProgressionInTheTitle","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("progressColorWrite",QApplication::palette().color(QPalette::Highlight).name().toStdString()));
+ KeysList.push_back(std::pair<std::string, std::string>("progressColorRead",QApplication::palette().color(QPalette::AlternateBase).name().toStdString()));
+ KeysList.push_back(std::pair<std::string, std::string>("progressColorRemaining",QApplication::palette().color(QPalette::Base).name().toStdString()));
+ KeysList.push_back(std::pair<std::string, std::string>("alwaysOnTop","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("minimizeToSystray","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("startMinimized","false"));
+ optionsEngine->addOptionGroup(KeysList);
+ connect(optionsEngine,&OptionInterface::resetOptions,this,&ThemesFactory::resetOptions);
+ updateSpeed();
+ }
+ #ifndef __GNUC__
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"__GNUC__ is not set");
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"__GNUC__ is set");
+ #endif
+}
+
+QWidget * ThemesFactory::options()
+{
+ if(optionsEngine!=NULL)
+ {
+ bool ok;
+ currentSpeed=stringtouint32(optionsEngine->getOptionValue("currentSpeed"),&ok);
+ if(!ok)
+ currentSpeed=0;
+ ui->comboBox_copyEnd->setCurrentIndex(stringtouint32(optionsEngine->getOptionValue("comboBox_copyEnd")));
+ ui->speedWithProgressBar->setChecked(stringtobool(optionsEngine->getOptionValue("speedWithProgressBar")));
+ ui->checkBoxShowSpeed->setChecked(stringtobool(optionsEngine->getOptionValue("checkBoxShowSpeed")));
+ ui->checkBoxStartWithMoreButtonPushed->setChecked(stringtobool(optionsEngine->getOptionValue("moreButtonPushed")));
+ ui->showDualProgression->setChecked(stringtobool(optionsEngine->getOptionValue("showDualProgression")));
+ ui->showProgressionInTheTitle->setChecked(stringtobool(optionsEngine->getOptionValue("showProgressionInTheTitle")));
+ ui->alwaysOnTop->setChecked(stringtobool(optionsEngine->getOptionValue("alwaysOnTop")));
+ ui->minimizeToSystray->setChecked(stringtobool(optionsEngine->getOptionValue("minimizeToSystray")));
+ ui->startMinimized->setChecked(stringtobool(optionsEngine->getOptionValue("startMinimized")));
+
+ progressColorWrite=QVariant(QString::fromStdString(optionsEngine->getOptionValue("progressColorWrite"))).value<QColor>();
+ progressColorRead=QVariant(QString::fromStdString(optionsEngine->getOptionValue("progressColorRead"))).value<QColor>();
+ progressColorRemaining=QVariant(QString::fromStdString(optionsEngine->getOptionValue("progressColorRemaining"))).value<QColor>();
+
+ QPixmap pixmap(75,20);
+ pixmap.fill(progressColorWrite);
+ ui->progressColorWrite->setIcon(pixmap);
+ pixmap.fill(progressColorRead);
+ ui->progressColorRead->setIcon(pixmap);
+ pixmap.fill(progressColorRemaining);
+ ui->progressColorRemaining->setIcon(pixmap);
+ updateSpeed();
+ updateProgressionColorBar();
+
+ connect(ui->alwaysOnTop,&QCheckBox::stateChanged,this,&ThemesFactory::alwaysOnTop);
+ connect(ui->checkBoxShowSpeed,&QCheckBox::stateChanged,this,&ThemesFactory::checkBoxShowSpeed);
+ connect(ui->minimizeToSystray,&QCheckBox::stateChanged,this,&ThemesFactory::minimizeToSystray);
+ connect(ui->checkBox_limitSpeed,&QCheckBox::stateChanged,this,&ThemesFactory::uiUpdateSpeed);
+ connect(ui->SliderSpeed,&QAbstractSlider::valueChanged,this,&ThemesFactory::on_SliderSpeed_valueChanged);
+ connect(ui->limitSpeed,static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &ThemesFactory::uiUpdateSpeed);
+ connect(ui->checkBoxShowSpeed,&QAbstractButton::toggled,this,&ThemesFactory::checkBoxShowSpeedHaveChanged);
+ connect(ui->checkBoxStartWithMoreButtonPushed,&QAbstractButton::toggled,this,&ThemesFactory::checkBoxStartWithMoreButtonPushedHaveChanged);
+ connect(ui->speedWithProgressBar,&QAbstractButton::toggled,this,&ThemesFactory::speedWithProgressBar);
+ connect(ui->comboBox_copyEnd, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&ThemesFactory::comboBox_copyEnd);
+ connect(ui->showDualProgression,&QCheckBox::stateChanged,this,&ThemesFactory::showDualProgression);
+ connect(ui->showDualProgression,&QCheckBox::stateChanged,this,&ThemesFactory::updateProgressionColorBar);
+ connect(ui->showProgressionInTheTitle,&QCheckBox::stateChanged,this,&ThemesFactory::setShowProgressionInTheTitle);
+ connect(ui->progressColorWrite,&QAbstractButton::clicked,this,&ThemesFactory::progressColorWrite_clicked);
+ connect(ui->progressColorRead, &QAbstractButton::clicked,this,&ThemesFactory::progressColorRead_clicked);
+ connect(ui->progressColorRemaining,&QAbstractButton::clicked,this,&ThemesFactory::progressColorRemaining_clicked);
+ connect(ui->startMinimized,&QCheckBox::stateChanged,this,&ThemesFactory::startMinimized);
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"return the options");
+ return tempWidget;
+}
+
+QIcon ThemesFactory::getIcon(const std::string &fileName) const
+{
+ if(fileName=="SystemTrayIcon/exit.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("application-exit");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ else if(fileName=="SystemTrayIcon/add.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("list-add");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ else if(fileName=="SystemTrayIcon/informations.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("help-about");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ else if(fileName=="SystemTrayIcon/options.png")
+ {
+ QIcon tempIcon=QIcon::fromTheme("applications-system");
+ if(!tempIcon.isNull())
+ return tempIcon;
+ }
+ #ifdef SUPERCOPIER
+ return QIcon(":/Themes/Supercopier/resources/"+QString::fromStdString(fileName));
+ #else
+ return QIcon(":/Themes/Oxygen/resources/"+QString::fromStdString(fileName));
+ #endif
+}
+
+void ThemesFactory::resetOptions()
+{
+ ui->checkBoxShowSpeed->setChecked(true);
+ ui->checkBoxStartWithMoreButtonPushed->setChecked(false);
+}
+
+void ThemesFactory::checkBoxShowSpeedHaveChanged(bool toggled)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("checkBoxShowSpeed",std::to_string(toggled));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::checkBoxStartWithMoreButtonPushedHaveChanged(bool toggled)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("moreButtonPushed",std::to_string(toggled));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::comboBox_copyEnd(int value)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("comboBox_copyEnd",std::to_string(value));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::speedWithProgressBar(bool toggled)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("speedWithProgressBar",std::to_string(toggled));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::newLanguageLoaded()
+{
+ ui->retranslateUi(tempWidget);
+ ui->comboBox_copyEnd->setItemText(0,tr("Don't close if errors are found"));
+ ui->comboBox_copyEnd->setItemText(1,tr("Never close"));
+ ui->comboBox_copyEnd->setItemText(2,tr("Always close"));
+ emit reloadLanguage();
+}
+
+void ThemesFactory::checkBoxShowSpeed(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ Q_UNUSED(checked);
+ updateSpeed();
+}
+
+void ThemesFactory::minimizeToSystray(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("minimizeToSystray",std::to_string(checked));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::alwaysOnTop(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("alwaysOnTop",std::to_string(checked));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::showDualProgression(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("showDualProgression",std::to_string(checked));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::startMinimized(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("startMinimized",std::to_string(checked));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::on_SliderSpeed_valueChanged(int value)
+{
+ if(optionsEngine==NULL)
+ return;
+ if(!ui->checkBoxShowSpeed->isChecked())
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"value: "+std::to_string(value));
+ switch(value)
+ {
+ case 0:
+ currentSpeed=0;
+ break;
+ case 1:
+ currentSpeed=1024;
+ break;
+ case 2:
+ currentSpeed=1024*4;
+ break;
+ case 3:
+ currentSpeed=1024*16;
+ break;
+ case 4:
+ currentSpeed=1024*64;
+ break;
+ case 5:
+ currentSpeed=1024*128;
+ break;
+ }
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("currentSpeed",std::to_string(currentSpeed));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+ updateSpeed();
+}
+
+void ThemesFactory::uiUpdateSpeed()
+{
+ if(optionsEngine==NULL)
+ return;
+ if(ui->checkBoxShowSpeed->isChecked())
+ return;
+ if(!ui->checkBox_limitSpeed->isChecked())
+ currentSpeed=0;
+ else
+ currentSpeed=ui->limitSpeed->value();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit newSpeedLimitation: "+std::to_string(currentSpeed));
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("currentSpeed",std::to_string(currentSpeed));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::updateSpeed()
+{
+ if(optionsEngine==NULL)
+ return;
+ ui->label_Slider_speed->setVisible(ui->checkBoxShowSpeed->isChecked());
+ ui->SliderSpeed->setVisible(ui->checkBoxShowSpeed->isChecked());
+ ui->label_SpeedMaxValue->setVisible(ui->checkBoxShowSpeed->isChecked());
+ ui->limitSpeed->setVisible(!ui->checkBoxShowSpeed->isChecked());
+ ui->checkBox_limitSpeed->setVisible(!ui->checkBoxShowSpeed->isChecked());
+
+ if(ui->checkBoxShowSpeed->isChecked())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"checked, currentSpeed: "+std::to_string(currentSpeed));
+ ui->limitSpeed->setEnabled(false);
+ if(currentSpeed==0)
+ {
+ ui->SliderSpeed->setValue(0);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->translateText("Unlimited")));
+ }
+ else if(currentSpeed<=1024)
+ {
+ if(currentSpeed!=1024)
+ {
+ currentSpeed=1024;
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("currentSpeed",std::to_string(currentSpeed));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+ }
+ ui->SliderSpeed->setValue(1);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*1)));
+ }
+ else if(currentSpeed<=1024*4)
+ {
+ if(currentSpeed!=1024*4)
+ {
+ currentSpeed=1024*4;
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("currentSpeed",std::to_string(currentSpeed));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+ }
+ ui->SliderSpeed->setValue(2);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*4)));
+ }
+ else if(currentSpeed<=1024*16)
+ {
+ if(currentSpeed!=1024*16)
+ {
+ currentSpeed=1024*16;
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("currentSpeed",std::to_string(currentSpeed));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+ }
+ ui->SliderSpeed->setValue(3);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*16)));
+ }
+ else if(currentSpeed<=1024*64)
+ {
+ if(currentSpeed!=1024*64)
+ {
+ currentSpeed=1024*64;
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("currentSpeed",std::to_string(currentSpeed));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+ }
+ ui->SliderSpeed->setValue(4);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*64)));
+ }
+ else
+ {
+ if(currentSpeed!=1024*128)
+ {
+ currentSpeed=1024*128;
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("currentSpeed",std::to_string(currentSpeed));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+ }
+ ui->SliderSpeed->setValue(5);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*128)));
+ }
+ }
+ else
+ {
+ ui->checkBox_limitSpeed->setChecked(currentSpeed>0);
+ if(currentSpeed>0)
+ ui->limitSpeed->setValue(currentSpeed);
+ ui->checkBox_limitSpeed->setEnabled(currentSpeed!=-1);
+ ui->limitSpeed->setEnabled(ui->checkBox_limitSpeed->isChecked());
+ }
+}
+
+void ThemesFactory::progressColorWrite_clicked()
+{
+ QColor color=QColorDialog::getColor(progressColorWrite,NULL,tr("Select a color"));
+ if(!color.isValid())
+ return;
+ progressColorWrite=color;
+ QPixmap pixmap(75,20);
+ pixmap.fill(progressColorWrite);
+ ui->progressColorWrite->setIcon(pixmap);
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("progressColorWrite",progressColorWrite.name().toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::progressColorRead_clicked()
+{
+ QColor color=QColorDialog::getColor(progressColorRead,NULL,tr("Select a color"));
+ if(!color.isValid())
+ return;
+ progressColorRead=color;
+ QPixmap pixmap(75,20);
+ pixmap.fill(progressColorRead);
+ ui->progressColorRead->setIcon(pixmap);
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("progressColorRead",progressColorRead.name().toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::progressColorRemaining_clicked()
+{
+ QColor color=QColorDialog::getColor(progressColorRemaining,NULL,tr("Select a color"));
+ if(!color.isValid())
+ return;
+ progressColorRemaining=color;
+ QPixmap pixmap(75,20);
+ pixmap.fill(progressColorRemaining);
+ ui->progressColorRemaining->setIcon(pixmap);
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("progressColorRemaining",progressColorRemaining.name().toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void ThemesFactory::updateProgressionColorBar()
+{
+ ui->labelProgressionColor->setVisible(ui->showDualProgression->isChecked());
+ ui->frameProgressionColor->setVisible(ui->showDualProgression->isChecked());
+}
+
+void ThemesFactory::setShowProgressionInTheTitle()
+{
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("showProgressionInTheTitle",std::to_string(ui->showProgressionInTheTitle->isChecked()));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"internal error, crash prevented");
+}
diff --git a/plugins/Themes/Oxygen/ThemesFactory.h b/plugins/Themes/Oxygen/ThemesFactory.h
new file mode 100644
index 0000000..f5e304f
--- /dev/null
+++ b/plugins/Themes/Oxygen/ThemesFactory.h
@@ -0,0 +1,86 @@
+/** \file factory.h
+\brief Define the factory, to create instance of the interface
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef FACTORY_H
+#define FACTORY_H
+
+#include <QObject>
+#include <QWidget>
+#include <QMenu>
+#include <QCloseEvent>
+#include <QFile>
+#include <QIcon>
+#include <QColor>
+#include <QPixmap>
+
+#include "../../../interface/PluginInterface_Themes.h"
+#include "ui_themesOptions.h"
+#include "interface.h"
+#include "Environment.h"
+
+namespace Ui {
+ class themesOptions;
+}
+
+/// \brief Define the factory, to create instance of the interface
+class ThemesFactory : public PluginInterface_ThemesFactory
+{
+ Q_OBJECT
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.ThemesFactory/1.0.1.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_ThemesFactory)
+ #endif
+public:
+ ThemesFactory();
+ ~ThemesFactory();
+ /// \brief to return the instance of the copy engine
+ PluginInterface_Themes * getInstance();
+ /// \brief set the resources, to store options, to have facilityInterface
+ void setResources(OptionInterface * optionsEngine,const std::string &
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ writePath
+ #endif
+ ,const std::string &
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ pluginPath
+ #endif
+ ,FacilityInterface * facilityEngine,const bool &portableVersion);
+ /// \brief to get the default options widget
+ QWidget * options();
+ /// \brief to get a resource icon
+ QIcon getIcon(const std::string &fileName) const;
+private slots:
+ void checkBoxShowSpeedHaveChanged(bool toggled);
+ void checkBoxStartWithMoreButtonPushedHaveChanged(bool toggled);
+ void comboBox_copyEnd(int value);
+ void speedWithProgressBar(bool toggled);
+ void checkBoxShowSpeed(bool checked);
+ void minimizeToSystray(bool checked);
+ void alwaysOnTop(bool checked);
+ void showDualProgression(bool checked);
+ void on_SliderSpeed_valueChanged(int value);
+ void uiUpdateSpeed();
+ void updateSpeed();
+ void progressColorWrite_clicked();
+ void progressColorRead_clicked();
+ void progressColorRemaining_clicked();
+ void updateProgressionColorBar();
+ void setShowProgressionInTheTitle();
+ void startMinimized(bool checked);
+public slots:
+ void resetOptions();
+ void newLanguageLoaded();
+private:
+ OptionInterface * optionsEngine;
+ Ui::themesOptions *ui;
+ QWidget *tempWidget;
+ FacilityInterface * facilityEngine;
+ int32_t currentSpeed;///< in KB/s, assume as 0KB/s as default like every where
+ QColor progressColorWrite,progressColorRead,progressColorRemaining;
+signals:
+ void reloadLanguage() const;
+};
+
+#endif // FACTORY_H
diff --git a/plugins/Themes/Oxygen/TransferModel.cpp b/plugins/Themes/Oxygen/TransferModel.cpp
new file mode 100644
index 0000000..2959598
--- /dev/null
+++ b/plugins/Themes/Oxygen/TransferModel.cpp
@@ -0,0 +1,588 @@
+#include "TransferModel.h"
+#include "../../../cpp11addition.h"
+
+#define COLUMN_COUNT 3
+
+// Model
+
+QIcon *TransferModel::start=NULL;
+QIcon *TransferModel::stop=NULL;
+
+TransferModel::TransferModel()
+{
+ /// \warning to prevent Must construct a QGuiApplication before QPixmap IN STATIC WINDOWS VERSION ONLY
+ if(TransferModel::start==NULL)
+ TransferModel::start=new QIcon(QStringLiteral(":/resources/player_play.png"));
+ if(TransferModel::stop==NULL)
+ TransferModel::stop=new QIcon(QStringLiteral(":/resources/player_pause.png"));
+ currentIndexSearch=0;
+ haveSearchItem=false;
+ loop_size=0,index_for_loop=0;
+ sub_loop_size=0,sub_index_for_loop=0;
+ row=0,column=0;
+ facilityEngine=NULL;
+ currentIndexSearch=0;
+ haveSearchItem=false;
+ searchId=0;
+}
+
+int TransferModel::columnCount( const QModelIndex& parent ) const
+{
+ return parent == QModelIndex() ? COLUMN_COUNT : 0;
+}
+
+QVariant TransferModel::data( const QModelIndex& index, int role ) const
+{
+ int row,column;
+ row=index.row();
+ column=index.column();
+ if(index.parent()!=QModelIndex() || row < 0 || (unsigned int)row >= transfertItemList.size() || column < 0 || column >= COLUMN_COUNT)
+ return QVariant();
+
+ const TransfertItem& item = transfertItemList.at(row);
+ if(role==Qt::UserRole)
+ return (quint64)item.id;
+ else if(role==Qt::DisplayRole)
+ {
+ switch(column)
+ {
+ case 0:
+ return QString::fromStdString(item.source);
+ break;
+ case 1:
+ return QString::fromStdString(item.size);
+ break;
+ case 2:
+ return QString::fromStdString(item.destination);
+ break;
+ default:
+ return QVariant();
+ }
+ }
+ else if(role==Qt::DecorationRole)
+ {
+ switch(column)
+ {
+ case 0:
+ if(stopId.find(item.id)!=stopId.cend())
+ return *stop;
+ else if(startId.find(item.id)!=startId.cend())
+ return *start;
+ else
+ return QVariant();
+ break;
+ default:
+ return QVariant();
+ }
+ }
+ else if(role==Qt::BackgroundRole)
+ {
+ if(!search_text.empty() && (item.source.find(search_text)!=std::string::npos ||
+ item.destination.find(search_text)!=std::string::npos))
+ {
+ if(haveSearchItem && searchId==item.id)
+ return QColor(255,150,150,100);
+ else
+ return QColor(255,255,0,100);
+ }
+ else
+ return QVariant();
+ }
+ return QVariant();
+}
+
+int TransferModel::rowCount( const QModelIndex& parent ) const
+{
+ return parent == QModelIndex() ? transfertItemList.size() : 0;
+}
+
+uint64_t TransferModel::firstId() const
+{
+ if(transfertItemList.size()>0)
+ return transfertItemList.front().id;
+ else
+ return 0;
+}
+
+QVariant TransferModel::headerData( int section, Qt::Orientation orientation, int role ) const
+{
+ if(facilityEngine==NULL)
+ abort();
+ if ( role == Qt::DisplayRole && orientation == Qt::Horizontal && section >= 0 && section < COLUMN_COUNT ) {
+ switch ( section ) {
+ case 0:
+ return QString::fromStdString(facilityEngine->translateText("Source"));
+ case 1:
+ return QString::fromStdString(facilityEngine->translateText("Size"));
+ case 2:
+ return QString::fromStdString(facilityEngine->translateText("Destination"));
+ }
+ }
+
+ return QAbstractTableModel::headerData( section, orientation, role );
+}
+
+bool TransferModel::setData( const QModelIndex& index, const QVariant& value, int role )
+{
+ row=index.row();
+ column=index.column();
+ if(index.parent()!=QModelIndex() || row < 0 || (unsigned int)row >= transfertItemList.size() || column < 0 || column >= COLUMN_COUNT)
+ return false;
+
+ TransfertItem& item = transfertItemList[row];
+ if(role==Qt::UserRole)
+ {
+ item.id=value.toULongLong();
+ return true;
+ }
+ else if(role==Qt::DisplayRole)
+ {
+ switch(column)
+ {
+ case 0:
+ item.source=value.toString().toStdString();
+ emit dataChanged(index,index);
+ return true;
+ break;
+ case 1:
+ item.size=value.toString().toStdString();
+ emit dataChanged(index,index);
+ return true;
+ break;
+ case 2:
+ item.destination=value.toString().toStdString();
+ emit dataChanged(index,index);
+ return true;
+ break;
+ default:
+ return false;
+ }
+ }
+ return false;
+}
+
+/*
+ Return[0]: totalFile
+ Return[1]: totalSize
+ Return[2]: currentFile
+ */
+std::vector<uint64_t> TransferModel::synchronizeItems(const std::vector<Ultracopier::ReturnActionOnCopyList>& returnActions)
+{
+ const QModelIndexList oldIndexes = persistentIndexList();
+ QModelIndexList newIndexes=oldIndexes;
+ QMap<int, quint64> oldMapping; // model index row in model before update, item id
+ QMap<quint64, int> newMapping; // item id, model index row in model after update
+ for ( int i = 0; i < oldIndexes.count(); i++ ) {
+ const QModelIndex& index = oldIndexes.at(i);
+ oldMapping[index.row()] = index.data( Qt::UserRole ).value<quint64>();
+ }
+
+ loop_size=returnActions.size();
+ index_for_loop=0;
+ quint64 totalFile=0,totalSize=0,currentFile=0;
+ emit layoutAboutToBeChanged();
+ while(index_for_loop<loop_size)
+ {
+ const Ultracopier::ReturnActionOnCopyList& action=returnActions.at(index_for_loop);
+ switch(action.type)
+ {
+ case Ultracopier::AddingItem:
+ {
+ TransfertItem newItem;
+ newItem.id=action.addAction.id;
+ newItem.source=action.addAction.sourceFullPath;
+ newItem.size=facilityEngine->sizeToString(action.addAction.size);
+ newItem.destination=action.addAction.destinationFullPath;
+ transfertItemList.push_back(newItem);
+ totalFile++;
+ totalSize+=action.addAction.size;
+ }
+ break;
+ case Ultracopier::MoveItem:
+ {
+ //bool current_entry=
+ if(action.userAction.position<0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("id: %1, position is wrong: %2").arg(action.addAction.id).arg(action.userAction.position).toStdString());
+ break;
+ }
+ if((unsigned int)action.userAction.position>(transfertItemList.size()-1))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("id: %1, position is wrong: %2").arg(action.addAction.id).arg(action.userAction.position).toStdString());
+ break;
+ }
+ if(action.userAction.moveAt<0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("id: %1, position is wrong: %2").arg(action.addAction.id).arg(action.userAction.position).toStdString());
+ break;
+ }
+ if((unsigned int)action.userAction.moveAt>(transfertItemList.size()-1))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("id: %1, position is wrong: %2").arg(action.addAction.id).arg(action.userAction.position).toStdString());
+ break;
+ }
+ if(action.userAction.position==action.userAction.moveAt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("id: %1, move at same position: %2").arg(action.addAction.id).arg(action.userAction.position).toStdString());
+ break;
+ }
+ const TransfertItem transfertItem=transfertItemList.at(action.userAction.position);
+ transfertItemList.erase(transfertItemList.cbegin()+action.userAction.position);
+ transfertItemList.insert(transfertItemList.cbegin()+action.userAction.moveAt,transfertItem);
+ //newIndexes.move(action.userAction.position,action.userAction.moveAt);
+ }
+ break;
+ case Ultracopier::RemoveItem:
+ {
+ if(currentIndexSearch>0 && action.userAction.position<=currentIndexSearch)
+ currentIndexSearch--;
+ if(action.userAction.position<0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position).toStdString());
+ break;
+ }
+ if((unsigned int)action.userAction.position>(transfertItemList.size()-1))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, position is wrong: %3").arg(action.addAction.id).arg(action.userAction.position).toStdString());
+ break;
+ }
+ transfertItemList.erase(transfertItemList.cbegin()+action.userAction.position);
+ currentFile++;
+ startId.erase(action.addAction.id);
+ stopId.erase(action.addAction.id);
+ internalRunningOperation.erase(action.addAction.id);
+ //newIndexes.remove(action.userAction.moveAt);
+ }
+ break;
+ case Ultracopier::PreOperation:
+ {
+ ItemOfCopyListWithMoreInformations tempItem;
+ tempItem.currentReadProgression=0;
+ tempItem.currentWriteProgression=0;
+ tempItem.generalData=action.addAction;
+ tempItem.actionType=action.type;
+ internalRunningOperation[action.addAction.id]=tempItem;
+ }
+ break;
+ case Ultracopier::Transfer:
+ {
+ if(startId.find(action.addAction.id)==startId.cend())
+ startId.insert(action.addAction.id);
+ stopId.erase(action.addAction.id);
+ if(internalRunningOperation.find(action.addAction.id)!=internalRunningOperation.cend())
+ internalRunningOperation[action.addAction.id].actionType=action.type;
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unable to found entry for file %1: actionType: Transfer").arg(action.addAction.id).toStdString());
+ }
+ break;
+ case Ultracopier::PostOperation:
+ {
+ if(stopId.find(action.addAction.id)==stopId.cend())
+ stopId.insert(action.addAction.id);
+ startId.erase(action.addAction.id);
+ }
+ break;
+ case Ultracopier::CustomOperation:
+ {
+ bool custom_with_progression=(action.addAction.size==1);
+ //without progression
+ if(custom_with_progression)
+ {
+ if(startId.find(action.addAction.id)!=startId.cend())
+ {
+ startId.erase(action.addAction.id);
+ if(stopId.find(action.addAction.id)==stopId.cend())
+ stopId.insert(action.addAction.id);
+ }
+ }
+ //with progression
+ else
+ {
+ stopId.erase(action.addAction.id);
+ if(startId.find(action.addAction.id)==startId.cend())
+ startId.insert(action.addAction.id);
+ }
+ if(internalRunningOperation.find(action.addAction.id)!=internalRunningOperation.cend())
+ {
+ ItemOfCopyListWithMoreInformations &item=internalRunningOperation[action.addAction.id];
+ item.actionType=action.type;
+ item.custom_with_progression=custom_with_progression;
+ item.currentReadProgression=0;
+ item.currentWriteProgression=0;
+ }
+ }
+ break;
+ default:
+ //unknow code, ignore it
+ break;
+ }
+ index_for_loop++;
+ }
+
+ if(!oldIndexes.isEmpty())
+ {
+ const QSet<quint64> ids = oldMapping.values().toSet();
+
+ for ( unsigned int i = 0; i < transfertItemList.size(); i++ ) {
+ const TransferModel::TransfertItem& item = transfertItemList.at(i);
+
+ if ( ids.contains( item.id ) ) {
+ newMapping[ item.id ] = i;
+ }
+ }
+
+ for ( int i = 0; i < oldIndexes.count(); i++ ) {
+ const QModelIndex& index = oldIndexes.at(i);
+ const int newRow = newMapping.value( oldMapping.value(index.row()), -1 );
+ newIndexes[ i ] = newRow == -1 ? QModelIndex() : QAbstractTableModel::index( newRow, index.column(), index.parent() );
+ }
+ }
+
+ changePersistentIndexList( oldIndexes, newIndexes );
+ emit layoutChanged();
+ {
+ std::vector<uint64_t> newList;
+ newList.resize(3);
+ newList[0]=totalFile;
+ newList[1]=totalSize;
+ newList[2]=currentFile;
+ return newList;
+ }
+}
+
+void TransferModel::setFacilityEngine(FacilityInterface * facilityEngine)
+{
+ this->facilityEngine=facilityEngine;
+}
+
+int TransferModel::search(const std::string &text, bool searchNext)
+{
+ emit layoutAboutToBeChanged();
+ search_text=text;
+ emit layoutChanged();
+ if(transfertItemList.size()==0)
+ return -1;
+ if(text.empty())
+ return -1;
+ if(searchNext)
+ {
+ currentIndexSearch++;
+ if(currentIndexSearch>=loop_size)
+ currentIndexSearch=0;
+ }
+ index_for_loop=0;
+ loop_size=transfertItemList.size();
+ while(index_for_loop<loop_size)
+ {
+ const TransfertItem &transfertItem=transfertItemList.at(currentIndexSearch);
+ if(transfertItem.source.find(search_text)!=std::string::npos ||
+ transfertItem.destination.find(search_text)!=std::string::npos)
+ {
+ haveSearchItem=true;
+ searchId=transfertItemList.at(currentIndexSearch).id;
+ return currentIndexSearch;
+ }
+ currentIndexSearch++;
+ if(currentIndexSearch>=loop_size)
+ currentIndexSearch=0;
+ index_for_loop++;
+ }
+ haveSearchItem=false;
+ return -1;
+}
+
+int TransferModel::searchPrev(const std::string &text)
+{
+ emit layoutAboutToBeChanged();
+ search_text=text;
+ emit layoutChanged();
+ if(transfertItemList.size()==0)
+ return -1;
+ if(text.empty())
+ return -1;
+ if(currentIndexSearch==0)
+ currentIndexSearch=loop_size-1;
+ else
+ currentIndexSearch--;
+ index_for_loop=0;
+ loop_size=transfertItemList.size();
+ while(index_for_loop<loop_size)
+ {
+ const TransfertItem &transfertItem=transfertItemList.at(currentIndexSearch);
+ if(transfertItem.source.find(search_text)!=std::string::npos ||
+ transfertItem.destination.find(search_text)!=std::string::npos)
+ {
+ haveSearchItem=true;
+ searchId=transfertItemList.at(currentIndexSearch).id;
+ return currentIndexSearch;
+ }
+ if(currentIndexSearch==0)
+ currentIndexSearch=loop_size-1;
+ else
+ currentIndexSearch--;
+ index_for_loop++;
+ }
+ haveSearchItem=false;
+ return -1;
+}
+
+void TransferModel::setFileProgression(std::vector<Ultracopier::ProgressionItem> &progressionList)
+{
+ loop_size=progressionList.size();
+ index_for_loop=0;
+ while(index_for_loop<loop_size)
+ {
+ if(internalRunningOperation.find(progressionList.at(index_for_loop).id)!=internalRunningOperation.cend())
+ {
+ internalRunningOperation[progressionList.at(index_for_loop).id].generalData.size=progressionList.at(index_for_loop).total;
+ internalRunningOperation[progressionList.at(index_for_loop).id].currentReadProgression=progressionList.at(index_for_loop).currentRead;
+ internalRunningOperation[progressionList.at(index_for_loop).id].currentWriteProgression=progressionList.at(index_for_loop).currentWrite;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ progressionList.erase(progressionList.cbegin()+index_for_loop);
+ index_for_loop--;
+ loop_size--;
+ #endif
+ }
+ index_for_loop++;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(progressionList.size()>0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"progression remaning items");
+ #endif
+}
+
+TransferModel::currentTransfertItem TransferModel::getCurrentTransfertItem() const
+{
+ currentTransfertItem returnItem;
+ returnItem.progressBar_read=-1;
+ returnItem.progressBar_write=0;
+ returnItem.haveItem=startId.size()>0;
+ if(returnItem.haveItem)
+ {
+ if(internalRunningOperation.find(*startId.cbegin())==internalRunningOperation.cend())
+ {
+ returnItem.haveItem=false;
+ return returnItem;
+ }
+ const ItemOfCopyListWithMoreInformations &itemTransfer=internalRunningOperation.at(*startId.cbegin());
+ returnItem.from=itemTransfer.generalData.sourceFullPath;
+ returnItem.to=itemTransfer.generalData.destinationFullPath;
+ returnItem.current_file=itemTransfer.generalData.destinationFileName+", "+facilityEngine->sizeToString(itemTransfer.generalData.size);
+ returnItem.id=itemTransfer.generalData.id;
+ switch(itemTransfer.actionType)
+ {
+ case Ultracopier::CustomOperation:
+ if(!itemTransfer.custom_with_progression)
+ returnItem.progressBar_read=-1;
+ else
+ {
+ if(itemTransfer.generalData.size>0)
+ {
+ returnItem.progressBar_read=((double)itemTransfer.currentReadProgression/itemTransfer.generalData.size)*65535;
+ returnItem.progressBar_write=((double)itemTransfer.currentWriteProgression/itemTransfer.generalData.size)*65535;
+ }
+ else
+ returnItem.progressBar_read=-1;
+ }
+ break;
+ case Ultracopier::Transfer:
+ if(itemTransfer.generalData.size>0)
+ {
+ returnItem.progressBar_read=((double)itemTransfer.currentReadProgression/itemTransfer.generalData.size)*65535;
+ returnItem.progressBar_write=((double)itemTransfer.currentWriteProgression/itemTransfer.generalData.size)*65535;
+ }
+ else
+ {
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ }
+ break;
+ //should never pass here
+ case Ultracopier::PostOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType).toStdString());
+ returnItem.progressBar_read=65535;
+ returnItem.progressBar_write=65535;
+ break;
+ //should never pass here
+ case Ultracopier::PreOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType).toStdString());
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ break;
+ default:
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unknow action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType).toStdString());
+ break;
+ }
+ }
+ else
+ {
+ returnItem.haveItem=stopId.size()>0;
+ if(returnItem.haveItem)
+ {
+ if(internalRunningOperation.find(*stopId.cbegin())==internalRunningOperation.cend())
+ {
+ returnItem.haveItem=false;
+ return returnItem;
+ }
+ const ItemOfCopyListWithMoreInformations &itemTransfer=internalRunningOperation.at(*stopId.cbegin());
+ returnItem.from=itemTransfer.generalData.sourceFullPath;
+ returnItem.to=itemTransfer.generalData.destinationFullPath;
+ returnItem.current_file=itemTransfer.generalData.destinationFileName+", "+facilityEngine->sizeToString(itemTransfer.generalData.size);
+ returnItem.id=itemTransfer.generalData.id;
+ switch(itemTransfer.actionType)
+ {
+ case Ultracopier::CustomOperation:
+ if(!itemTransfer.custom_with_progression)
+ returnItem.progressBar_read=-1;
+ else
+ {
+ if(itemTransfer.generalData.size>0)
+ {
+ returnItem.progressBar_read=((double)itemTransfer.currentReadProgression/itemTransfer.generalData.size)*65535;
+ returnItem.progressBar_write=((double)itemTransfer.currentWriteProgression/itemTransfer.generalData.size)*65535;
+ }
+ else
+ returnItem.progressBar_read=-1;
+ }
+ break;
+ case Ultracopier::Transfer:
+ if(itemTransfer.generalData.size>0)
+ {
+ returnItem.progressBar_read=((double)itemTransfer.currentReadProgression/itemTransfer.generalData.size)*65535;
+ returnItem.progressBar_write=((double)itemTransfer.currentWriteProgression/itemTransfer.generalData.size)*65535;
+ }
+ else
+ {
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ }
+ break;
+ case Ultracopier::PostOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType).toStdString());
+ returnItem.progressBar_read=65535;
+ returnItem.progressBar_write=65535;
+ break;
+ //should never pass here
+ case Ultracopier::PreOperation:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("wrong action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType).toStdString());
+ returnItem.progressBar_read=0;
+ returnItem.progressBar_write=0;
+ break;
+ default:
+ returnItem.progressBar_read=65535;
+ returnItem.progressBar_write=65535;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("unknow action type for file %1: actionType: %2").arg(itemTransfer.generalData.id).arg(itemTransfer.actionType).toStdString());
+ break;
+ }
+ }
+ }
+ if(returnItem.haveItem && returnItem.progressBar_read!=-1 && returnItem.progressBar_write>returnItem.progressBar_read)
+ {
+ int tempVar=returnItem.progressBar_write;
+ returnItem.progressBar_write=returnItem.progressBar_read;
+ returnItem.progressBar_read=tempVar;
+ }
+ return returnItem;
+}
diff --git a/plugins/Themes/Oxygen/TransferModel.h b/plugins/Themes/Oxygen/TransferModel.h
new file mode 100644
index 0000000..e572f9e
--- /dev/null
+++ b/plugins/Themes/Oxygen/TransferModel.h
@@ -0,0 +1,96 @@
+#ifndef TRANSFERMODEL_H
+#define TRANSFERMODEL_H
+
+#include <QAbstractTableModel>
+#include <QItemSelectionModel>
+#include <QModelIndex>
+#include <QVariant>
+#include <QList>
+#include <QSet>
+#include <QIcon>
+#include <QString>
+#include <unordered_map>
+#include <unordered_set>
+#include <set>
+#include <vector>
+
+#include "StructEnumDefinition.h"
+#include "Environment.h"
+
+#include "../../../interface/FacilityInterface.h"
+
+/// \brief model to store the transfer list
+class TransferModel : public QAbstractTableModel
+{
+ Q_OBJECT
+public:
+ /// \brief the transfer item displayed
+ struct TransfertItem
+ {
+ uint64_t id;
+ std::string source;
+ std::string size;
+ std::string destination;
+ };
+ /// \brief the transfer item with progression
+ struct ItemOfCopyListWithMoreInformations
+ {
+ uint64_t currentReadProgression,currentWriteProgression;
+ Ultracopier::ItemOfCopyList generalData;
+ Ultracopier::ActionTypeCopyList actionType;
+ bool custom_with_progression;
+ };
+ /// \brief returned first transfer item
+ struct currentTransfertItem
+ {
+ uint64_t id;
+ bool haveItem;
+ std::string from;
+ std::string to;
+ std::string current_file;
+ int progressBar_read,progressBar_write;
+ };
+
+ TransferModel();
+
+ virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
+ virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+ virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
+
+ std::vector<uint64_t> synchronizeItems(const std::vector<Ultracopier::ReturnActionOnCopyList>& returnActions);
+ void setFacilityEngine(FacilityInterface * facilityEngine);
+
+ int search(const std::string &text,bool searchNext);
+ int searchPrev(const std::string &text);
+
+ void setFileProgression(std::vector<Ultracopier::ProgressionItem> &progressionList);
+
+ currentTransfertItem getCurrentTransfertItem() const;
+
+ uint64_t firstId() const;
+protected:
+ std::vector<TransfertItem> transfertItemList;///< To have a transfer list for the user
+ std::set<uint64_t> startId,stopId;///< To show what is started, what is stopped
+ std::unordered_map<uint64_t,ItemOfCopyListWithMoreInformations> internalRunningOperation;///< to have progression and stat
+private:
+ int loop_size,index_for_loop;
+ int sub_loop_size,sub_index_for_loop;
+ int row,column;
+ FacilityInterface * facilityEngine;
+ std::string search_text;
+ /// \brief index from start the search, decresed by remove before it
+ int currentIndexSearch;
+ bool haveSearchItem;
+ uint64_t searchId;
+ static QIcon *start;
+ static QIcon *stop;
+signals:
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,std::string fonction,std::string text,std::string file,int ligne) const;
+ #endif
+};
+
+#endif // TRANSFERMODEL_H
diff --git a/plugins/Themes/Oxygen/Variable.h b/plugins/Themes/Oxygen/Variable.h
new file mode 100644
index 0000000..8b6119b
--- /dev/null
+++ b/plugins/Themes/Oxygen/Variable.h
@@ -0,0 +1,18 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+
+#define ULTRACOPIER_VERSION_ULTIMATE
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins/Themes/Oxygen/documentation.dox b/plugins/Themes/Oxygen/documentation.dox
new file mode 100644
index 0000000..d94ce0b
--- /dev/null
+++ b/plugins/Themes/Oxygen/documentation.dox
@@ -0,0 +1,31 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage Oxygen
+
+ \section mainpage_overview Overview
+
+ It's the default interface for Ultracopier.\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.0 or newer. Tested on Qt 5.0.
+
+ \section mainpage_downloads Downloads
+
+ You can find the link on <a href="http://ultracopier.first-world.info/">Ultracopier</a> project page, via git, snapshot sources, ...
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.\n
+ resources/export-transfer-list.png and resources/import-transfer-list.png done by png manipulation of KDE's oxygen icon pack (16x16/actions/format-indent-more.png + 16x16/actions/format-list-unordered.png), document-save.png -> all SystemTrayIcon/systray_* (color alteration).\n
+ From 16x16/actions/: list-add.png -> add.png and SystemTrayIcon/add.png, process-stop.png -> remove.png, document-save.png -> main.png and, arrow-down.png -> moveDown.png, arrow-up.png -> moveUp.png, system-shutdown.png -> cancel.png and SystemTrayIcon/exit.png, arrow-down-double.png -> putOnBottom.png, arrow-up-double.png -> putOnTop.png, media-skip-forward.png -> player_end.png, media-playback-pause.png -> player_pause.png, media-playback-start.png -> player_play.png, document-preview.png -> search.png, help-about.png -> SystemTrayIcon/informations.png \n
+ And 16x16/categories/applications-development.png -> SystemTrayIcon/options.png
+
+*/
diff --git a/plugins/Themes/Oxygen/informations.xml b/plugins/Themes/Oxygen/informations.xml
new file mode 100644
index 0000000..f03f832
--- /dev/null
+++ b/plugins/Themes/Oxygen/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Oxygen style for Ultracopier]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Style oxygen pour Ultracopier]]></title>
+ <!-- What kind of plugin this is -->
+ <category>Themes</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Oxygen style for Ultracopier]]></description>
+ <description xml:lang="fr"><![CDATA[Style oxygen pour Ultracopier]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Oxygen</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package> \ No newline at end of file
diff --git a/plugins/Themes/Oxygen/interface.cpp b/plugins/Themes/Oxygen/interface.cpp
new file mode 100644
index 0000000..84b4dd6
--- /dev/null
+++ b/plugins/Themes/Oxygen/interface.cpp
@@ -0,0 +1,1497 @@
+/** \file interface.cpp
+\brief Define the interface core
+\author alpha_one_x86 */
+
+#include <QMessageBox>
+#include <QMimeData>
+#include <QScrollArea>
+#include <QColorDialog>
+#include <QRect>
+#include <QPainter>
+#include <QDebug>
+#include <cmath>
+#include <chrono>
+#include <ctime>
+#ifdef Q_OS_WIN
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#endif
+
+#include "interface.h"
+#include "ui_interface.h"
+#include "ThemesFactory.h"
+
+QIcon Themes::player_play;
+QIcon Themes::player_pause;
+QIcon Themes::tempExitIcon;
+QIcon Themes::editDelete;
+QIcon Themes::skinIcon;
+QIcon Themes::editFind;
+QIcon Themes::documentOpen;
+QIcon Themes::documentSave;
+QIcon Themes::listAdd;
+bool Themes::iconLoaded=false;
+
+// The cmath header from MSVC does not contain round()
+#if (defined(_WIN64) || defined(_WIN32)) && defined(_MSC_VER)
+inline double round(double d) {
+ return floor( d + 0.5 );
+}
+#endif
+
+Themes::Themes(const bool &alwaysOnTop,
+ const bool &showProgressionInTheTitle,
+ const QColor &progressColorWrite,
+ const QColor &progressColorRead,
+ const QColor &progressColorRemaining,
+ const bool &showDualProgression,
+ const quint8 &comboBox_copyEnd,
+ const bool &speedWithProgressBar,
+ const qint32 &currentSpeed,
+ const bool &checkBoxShowSpeed,
+ FacilityInterface * facilityEngine,
+ const bool &moreButtonPushed,
+ const bool &minimizeToSystray,
+ const bool &startMinimized) :
+ ui(new Ui::interfaceCopy()),
+ uiOptions(new Ui::themesOptions())
+{
+ this->facilityEngine=facilityEngine;
+ ui->setupUi(this);
+ uiOptions->setupUi(ui->optionsTab);
+
+ currentFile = 0;
+ totalFile = 0;
+ currentSize = 0;
+ totalSize = 0;
+ getOldProgression = 200;
+ haveError = false;
+ stat = status_never_started;
+ modeIsForced = false;
+ haveStarted = false;
+ storeIsInPause = false;
+ durationStarted = false;
+ if(startMinimized)
+ this->showMinimized();
+
+ this->progressColorWrite = progressColorWrite;
+ this->progressColorRead = progressColorRead;
+ this->progressColorRemaining= progressColorRemaining;
+ this->currentSpeed = currentSpeed;
+ uiOptions->showProgressionInTheTitle->setChecked(showProgressionInTheTitle);
+ uiOptions->speedWithProgressBar->setChecked(speedWithProgressBar);
+ uiOptions->showDualProgression->setChecked(showDualProgression);
+ uiOptions->startMinimized->setEnabled(false);
+ uiOptions->alwaysOnTop->setChecked(alwaysOnTop);
+ uiOptions->minimizeToSystray->setChecked(minimizeToSystray);
+ //uiOptions->setupUi(ui->tabWidget->widget(ui->tabWidget->count()-1));
+ uiOptions->labelStartWithMoreButtonPushed->setVisible(false);
+ uiOptions->checkBoxStartWithMoreButtonPushed->setVisible(false);
+ uiOptions->label_Slider_speed->setVisible(false);
+ uiOptions->SliderSpeed->setVisible(false);
+ uiOptions->label_SpeedMaxValue->setVisible(false);
+ uiOptions->comboBox_copyEnd->setCurrentIndex(comboBox_copyEnd);
+ speedWithProgressBar_toggled(speedWithProgressBar);
+ showDualProgression_toggled(showDualProgression);
+ QPixmap pixmap(75,20);
+ pixmap.fill(progressColorWrite);
+ uiOptions->progressColorWrite->setIcon(pixmap);
+ pixmap.fill(progressColorRead);
+ uiOptions->progressColorRead->setIcon(pixmap);
+ pixmap.fill(progressColorRemaining);
+ uiOptions->progressColorRemaining->setIcon(pixmap);
+
+ transferModel.setFacilityEngine(facilityEngine);//need be before ui->TransferList->setModel(&transferModel); due to call of TransferModel::headerData()
+ ui->TransferList->setModel(&transferModel);
+ ui->tabWidget->setCurrentIndex(0);
+ uiOptions->toolBox->setCurrentIndex(0);
+ uiOptions->checkBoxShowSpeed->setChecked(checkBoxShowSpeed);
+ menu=new QMenu(this);
+ ui->add->setMenu(menu);
+
+ //connect the options
+ checkBoxShowSpeed_toggled(uiOptions->checkBoxShowSpeed->isChecked());
+ connect(uiOptions->checkBoxShowSpeed,&QCheckBox::stateChanged,this,&Themes::checkBoxShowSpeed_toggled);
+ connect(uiOptions->speedWithProgressBar,&QCheckBox::stateChanged,this,&Themes::speedWithProgressBar_toggled);
+ connect(uiOptions->showProgressionInTheTitle,&QCheckBox::stateChanged,this,&Themes::updateTitle);
+ connect(uiOptions->showDualProgression,&QCheckBox::stateChanged,this,&Themes::showDualProgression_toggled);
+ connect(uiOptions->progressColorWrite,&QAbstractButton::clicked,this,&Themes::progressColorWrite_clicked);
+ connect(uiOptions->progressColorRead, &QAbstractButton::clicked,this,&Themes::progressColorRead_clicked);
+ connect(uiOptions->progressColorRemaining,&QAbstractButton::clicked,this,&Themes::progressColorRemaining_clicked);
+ connect(uiOptions->alwaysOnTop,&QAbstractButton::clicked,this,&Themes::alwaysOnTop_clickedSlot);
+
+ isInPause(false);
+
+ connect(uiOptions->limitSpeed, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &Themes::uiUpdateSpeed);
+ connect(uiOptions->checkBox_limitSpeed,&QAbstractButton::toggled, this, &Themes::uiUpdateSpeed);
+
+ connect(ui->actionAddFile,&QAction::triggered,this,&Themes::forcedModeAddFile);
+ connect(ui->actionAddFileToCopy,&QAction::triggered,this,&Themes::forcedModeAddFileToCopy);
+ connect(ui->actionAddFileToMove,&QAction::triggered,this,&Themes::forcedModeAddFileToMove);
+ connect(ui->actionAddFolderToCopy,&QAction::triggered,this,&Themes::forcedModeAddFolderToCopy);
+ connect(ui->actionAddFolderToMove,&QAction::triggered,this,&Themes::forcedModeAddFolderToMove);
+ connect(ui->actionAddFolder,&QAction::triggered,this,&Themes::forcedModeAddFolder);
+ connect(ui->exportErrorToTransferList,&QToolButton::triggered,this,&Themes::exportErrorIntoTransferList);
+
+ //setup the search part
+ closeTheSearchBox();
+ TimerForSearch = new QTimer(this);
+ TimerForSearch->setInterval(500);
+ TimerForSearch->setSingleShot(true);
+ searchShortcut = new QShortcut(QKeySequence(QKeySequence::Find),this);
+ searchShortcut2 = new QShortcut(QKeySequence(QKeySequence::FindNext),this);
+ searchShortcut3 = new QShortcut(QKeySequence(Qt::Key_Escape),this);
+
+ //connect the search part
+ connect(TimerForSearch, &QTimer::timeout, this, &Themes::hilightTheSearchSlot);
+ connect(searchShortcut, &QShortcut::activated, this, &Themes::searchBoxShortcut);
+ connect(searchShortcut2, &QShortcut::activated, this, &Themes::on_pushButtonSearchNext_clicked);
+ connect(ui->pushButtonCloseSearch, &QPushButton::clicked, this, &Themes::closeTheSearchBox);
+ connect(searchShortcut3, &QShortcut::activated, this, &Themes::closeTheSearchBox);
+
+ //reload directly untranslatable text
+ newLanguageLoaded();
+
+ //unpush the more button
+ ui->moreButton->setChecked(moreButtonPushed);
+ on_moreButton_toggled(moreButtonPushed);
+
+ /// \note important for drag and drop, \see dropEvent()
+ setAcceptDrops(true);
+
+ #ifdef SUPERCOPIER
+ const QString themePath=":/Themes/Supercopier/";
+ #else
+ const QString themePath=":/Themes/Oxygen/";
+ #endif
+
+ // try set the OS icon
+ if(!iconLoaded)
+ {
+ iconLoaded=true;
+ tempExitIcon=QIcon::fromTheme(QStringLiteral("application-exit"));
+ editDelete=QIcon::fromTheme(QStringLiteral("edit-delete"));
+ player_pause=QIcon::fromTheme(QStringLiteral("media-playback-pause"));
+ if(player_pause.isNull())
+ player_pause=QIcon(themePath+QStringLiteral("resources/player_pause.png"));
+ player_play=QIcon::fromTheme(QStringLiteral("media-playback-play"));
+ if(player_play.isNull())
+ player_play=QIcon(themePath+QStringLiteral("resources/player_play.png"));
+ skinIcon=QIcon::fromTheme(QStringLiteral("media-skip-forward"));
+ editFind=QIcon::fromTheme(QStringLiteral("edit-find"));
+ documentOpen=QIcon::fromTheme(QStringLiteral("document-open"));
+ documentSave=QIcon::fromTheme(QStringLiteral("document-save"));
+ listAdd=QIcon::fromTheme(QStringLiteral("list-add"));
+ }
+ if(!tempExitIcon.isNull())
+ {
+ ui->cancelButton->setIcon(tempExitIcon);
+ ui->pushButtonCloseSearch->setIcon(tempExitIcon);
+ ui->shutdown->setIcon(tempExitIcon);
+ }
+ if(!editDelete.isNull())
+ ui->del->setIcon(editDelete);
+ if(!player_pause.isNull())
+ ui->pauseButton->setIcon(player_pause);
+ if(!skinIcon.isNull())
+ ui->skipButton->setIcon(skinIcon);
+ if(!editFind.isNull())
+ ui->searchButton->setIcon(editFind);
+ if(!documentOpen.isNull())
+ ui->importTransferList->setIcon(documentOpen);
+ if(!documentSave.isNull())
+ {
+ ui->exportTransferList->setIcon(documentSave);
+ ui->exportErrorToTransferList->setIcon(documentSave);
+ }
+ if(!listAdd.isNull())
+ {
+ ui->add->setIcon(listAdd);
+ ui->actionAddFile->setIcon(listAdd);
+ ui->actionAddFileToCopy->setIcon(listAdd);
+ ui->actionAddFileToMove->setIcon(listAdd);
+ ui->actionAddFolder->setIcon(listAdd);
+ ui->actionAddFolderToCopy->setIcon(listAdd);
+ ui->actionAddFolderToMove->setIcon(listAdd);
+ }
+ #ifdef Q_OS_WIN32
+ pixmapTop=QPixmap(themePath+QStringLiteral("resources/SystemTrayIcon/systray_Uncaught_Windows.png"));
+ pixmapBottom=QPixmap(themePath+QStringLiteral("resources/SystemTrayIcon/systray_Caught_Windows.png"));
+ #else
+ pixmapTop=QPixmap(themePath+QStringLiteral("resources/SystemTrayIcon/systray_Uncaught_Unix.png"));
+ pixmapBottom=QPixmap(themePath+QStringLiteral("resources/SystemTrayIcon/systray_Caught_Unix.png"));
+ #endif
+
+ #ifdef SUPERCOPIER
+ /*QIcon icon;
+ icon.addFile(themePath+QStringLiteral("resources/main.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->interfaceCopy->setWindowIcon(icon);*/
+ QIcon icon1;
+ icon1.addFile(themePath+QStringLiteral("resources/add.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->actionAddFile->setIcon(icon1);
+ QIcon icon2;
+ icon2.addFile(themePath+QStringLiteral("resources/SystemTrayIcon/exit.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->shutdown->setIcon(icon2);
+ QIcon icon3;
+ icon3.addFile(themePath+QStringLiteral("resources/moveDown.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->moreButton->setIcon(icon3);
+ ui->pushDown->setIcon(icon3);
+ if(!QFile::exists(themePath+QStringLiteral("resources/moveDown.png")))
+ {
+ qDebug() << "File not found, can't continue: " << themePath+QStringLiteral("resources/moveDown.png");
+ abort();
+ }
+ QIcon icon4;
+ icon4.addFile(themePath+QStringLiteral("resources/player_pause.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->pauseButton->setIcon(icon4);
+ QIcon icon5;
+ icon5.addFile(themePath+QStringLiteral("resources/player_end.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->skipButton->setIcon(icon5);
+ QIcon icon6;
+ icon6.addFile(themePath+QStringLiteral("resources/cancel.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->cancelButton->setIcon(icon6);
+ QIcon icon7;
+ icon7.addFile(themePath+QStringLiteral("resources/putOnTop.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->putOnTop->setIcon(icon7);
+ QIcon icon8;
+ icon8.addFile(themePath+QStringLiteral("resources/moveUp.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->pushUp->setIcon(icon8);
+ QIcon icon9;
+ icon9.addFile(themePath+QStringLiteral("resources/putOnBottom.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->putOnBottom->setIcon(icon9);
+ QIcon icon10;
+ icon10.addFile(themePath+QStringLiteral("resources/remove.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->del->setIcon(icon10);
+ QIcon icon11;
+ icon11.addFile(themePath+QStringLiteral("resources/search.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->searchButton->setIcon(icon11);
+ QIcon icon12;
+ icon12.addFile(themePath+QStringLiteral("resources/export-transfer-list.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->exportTransferList->setIcon(icon12);
+ QIcon icon13;
+ icon13.addFile(themePath+QStringLiteral("resources/import-transfer-list.png"), QSize(), QIcon::Normal, QIcon::Off);
+ ui->importTransferList->setIcon(icon13);
+ QIcon icon14;
+ icon14.addFile(themePath+QStringLiteral("resources/main.png"), QSize(), QIcon::Normal, QIcon::Off);
+ this->setWindowIcon(icon14);
+ #endif
+
+ shutdown=facilityEngine->haveFunctionality("shutdown");
+ ui->shutdown->setVisible(shutdown);
+
+ selectionModel=ui->TransferList->selectionModel();
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(&transferModel,&TransferModel::debugInformation,this,&Themes::debugInformation);
+ #endif
+
+ updateSpeed();
+ alwaysOnTop_clicked(false);
+ /*#ifdef Q_OS_WIN32
+ uiOptions->labelAlwaysOnTop->hide();
+ uiOptions->alwaysOnTop->hide();
+ #endif*/
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ #ifdef SUPERCOPIER
+ ui->ad_ultimate->setText(tr("%1 is deprecated, Use %2").arg("<span style=\"color:#ee0000\">Super</span><span style=\"color:#0000cc\">Copier</span>").arg("<a href=\"http://ultracopier.first-world.info/\">Ultracopier</a>"));
+ #else
+ #ifdef Q_OS_MACOS
+ ui->ad_ultimate->setText(tr("This will be the last version for Mac, but you can compile from source"));
+ #else
+ ui->ad_ultimate->hide();
+ #endif
+ #endif
+ #else
+ QString ultimateUrl=QString::fromStdString(facilityEngine->ultimateUrl());
+ if(ultimateUrl.isEmpty())
+ ui->ad_ultimate->hide();
+ else
+ ui->ad_ultimate->setText(
+ #ifdef SUPERCOPIER
+ tr("%1 is deprecated, Use %2").arg("<span style=\"color:#ee0000\">Super</span><span style=\"color:#0000cc\">copier</span>").arg("<a href=\"http://ultracopier.first-world.info/\">Ultracopier</a><br />")+
+ #endif
+ #ifdef Q_OS_MACOS
+ tr("This will be the last version for Mac, but you can compile from source")+
+ #endif
+ QStringLiteral("<a href=\"%1\">%2</a>").arg(ultimateUrl).arg(tr("Buy the Ultimate version to fund development")));
+ #endif
+
+ #ifdef SUPERCOPIER
+ uiOptions->labelDualProgression->hide();
+ uiOptions->showDualProgression->hide();
+ ui->progressBar_all->setMaximumHeight(17);
+ ui->progressBar_file->setMaximumHeight(17);
+ ui->progressBarCurrentSpeed->setMaximumHeight(17);
+ ui->progressBar_all->setMinimumHeight(17);
+ ui->progressBar_file->setMinimumHeight(17);
+ ui->progressBarCurrentSpeed->setMinimumHeight(17);
+ ui->progressBar_all->setStyleSheet(QStringLiteral("QProgressBar{color:#fff;font-weight:bold;border:1px solid black;text-align:center;background-image:url(:/Themes/Supercopier/resources/progressbarright.png);}QProgressBar::chunk{background-image: url(:/Themes/Supercopier/resources/progressbarleft.png);}"));
+ ui->progressBar_file->setStyleSheet(QStringLiteral("QProgressBar{color:#fff;font-weight:bold;border:1px solid black;text-align:center;background-image:url(:/Themes/Supercopier/resources/progressbarright.png);}QProgressBar::chunk{background-image: url(:/Themes/Supercopier/resources/progressbarleft.png);}"));
+ ui->progressBarCurrentSpeed->setStyleSheet(QStringLiteral("QProgressBar{color:#fff;font-weight:bold;border:1px solid black;text-align:center;background-image:url(:/Themes/Supercopier/resources/progressbarright.png);}QProgressBar::chunk{background-image: url(:/Themes/Supercopier/resources/progressbarleft.png);}"));
+ this->setWindowTitle("Supercopier");
+ #endif
+
+ show();
+
+ sysTrayIcon = new QSystemTrayIcon(this);
+ connect(sysTrayIcon,&QSystemTrayIcon::activated,this,&Themes::catchAction);
+}
+
+Themes::~Themes()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //disconnect(ui->actionAddFile);
+ //disconnect(ui->actionAddFolder);
+ delete selectionModel;
+ delete menu;
+ delete sysTrayIcon;
+}
+
+QWidget * Themes::getOptionsEngineWidget()
+{
+ return &optionEngineWidget;
+}
+
+void Themes::getOptionsEngineEnabled(const bool &isEnabled)
+{
+ if(isEnabled)
+ {
+ QScrollArea *scrollArea=new QScrollArea(ui->tabWidget);
+ scrollArea->setWidgetResizable(true);
+ scrollArea->setWidget(&optionEngineWidget);
+ ui->tabWidget->addTab(scrollArea,QString::fromStdString(facilityEngine->translateText("Copy engine")));
+ }
+}
+
+void Themes::closeEvent(QCloseEvent *event)
+{
+ event->ignore();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->hide();
+ if(uiOptions->minimizeToSystray->isChecked())
+ {
+ updateSysTrayIcon();
+ sysTrayIcon->show();
+ }
+ else
+ emit cancel();
+}
+
+void Themes::updateSysTrayIcon()
+{
+ if(totalSize==0)
+ {
+ sysTrayIcon->setIcon(dynaIcon(0,"-"));
+ return;
+ }
+ quint64 currentNew=currentSize*100;
+ //update systray icon
+ quint16 getVarProgression=currentNew/totalSize;
+ if(getOldProgression!=getVarProgression)
+ {
+ getOldProgression=getVarProgression;
+ sysTrayIcon->setIcon(dynaIcon(getVarProgression));
+ }
+}
+
+void Themes::updateOverallInformation()
+{
+ if(uiOptions->showProgressionInTheTitle->isChecked())
+ updateTitle();
+ ui->overall->setText(tr("File %1/%2, size: %3/%4")
+ .arg(currentFile)
+ .arg(totalFile)
+ .arg(QString::fromStdString(facilityEngine->sizeToString(currentSize)))
+ .arg(QString::fromStdString(facilityEngine->sizeToString(totalSize)))
+ );
+}
+
+void Themes::actionInProgess(const Ultracopier::EngineActionInProgress &action)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"start: "+std::to_string(action));
+ this->action=action;
+ switch(action)
+ {
+ case Ultracopier::Copying:
+ case Ultracopier::CopyingAndListing:
+ ui->progressBar_all->setMaximum(65535);
+ ui->progressBar_all->setMinimum(0);
+ break;
+ case Ultracopier::Listing:
+ ui->progressBar_all->setMaximum(0);
+ ui->progressBar_all->setMinimum(0);
+ break;
+ case Ultracopier::Idle:
+ ui->progressBar_all->setMaximum(65535);
+ ui->progressBar_all->setMinimum(0);
+ if(haveStarted && transferModel.rowCount()<=0)
+ {
+ if(shutdown && ui->shutdown->isChecked())
+ {
+ facilityEngine->callFunctionality("shutdown");
+ return;
+ }
+ switch(uiOptions->comboBox_copyEnd->currentIndex())
+ {
+ case 2:
+ emit cancel();
+ break;
+ case 0:
+ if(!haveError)
+ emit cancel();
+ else
+ ui->tabWidget->setCurrentWidget(ui->tab_error);
+ break;
+ default:
+ break;
+ }
+ stat = status_stopped;
+ if(durationStarted)
+ {
+ Ultracopier::TimeDecomposition time=facilityEngine->secondsToTimeDecomposition(
+ (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()-
+ duration)
+ /1000);
+ ui->labelTimeRemaining->setText(QStringLiteral("<html><body style=\"white-space:nowrap;\">")+
+ QString::fromStdString(facilityEngine->translateText("Completed in %1")).arg(
+ QString::number(time.hour)+QStringLiteral(":")+
+ QString::number(time.minute).rightJustified(2,'0')+
+ QStringLiteral(":")+
+ QString::number(time.second).rightJustified(2,'0')
+ )+QStringLiteral("</body></html>"));
+ }
+ }
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"Very wrong switch case!");
+ break;
+ }
+ switch(action)
+ {
+ case Ultracopier::Copying:
+ case Ultracopier::CopyingAndListing:
+ ui->pauseButton->setEnabled(true);
+ if(!durationStarted)
+ {
+ duration=std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
+ durationStarted=true;
+ }
+ haveStarted=true;
+ ui->cancelButton->setText(QString::fromStdString(facilityEngine->translateText("Quit")));
+ updatePause();
+ break;
+ case Ultracopier::Listing:
+ ui->pauseButton->setEnabled(false);
+ haveStarted=true;//to close if skip at root folder collision
+ break;
+ case Ultracopier::Idle:
+ ui->pauseButton->setEnabled(false);
+ break;
+ default:
+ break;
+ }
+}
+
+void Themes::newFolderListing(const std::string &path)
+{
+ QString newPath=QString::fromStdString(path);
+ if(newPath.size()>(64+3))
+ newPath=newPath.mid(0,32)+QStringLiteral("...")+newPath.mid(newPath.size()-32,32);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(action==Ultracopier::Listing)
+ ui->from->setText(newPath);
+}
+
+void Themes::detectedSpeed(const uint64_t &speed)//in byte per seconds
+{
+ if(uiOptions->speedWithProgressBar->isChecked())
+ {
+ quint64 tempSpeed=speed;
+ if(tempSpeed>999999999)
+ tempSpeed=999999999;
+ if(tempSpeed>(quint64)ui->progressBarCurrentSpeed->maximum())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set max speed to: "+std::to_string(tempSpeed));
+ ui->progressBarCurrentSpeed->setMaximum(tempSpeed);
+ }
+ ui->progressBarCurrentSpeed->setValue(tempSpeed);
+ ui->progressBarCurrentSpeed->setFormat(QString::fromStdString(facilityEngine->speedToString(speed)));
+ }
+ else
+ ui->currentSpeed->setText(QString::fromStdString(facilityEngine->speedToString(speed)));
+}
+
+void Themes::remainingTime(const int &remainingSeconds)
+{
+ QString labelTimeRemaining(QStringLiteral(
+ "<html><body style=\"white-space:nowrap;\">")+
+ QString::fromStdString(facilityEngine->translateText("Time remaining:"))+
+ QStringLiteral(" ")
+ );
+ if(remainingSeconds==-1)
+ labelTimeRemaining+=QStringLiteral("&#8734;");
+ else
+ {
+ Ultracopier::TimeDecomposition time=facilityEngine->secondsToTimeDecomposition(remainingSeconds);
+ labelTimeRemaining+=QString::number(time.hour)+QStringLiteral(":")+QString::number(time.minute).rightJustified(2,'0')+QStringLiteral(":")+QString::number(time.second).rightJustified(2,'0');
+ }
+ labelTimeRemaining+=QStringLiteral("</body></html>");
+ ui->labelTimeRemaining->setText(labelTimeRemaining);
+}
+
+void Themes::errorDetected()
+{
+ haveError=true;
+}
+
+/// \brief new error
+void Themes::errorToRetry(const std::string &source,const std::string &destination,const std::string &error)
+{
+ ui->errorList->addTopLevelItem(new QTreeWidgetItem(QStringList()
+ << QString::fromStdString(source)
+ << QString::fromStdString(destination)
+ << QString::fromStdString(error)
+ ));
+}
+
+/** \brief support speed limitation */
+void Themes::setSupportSpeedLimitation(const bool &supportSpeedLimitationBool)
+{
+ if(!supportSpeedLimitationBool)
+ {
+ ui->label_Slider_speed->setVisible(false);
+ ui->SliderSpeed->setVisible(false);
+ ui->label_SpeedMaxValue->setVisible(false);
+ uiOptions->labelShowSpeedAsMain->setVisible(false);
+ uiOptions->checkBoxShowSpeed->setVisible(false);
+ }
+ else
+ emit newSpeedLimitation(currentSpeed);
+}
+
+//get information about the copy
+void Themes::setGeneralProgression(const uint64_t &current,const uint64_t &total)
+{
+ currentSize=current;
+ totalSize=total;
+ if(total>0)
+ {
+ int newIndicator=((double)current/total)*65535;
+ ui->progressBar_all->setValue(newIndicator);
+ }
+ else
+ ui->progressBar_all->setValue(0);
+ if(current>0)
+ stat = status_started;
+ updateOverallInformation();
+ if(isHidden())
+ updateSysTrayIcon();
+}
+
+void Themes::setFileProgression(const std::vector<Ultracopier::ProgressionItem> &progressionList)
+{
+ std::vector<Ultracopier::ProgressionItem> progressionListBis=progressionList;
+ transferModel.setFileProgression(progressionListBis);
+ updateCurrentFileInformation();
+}
+
+//edit the transfer list
+/// \todo check and re-enable to selection
+void Themes::getActionOnList(const std::vector<Ultracopier::ReturnActionOnCopyList> &returnActions)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, returnActions.size(): "+std::to_string(returnActions.size()));
+ std::vector<uint64_t> returnValue=transferModel.synchronizeItems(returnActions);
+ totalFile+=returnValue.front();
+ totalSize+=returnValue.at(1);
+ currentFile+=returnValue.back();
+ if(transferModel.rowCount()==0)
+ {
+ ui->skipButton->setEnabled(false);
+ ui->progressBar_all->setValue(65535);
+ ui->progressBar_file->setValue(65535);
+ currentSize=totalSize;
+ if(isHidden())
+ updateSysTrayIcon();
+ }
+ else
+ ui->skipButton->setEnabled(true);
+ updateOverallInformation();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferModel.rowCount(): "+std::to_string(transferModel.rowCount()));
+}
+
+void Themes::setCopyType(const Ultracopier::CopyType &type)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->type=type;
+ updateModeAndType();
+}
+
+void Themes::forceCopyMode(const Ultracopier::CopyMode &mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ modeIsForced=true;
+ this->mode=mode;
+ if(mode==Ultracopier::Copy)
+ ui->tabWidget->setTabText(0,tr("Copy list"));
+ else
+ ui->tabWidget->setTabText(0,tr("Move list"));
+ updateModeAndType();
+ updateTitle();
+}
+
+void Themes::setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation)
+{
+ ui->exportTransferList->setVisible(transferListOperation & Ultracopier::TransferListOperation_Export);
+ ui->importTransferList->setVisible(transferListOperation & Ultracopier::TransferListOperation_Import);
+}
+
+void Themes::haveExternalOrder()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+// ui->moreButton->toggle();
+}
+
+void Themes::isInPause(const bool &isInPause)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"isInPause: "+std::to_string(isInPause));
+ //resume in auto the pause
+ storeIsInPause=isInPause;
+ updatePause();
+}
+
+void Themes::updatePause()
+{
+ if(storeIsInPause)
+ {
+ ui->pauseButton->setIcon(player_play);
+ if(stat == status_started)
+ ui->pauseButton->setText(QString::fromStdString(facilityEngine->translateText("Resume")));
+ else
+ ui->pauseButton->setText(QString::fromStdString(facilityEngine->translateText("Start")));
+ }
+ else
+ {
+ ui->pauseButton->setIcon(player_pause);
+ ui->pauseButton->setText(QString::fromStdString(facilityEngine->translateText("Pause")));
+ }
+}
+
+void Themes::updateCurrentFileInformation()
+{
+ TransferModel::currentTransfertItem transfertItem=transferModel.getCurrentTransfertItem();
+ if(transfertItem.haveItem)
+ {
+ QString newPath=QString::fromStdString(transfertItem.from);
+ if(newPath.size()>(64+3))
+ newPath=newPath.mid(0,32)+QStringLiteral("...")+newPath.mid(newPath.size()-32,32);
+ ui->from->setText(newPath);
+ newPath=QString::fromStdString(transfertItem.to);
+ if(newPath.size()>(64+3))
+ newPath=newPath.mid(0,32)+QStringLiteral("...")+newPath.mid(newPath.size()-32,32);
+ ui->to->setText(newPath);
+ ui->current_file->setText(QString::fromStdString(transfertItem.current_file));
+ if(transfertItem.progressBar_read!=-1)
+ {
+ ui->progressBar_file->setRange(0,65535);
+ if(uiOptions->showDualProgression->isChecked())
+ {
+ if(transfertItem.progressBar_read!=transfertItem.progressBar_write)
+ {
+ float permilleread=round((float)transfertItem.progressBar_read/65535*1000)/1000;
+ float permillewrite=permilleread-0.001;
+ ui->progressBar_file->setStyleSheet(QStringLiteral("QProgressBar{border: 1px solid grey;text-align: center;background-color: qlineargradient(spread:pad, x1:%1, y1:0, x2:%2, y2:0, stop:0 %3, stop:1 %4);}QProgressBar::chunk{background-color:%5;}")
+ .arg(permilleread)
+ .arg(permillewrite)
+ .arg(progressColorRemaining.name())
+ .arg(progressColorRead.name())
+ .arg(progressColorWrite.name())
+ );
+ }
+ else
+ ui->progressBar_file->setStyleSheet(QStringLiteral("QProgressBar{border:1px solid grey;text-align:center;background-color:%1;}QProgressBar::chunk{background-color:%2;}")
+ .arg(progressColorRemaining.name())
+ .arg(progressColorWrite.name())
+ );
+ ui->progressBar_file->setValue(transfertItem.progressBar_write);
+ }
+ else
+ ui->progressBar_file->setValue((transfertItem.progressBar_read+transfertItem.progressBar_write)/2);
+ }
+ else
+ ui->progressBar_file->setRange(0,0);
+ }
+ else
+ {
+ ui->from->setText(QStringLiteral(""));
+ ui->to->setText(QStringLiteral(""));
+ ui->current_file->setText(QStringLiteral("-"));
+ if(haveStarted && transferModel.rowCount()==0)
+ ui->progressBar_file->setValue(65535);
+ else if(!haveStarted)
+ ui->progressBar_file->setValue(0);
+ }
+}
+
+
+void Themes::on_putOnTop_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ selectedItems=selectionModel->selectedRows();
+ std::vector<uint64_t> ids;
+ int index=0;
+ const int &loop_size=selectedItems.size();
+ while(index<loop_size)
+ {
+ ids.push_back(transferModel.data(selectedItems.at(index),Qt::UserRole).toULongLong());
+ index++;
+ }
+ if(ids.size()>0)
+ emit moveItemsOnTop(ids);
+}
+
+void Themes::on_pushUp_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ selectedItems=selectionModel->selectedRows();
+ std::vector<uint64_t> ids;
+ int index=0;
+ const int &loop_size=selectedItems.size();
+ while(index<loop_size)
+ {
+ ids.push_back(transferModel.data(selectedItems.at(index),Qt::UserRole).toULongLong());
+ index++;
+ }
+ if(ids.size()>0)
+ emit moveItemsUp(ids);
+}
+
+void Themes::on_pushDown_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ selectedItems=selectionModel->selectedRows();
+ std::vector<uint64_t> ids;
+ int index=0;
+ const int &loop_size=selectedItems.size();
+ while(index<loop_size)
+ {
+ ids.push_back(transferModel.data(selectedItems.at(index),Qt::UserRole).toULongLong());
+ index++;
+ }
+ if(ids.size()>0)
+ emit moveItemsDown(ids);
+}
+
+void Themes::on_putOnBottom_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ selectedItems=selectionModel->selectedRows();
+ std::vector<uint64_t> ids;
+ int index=0;
+ const int &loop_size=selectedItems.size();
+ while(index<loop_size)
+ {
+ ids.push_back(transferModel.data(selectedItems.at(index),Qt::UserRole).toULongLong());
+ index++;
+ }
+ if(ids.size()>0)
+ emit moveItemsOnBottom(ids);
+}
+
+void Themes::on_del_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ selectedItems=selectionModel->selectedRows();
+ std::vector<uint64_t> ids;
+ int index=0;
+ const int &loop_size=selectedItems.size();
+ while(index<loop_size)
+ {
+ ids.push_back(transferModel.data(selectedItems.at(index),Qt::UserRole).toULongLong());
+ index++;
+ }
+ if(ids.size()>0)
+ emit removeItems(ids);
+}
+
+void Themes::on_cancelButton_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ this->hide();
+ emit cancel();
+}
+
+
+void Themes::speedWithProgressBar_toggled(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ ui->progressBarCurrentSpeed->setVisible(checked);
+ ui->currentSpeed->setVisible(!checked);
+}
+
+void Themes::showDualProgression_toggled(bool checked)
+{
+ Q_UNUSED(checked);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ updateProgressionColorBar();
+}
+
+void Themes::checkBoxShowSpeed_toggled(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ Q_UNUSED(checked);
+ updateSpeed();
+}
+
+void Themes::on_SliderSpeed_valueChanged(int value)
+{
+ if(!uiOptions->checkBoxShowSpeed->isChecked())
+ return;
+ switch(value)
+ {
+ case 0:
+ currentSpeed=0;
+ break;
+ case 1:
+ currentSpeed=1024;
+ break;
+ case 2:
+ currentSpeed=1024*4;
+ break;
+ case 3:
+ currentSpeed=1024*16;
+ break;
+ case 4:
+ currentSpeed=1024*64;
+ break;
+ case 5:
+ currentSpeed=1024*128;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"value: "+std::to_string(value));
+ emit newSpeedLimitation(currentSpeed);
+ updateSpeed();
+}
+
+void Themes::uiUpdateSpeed()
+{
+ if(uiOptions->checkBoxShowSpeed->isChecked())
+ return;
+ if(!uiOptions->checkBox_limitSpeed->isChecked())
+ currentSpeed=0;
+ else
+ currentSpeed=uiOptions->limitSpeed->value();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit newSpeedLimitation"+std::to_string(currentSpeed));
+ emit newSpeedLimitation(currentSpeed);
+}
+
+void Themes::updateSpeed()
+{
+ ui->label_Slider_speed->setVisible(uiOptions->checkBoxShowSpeed->isChecked());
+ ui->SliderSpeed->setVisible(uiOptions->checkBoxShowSpeed->isChecked());
+ ui->label_SpeedMaxValue->setVisible(uiOptions->checkBoxShowSpeed->isChecked());
+ uiOptions->limitSpeed->setVisible(!uiOptions->checkBoxShowSpeed->isChecked());
+ uiOptions->checkBox_limitSpeed->setVisible(!uiOptions->checkBoxShowSpeed->isChecked());
+
+ if(uiOptions->checkBoxShowSpeed->isChecked())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"checked, currentSpeed: "+std::to_string(currentSpeed));
+ uiOptions->limitSpeed->setEnabled(false);
+ if(currentSpeed==0)
+ {
+ ui->SliderSpeed->setValue(0);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->translateText("Unlimited")));
+ }
+ else if(currentSpeed<=1024)
+ {
+ if(currentSpeed!=1024)
+ {
+ currentSpeed=1024;
+ emit newSpeedLimitation(currentSpeed);
+ }
+ ui->SliderSpeed->setValue(1);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*1)));
+ }
+ else if(currentSpeed<=1024*4)
+ {
+ if(currentSpeed!=1024*4)
+ {
+ currentSpeed=1024*4;
+ emit newSpeedLimitation(currentSpeed);
+ }
+ ui->SliderSpeed->setValue(2);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*4)));
+ }
+ else if(currentSpeed<=1024*16)
+ {
+ if(currentSpeed!=1024*16)
+ {
+ currentSpeed=1024*16;
+ emit newSpeedLimitation(currentSpeed);
+ }
+ ui->SliderSpeed->setValue(3);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*16)));
+ }
+ else if(currentSpeed<=1024*64)
+ {
+ if(currentSpeed!=1024*64)
+ {
+ currentSpeed=1024*64;
+ emit newSpeedLimitation(currentSpeed);
+ }
+ ui->SliderSpeed->setValue(4);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*64)));
+ }
+ else
+ {
+ if(currentSpeed!=1024*128)
+ {
+ currentSpeed=1024*128;
+ emit newSpeedLimitation(currentSpeed);
+ }
+ ui->SliderSpeed->setValue(5);
+ ui->label_SpeedMaxValue->setText(QString::fromStdString(facilityEngine->speedToString((double)(1024*1024)*128)));
+ }
+ }
+ else
+ {
+ uiOptions->checkBox_limitSpeed->setChecked(currentSpeed>0);
+ if(currentSpeed>0)
+ uiOptions->limitSpeed->setValue(currentSpeed);
+ uiOptions->checkBox_limitSpeed->setEnabled(currentSpeed!=-1);
+ uiOptions->limitSpeed->setEnabled(uiOptions->checkBox_limitSpeed->isChecked());
+ }
+}
+
+void Themes::on_pauseButton_clicked()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(storeIsInPause)
+ emit resume();
+ else
+ emit pause();
+}
+
+void Themes::on_skipButton_clicked()
+{
+ TransferModel::currentTransfertItem transfertItem=transferModel.getCurrentTransfertItem();
+ if(transfertItem.haveItem)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"skip at running: "+std::to_string(transfertItem.id));
+ emit skip(transfertItem.id);
+ }
+ else
+ {
+ if(transferModel.rowCount()>1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"skip at idle: "+std::to_string(transferModel.firstId()));
+ emit skip(transferModel.firstId());
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to skip the transfer, because no transfer running");
+ }
+}
+
+void Themes::updateModeAndType()
+{
+ menu->clear();
+ if(modeIsForced)
+ {
+ menu->addAction(ui->actionAddFile);
+ if(type==Ultracopier::FileAndFolder)
+ menu->addAction(ui->actionAddFolder);
+ }
+ else
+ {
+ menu->addAction(ui->actionAddFileToCopy);
+ menu->addAction(ui->actionAddFileToMove);
+ if(type==Ultracopier::FileAndFolder)
+ {
+ menu->addAction(ui->actionAddFolderToCopy);
+ menu->addAction(ui->actionAddFolderToMove);
+ }
+ }
+}
+
+void Themes::forcedModeAddFile()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFile(mode);
+}
+
+void Themes::forcedModeAddFolder()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFolder(mode);
+}
+
+void Themes::forcedModeAddFileToCopy()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFile(Ultracopier::Copy);
+}
+
+void Themes::forcedModeAddFolderToCopy()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFolder(Ultracopier::Copy);
+}
+
+void Themes::forcedModeAddFileToMove()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFile(Ultracopier::Move);
+}
+
+void Themes::forcedModeAddFolderToMove()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit userAddFolder(Ultracopier::Move);
+}
+
+void Themes::newLanguageLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(modeIsForced)
+ forceCopyMode(mode);
+ ui->retranslateUi(this);
+ uiOptions->retranslateUi(this);
+ uiOptions->comboBox_copyEnd->setItemText(0,tr("Don't close if errors are found"));
+ uiOptions->comboBox_copyEnd->setItemText(1,tr("Never close"));
+ uiOptions->comboBox_copyEnd->setItemText(2,tr("Always close"));
+ if(!haveStarted)
+ ui->current_file->setText(tr("File Name, 0KB"));
+ else
+ updateCurrentFileInformation();
+ updateOverallInformation();
+ updateSpeed();
+ if(ui->tabWidget->count()>=4)
+ ui->tabWidget->setTabText(ui->tabWidget->count()-1,
+ QString::fromStdString(facilityEngine->translateText("Copy engine")));
+ on_moreButton_toggled(ui->moreButton->isChecked());
+}
+
+void Themes::on_pushButtonCloseSearch_clicked()
+{
+ closeTheSearchBox();
+}
+
+//close the search box
+void Themes::closeTheSearchBox()
+{
+ currentIndexSearch = -1;
+ ui->lineEditSearch->clear();
+ ui->lineEditSearch->hide();
+ ui->pushButtonSearchPrev->hide();
+ ui->pushButtonSearchNext->hide();
+ ui->pushButtonCloseSearch->hide();
+ ui->searchButton->setChecked(false);
+ hilightTheSearch();
+}
+
+//search box shortcut
+void Themes::searchBoxShortcut()
+{
+/* if(ui->lineEditSearch->isHidden())
+ {*/
+ ui->lineEditSearch->show();
+ ui->pushButtonSearchPrev->show();
+ ui->pushButtonSearchNext->show();
+ ui->pushButtonCloseSearch->show();
+ ui->lineEditSearch->setFocus(Qt::ShortcutFocusReason);
+ ui->searchButton->setChecked(true);
+/* }
+ else
+ closeTheSearchBox();*/
+}
+
+//hilight the search
+void Themes::hilightTheSearch(bool searchNext)
+{
+ int result=transferModel.search(ui->lineEditSearch->text().toStdString(),searchNext);
+ if(ui->lineEditSearch->text().isEmpty())
+ ui->lineEditSearch->setStyleSheet("");
+ else
+ {
+ if(result==-1)
+ ui->lineEditSearch->setStyleSheet(QStringLiteral("background-color: rgb(255, 150, 150);"));
+ else
+ {
+ ui->lineEditSearch->setStyleSheet(QStringLiteral("background-color: rgb(193,255,176);"));
+ ui->TransferList->scrollTo(transferModel.index(result,0));
+ }
+ }
+}
+
+void Themes::hilightTheSearchSlot()
+{
+ hilightTheSearch();
+}
+
+void Themes::on_pushButtonSearchPrev_clicked()
+{
+ int result=transferModel.searchPrev(ui->lineEditSearch->text().toStdString());
+ if(ui->lineEditSearch->text().isEmpty())
+ ui->lineEditSearch->setStyleSheet("");
+ else
+ {
+ if(result==-1)
+ ui->lineEditSearch->setStyleSheet(QStringLiteral("background-color: rgb(255, 150, 150);"));
+ else
+ {
+ ui->lineEditSearch->setStyleSheet(QStringLiteral("background-color: rgb(193,255,176);"));
+ ui->TransferList->scrollTo(transferModel.index(result,0));
+ }
+ }
+}
+
+void Themes::on_pushButtonSearchNext_clicked()
+{
+ hilightTheSearch(true);
+}
+
+void Themes::on_lineEditSearch_returnPressed()
+{
+ hilightTheSearch();
+}
+
+void Themes::on_lineEditSearch_textChanged(QString text)
+{
+ if(text=="")
+ {
+ TimerForSearch->stop();
+ hilightTheSearch();
+ }
+ else
+ TimerForSearch->start();
+}
+
+void Themes::on_moreButton_toggled(bool checked)
+{
+ if(checked)
+ this->setMaximumHeight(16777215);
+ else
+ this->setMaximumHeight(130);
+ // usefull under windows
+ this->updateGeometry();
+ this->update();
+ this->adjustSize();
+}
+
+/* drag event processing
+
+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 Themes::dropEvent(QDropEvent *event)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ const QMimeData* mimeData = event->mimeData();
+ if(mimeData->hasUrls())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"hasUrls");
+ std::vector<std::string> urls;
+ foreach (QUrl url, mimeData->urls())
+ urls.push_back(url.toString().toStdString());
+ emit urlDropped(urls);
+ event->acceptProposedAction();
+ }
+}
+
+void Themes::dragEnterEvent(QDragEnterEvent* event)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ // if some actions should not be usable, like move, this code must be adopted
+ const QMimeData* mimeData = event->mimeData();
+ if(mimeData->hasUrls())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"hasUrls");
+ event->acceptProposedAction();
+ }
+}
+
+void Themes::dragMoveEvent(QDragMoveEvent* event)
+{
+ // if some actions should not be usable, like move, this code must be adopted
+ const QMimeData* mimeData = event->mimeData();
+ if(mimeData->hasUrls())
+ event->acceptProposedAction();
+}
+
+void Themes::dragLeaveEvent(QDragLeaveEvent* event)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ event->accept();
+}
+
+void Themes::on_searchButton_toggled(bool checked)
+{
+ if(checked)
+ searchBoxShortcut();
+ else
+ closeTheSearchBox();
+}
+
+void Themes::on_exportTransferList_clicked()
+{
+ emit exportTransferList();
+}
+
+void Themes::on_importTransferList_clicked()
+{
+ emit importTransferList();
+}
+
+void Themes::progressColorWrite_clicked()
+{
+ QColor color=QColorDialog::getColor(progressColorWrite,this,tr("Select a color"));
+ if(!color.isValid())
+ return;
+ progressColorWrite=color;
+ QPixmap pixmap(75,20);
+ pixmap.fill(progressColorWrite);
+ uiOptions->progressColorWrite->setIcon(pixmap);
+ updateProgressionColorBar();
+}
+
+void Themes::progressColorRead_clicked()
+{
+ QColor color=QColorDialog::getColor(progressColorRead,this,tr("Select a color"));
+ if(!color.isValid())
+ return;
+ progressColorRead=color;
+ QPixmap pixmap(75,20);
+ pixmap.fill(progressColorRead);
+ uiOptions->progressColorRead->setIcon(pixmap);
+ updateProgressionColorBar();
+}
+
+void Themes::progressColorRemaining_clicked()
+{
+ QColor color=QColorDialog::getColor(progressColorRemaining,this,tr("Select a color"));
+ if(!color.isValid())
+ return;
+ progressColorRemaining=color;
+ QPixmap pixmap(75,20);
+ pixmap.fill(progressColorRemaining);
+ uiOptions->progressColorRemaining->setIcon(pixmap);
+ updateProgressionColorBar();
+}
+
+void Themes::alwaysOnTop_clicked(bool reshow)
+{
+ Qt::WindowFlags flags = windowFlags();
+ #ifdef Q_OS_WIN32
+ if(uiOptions->alwaysOnTop->isChecked())
+ SetWindowPos((HWND)this->winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ else
+ SetWindowPos((HWND)this->winId(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ #endif
+ #ifdef Q_OS_LINUX
+ if(uiOptions->alwaysOnTop->isChecked())
+ flags=flags | Qt::X11BypassWindowManagerHint;
+ else
+ flags=flags & ~Qt::X11BypassWindowManagerHint;
+ #endif
+ if(uiOptions->alwaysOnTop->isChecked())
+ flags=flags | Qt::WindowStaysOnTopHint;
+ else
+ flags=flags & ~Qt::WindowStaysOnTopHint;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"uiOptions->alwaysOnTop->isChecked(): "+std::to_string(uiOptions->alwaysOnTop->isChecked())+", flags: "+std::to_string(flags));
+ setWindowFlags(flags);
+ if(reshow)
+ show();
+}
+
+void Themes::alwaysOnTop_clickedSlot()
+{
+ alwaysOnTop_clicked(true);
+}
+
+void Themes::updateProgressionColorBar()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ uiOptions->labelProgressionColor->setVisible(uiOptions->showDualProgression->isChecked());
+ uiOptions->frameProgressionColor->setVisible(uiOptions->showDualProgression->isChecked());
+ if(!uiOptions->showDualProgression->isChecked())
+ {
+ ui->progressBar_all->setStyleSheet(QStringLiteral(""));
+ ui->progressBar_file->setStyleSheet(QStringLiteral(""));
+ ui->progressBarCurrentSpeed->setStyleSheet(QStringLiteral(""));
+ }
+ else
+ {
+ ui->progressBar_all->setStyleSheet(QStringLiteral("QProgressBar{border:1px solid grey;text-align:center;background-color:%1;}QProgressBar::chunk{background-color:%2;}")
+ .arg(progressColorRemaining.name())
+ .arg(progressColorWrite.name())
+ );
+ ui->progressBar_file->setStyleSheet(QStringLiteral("QProgressBar{border:1px solid grey;text-align:center;background-color:%1;}QProgressBar::chunk{background-color:%2;}")
+ .arg(progressColorRemaining.name())
+ .arg(progressColorWrite.name())
+ );
+ ui->progressBarCurrentSpeed->setStyleSheet(QStringLiteral("QProgressBar{border:1px solid grey;text-align:center;background-color:%1;}QProgressBar::chunk{background-color:%2;}")
+ .arg(progressColorRemaining.name())
+ .arg(progressColorWrite.name())
+ );
+ }
+ if(stat==status_never_started)
+ updateCurrentFileInformation();
+}
+
+void Themes::updateTitle()
+{
+ if(uiOptions->showProgressionInTheTitle->isChecked() && totalSize>0)
+ {
+ if(!modeIsForced)
+ this->setWindowTitle(tr("%1 %2% of %3").arg(QString::fromStdString(facilityEngine->translateText("Transfer"))).arg((currentSize*100)/totalSize).arg(QString::fromStdString(facilityEngine->sizeToString(totalSize)))+QStringLiteral(" - ")+QString::fromStdString(facilityEngine->softwareName()));
+ else
+ {
+ if(mode==Ultracopier::Copy)
+ this->setWindowTitle(tr("%1 %2% of %3").arg(QString::fromStdString(facilityEngine->translateText("Copy"))).arg((currentSize*100)/totalSize).arg(QString::fromStdString(facilityEngine->sizeToString(totalSize)))+QStringLiteral(" - ")+QString::fromStdString(facilityEngine->softwareName()));
+ else
+ this->setWindowTitle(tr("%1 %2% of %3").arg(QString::fromStdString(facilityEngine->translateText("Move"))).arg((currentSize*100)/totalSize).arg(QString::fromStdString(facilityEngine->sizeToString(totalSize)))+QStringLiteral(" - ")+QString::fromStdString(facilityEngine->softwareName()));
+ }
+ }
+ else
+ {
+ if(!modeIsForced)
+ this->setWindowTitle(QStringLiteral("%1").arg(QString::fromStdString(facilityEngine->translateText("Transfer")))+QStringLiteral(" - ")+QString::fromStdString(facilityEngine->softwareName()));
+ else
+ {
+ if(mode==Ultracopier::Copy)
+ this->setWindowTitle(QStringLiteral("%1").arg(QString::fromStdString(facilityEngine->translateText("Copy")))+QStringLiteral(" - ")+QString::fromStdString(facilityEngine->softwareName()));
+ else
+ this->setWindowTitle(QStringLiteral("%1").arg(QString::fromStdString(facilityEngine->translateText("Move")))+QStringLiteral(" - ")+QString::fromStdString(facilityEngine->softwareName()));
+ }
+ }
+}
+
+/** \brief Create progessive icon
+
+Do QIcon with top and bottom image mixed and percent writed on it.
+The icon it be search in the style path.
+Do by mongaulois, remake by alpha_one_x86.
+\param percent indique how many percent need be showed, sould be between 0 and 100
+\param text The showed text if needed (optionnal)
+\return QIcon of the final image
+\note Can be used as it: dynaIcon(75,"...")
+*/
+QIcon Themes::dynaIcon(int percent,std::string text) const
+{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(pixmapTop.isNull() || pixmapBottom.isNull())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error loading the icons");
+ #endif
+ if(percent==-1)
+ percent=getOldProgression;
+ if(percent<0)
+ percent=0;
+ if(percent>100)
+ percent=100;
+ //pixmap avec un fond transparent
+ #ifdef Q_OS_WIN32
+ quint8 imageSize=16;
+ #else
+ quint8 imageSize=22;
+ #endif
+ QPixmap resultImage(imageSize,imageSize);
+ resultImage.fill(Qt::transparent);
+ {
+ QPainter painter(&resultImage);
+ #ifndef Q_OS_WIN32
+ QFont font(QStringLiteral("Courier New"),9);
+ font.setBold(true);
+ font.setKerning(true);
+ painter.setFont(font);
+ #endif
+ #ifdef Q_OS_WIN32
+ QFont font(QStringLiteral("Courier New"),8);
+ font.setBold(true);
+ font.setKerning(true);
+ painter.setFont(font);
+ #endif
+
+ //preprocessing the calcul
+ quint8 bottomPixel=(percent*imageSize)/100;
+ quint8 topPixel=imageSize-bottomPixel;
+
+ //top image
+ if(topPixel>0)
+ {
+ QRect target(0, 0, imageSize, topPixel);
+ QRect source(0, 0, imageSize, topPixel);
+ painter.drawPixmap(target, pixmapTop, source);
+ }
+
+ //bottom image
+ if(bottomPixel>0)
+ {
+ QRect target2(0, topPixel, imageSize, bottomPixel);
+ QRect source2(0, topPixel, imageSize, bottomPixel);
+ painter.drawPixmap(target2, pixmapBottom, source2);
+ }
+
+ qint8 textxOffset=0;
+ qint8 textyOffset=0;
+ if(text.empty())
+ {
+ if(percent!=100)
+ text=std::to_string(percent);
+ else
+ {
+ text=":)";
+ #ifdef Q_OS_WIN32
+ textyOffset-=2;
+ #else
+ textyOffset-=1;
+ #endif
+ }
+ }
+ if(text.size()==1)
+ {
+ textxOffset+=3;
+ #ifdef Q_OS_WIN32
+ textxOffset-=1;
+ #endif
+ }
+ else
+ {
+ #ifdef Q_OS_WIN32
+ textxOffset-=1;
+ #endif
+ }
+ #ifndef Q_OS_WIN32
+ textxOffset+=2;
+ textyOffset+=3;
+ #endif
+ painter.setPen(QPen(Qt::black));
+ painter.drawText(3+textxOffset,13+textyOffset,QString::fromStdString(text));
+ painter.setPen(QPen(Qt::white));
+ painter.drawText(2+textxOffset,12+textyOffset,QString::fromStdString(text));
+ }
+ return QIcon(resultImage);
+}
+
+/** \brief For catch an action on the systray icon
+\param reason Why it activated
+*/
+void Themes::catchAction(QSystemTrayIcon::ActivationReason reason)
+{
+ if(reason==QSystemTrayIcon::DoubleClick || reason==QSystemTrayIcon::Trigger)
+ {
+ sysTrayIcon->hide();
+ this->show();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Double Click detected");
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"reason: "+std::to_string(reason));
+}
+
+void Themes::on_exportErrorToTransferList_clicked()
+{
+ emit exportErrorIntoTransferList();
+}
diff --git a/plugins/Themes/Oxygen/interface.h b/plugins/Themes/Oxygen/interface.h
new file mode 100644
index 0000000..acca141
--- /dev/null
+++ b/plugins/Themes/Oxygen/interface.h
@@ -0,0 +1,222 @@
+/** \file interface.h
+\brief Define the interface
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#ifndef INTERFACE_H
+#define INTERFACE_H
+
+#include <QObject>
+#include <QWidget>
+#include <QMenu>
+#include <QCloseEvent>
+#include <QShortcut>
+#include <QItemSelectionModel>
+#include <QTimer>
+#include <QTime>
+#include <QSystemTrayIcon>
+#include <QPixmap>
+
+#include "../../../interface/PluginInterface_Themes.h"
+
+#include "ui_interface.h"
+#include "ui_themesOptions.h"
+#include "Environment.h"
+#include "TransferModel.h"
+
+// for windows progress bar
+#ifndef __GNUC__
+# include <shobjidl.h>
+#endif
+
+namespace Ui {
+ class interfaceCopy;
+ class themesOptions;
+}
+
+/// \brief Define the interface
+class Themes : public PluginInterface_Themes
+{
+ Q_OBJECT
+public:
+ Themes(const bool &alwaysOnTop,
+ const bool &showProgressionInTheTitle,
+ const QColor &progressColorWrite,
+ const QColor &progressColorRead,
+ const QColor &progressColorRemaining,
+ const bool &showDualProgression,
+ const quint8 &comboBox_copyEnd,
+ const bool &speedWithProgressBar,
+ const qint32 &currentSpeed,
+ const bool &checkBoxShowSpeed,
+ FacilityInterface * facilityEngine,
+ const bool &moreButtonPushed,
+ const bool &minimizeToSystray,
+ const bool &startMinimized);
+ ~Themes();
+ //send information about the copy
+ /// \brief to set the action in progress
+ void actionInProgess(const Ultracopier::EngineActionInProgress &);
+ /// \brief the new folder is listing
+ void newFolderListing(const std::string &path);
+ /** \brief show the detected speed
+ * in byte per seconds */
+ void detectedSpeed(const uint64_t &speed);
+ /** \brief show the remaining time
+ * time in seconds */
+ void remainingTime(const int &remainingSeconds);
+ /// \brief set the current collision action
+ void newCollisionAction(const std::string &action);
+ /// \brief set the current error action
+ void newErrorAction(const std::string &action);
+ /// \brief set one error is detected
+ void errorDetected();
+ /// \brief new error
+ void errorToRetry(const std::string &source,const std::string &destination,const std::string &error);
+ /** \brief support speed limitation */
+ void setSupportSpeedLimitation(const bool &supportSpeedLimitationBool);
+ //get information about the copy
+ /// \brief show the general progression
+ void setGeneralProgression(const uint64_t &current,const uint64_t &total);
+ /// \brief show the file progression
+ void setFileProgression(const std::vector<Ultracopier::ProgressionItem> &progressionList);
+ /// \brief set the copyType -> file or folder
+ void setCopyType(const Ultracopier::CopyType &);
+ /// \brief set the copyMove -> copy or move, to force in copy or move, else support both
+ void forceCopyMode(const Ultracopier::CopyMode &);
+ /// \brief set if transfer list is exportable/importable
+ void setTransferListOperation(const Ultracopier::TransferListOperation &transferListOperation);
+ //edit the transfer list
+ /// \brief get action on the transfer list (add/move/remove)
+ void getActionOnList(const std::vector<Ultracopier::ReturnActionOnCopyList> &returnActions);
+ /** \brief set if the order is external (like file manager copy)
+ * to notify the interface, which can hide add folder/filer button */
+ void haveExternalOrder();
+ /// \brief set if is in pause
+ void isInPause(const bool &);
+ /// \brief get the widget for the copy engine
+ QWidget * getOptionsEngineWidget();
+ /// \brief to set if the copy engine is found
+ void getOptionsEngineEnabled(const bool &isEnabled);
+ enum status{status_never_started,status_started,status_stopped};
+ status stat;
+public slots:
+ /// \brief set the translate
+ void newLanguageLoaded();
+private slots:
+ void on_putOnTop_clicked();
+ void on_pushUp_clicked();
+ void on_pushDown_clicked();
+ void on_putOnBottom_clicked();
+ void on_del_clicked();
+ void on_cancelButton_clicked();
+ void speedWithProgressBar_toggled(bool checked);
+ void showDualProgression_toggled(bool checked);
+ void checkBoxShowSpeed_toggled(bool checked);
+ void on_SliderSpeed_valueChanged(int value);
+ void on_pauseButton_clicked();
+ void on_skipButton_clicked();
+ void forcedModeAddFile();
+ void forcedModeAddFolder();
+ void forcedModeAddFileToCopy();
+ void forcedModeAddFolderToCopy();
+ void forcedModeAddFileToMove();
+ void forcedModeAddFolderToMove();
+ void uiUpdateSpeed();
+ void on_pushButtonCloseSearch_clicked();
+ //close the search box
+ void closeTheSearchBox();
+ //search box shortcut
+ void searchBoxShortcut();
+ //hilight the search
+ void hilightTheSearch(bool searchNext=false);
+ void hilightTheSearchSlot();
+ //auto connect
+ void on_pushButtonSearchPrev_clicked();
+ void on_pushButtonSearchNext_clicked();
+ void on_lineEditSearch_returnPressed();
+ void on_lineEditSearch_textChanged(QString text);
+ void on_moreButton_toggled(bool checked);
+ void on_searchButton_toggled(bool checked);
+ void on_exportTransferList_clicked();
+ void on_importTransferList_clicked();
+ void progressColorWrite_clicked();
+ void progressColorRead_clicked();
+ void progressColorRemaining_clicked();
+ void alwaysOnTop_clicked(bool reshow);
+ void alwaysOnTop_clickedSlot();
+ void updateProgressionColorBar();
+ void updateTitle();
+ void catchAction(QSystemTrayIcon::ActivationReason reason);
+ void on_exportErrorToTransferList_clicked();
+private:
+ uint64_t duration;
+ bool durationStarted;
+ QPixmap pixmapTop,pixmapBottom;
+ QColor progressColorWrite,progressColorRead,progressColorRemaining;
+ Ui::interfaceCopy *ui;
+ Ui::themesOptions *uiOptions;
+ uint64_t currentFile;
+ uint64_t totalFile;
+ uint64_t currentSize;
+ uint64_t totalSize;
+ uint8_t getOldProgression;
+ QSystemTrayIcon *sysTrayIcon;
+ void updateOverallInformation();
+ void updateCurrentFileInformation();
+ QMenu *menu;
+ Ultracopier::EngineActionInProgress action;
+ void closeEvent(QCloseEvent *event);
+ int32_t currentSpeed;///< in KB/s, assume as 0KB/s as default like every where
+ void updateSpeed();
+ bool storeIsInPause;
+ bool modeIsForced;
+ Ultracopier::CopyType type;
+ Ultracopier::CopyMode mode;
+ void updateModeAndType();
+ bool haveStarted;
+ bool haveError;
+ QWidget optionEngineWidget;
+ QShortcut *searchShortcut;
+ QShortcut *searchShortcut2;
+ QShortcut *searchShortcut3;
+ QTimer *TimerForSearch;
+ int currentIndexSearch; ///< Current index search in starting at the end
+ FacilityInterface * facilityEngine;
+ QItemSelectionModel *selectionModel;
+ QModelIndexList selectedItems;
+ /// \brief the custom transfer model
+ TransferModel transferModel;
+
+ static QIcon player_play,player_pause,tempExitIcon,editDelete,skinIcon,editFind,documentOpen,documentSave,listAdd;
+ static bool iconLoaded;
+
+ /** \brief drag event processing
+
+ 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);
+ //have functionality
+ bool shutdown;
+ void updatePause();
+ QIcon dynaIcon(int percent,std::string text="") const;
+ void updateSysTrayIcon();
+signals:
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
+};
+
+#endif // INTERFACE_H
diff --git a/plugins/Themes/Oxygen/interface.pro b/plugins/Themes/Oxygen/interface.pro
new file mode 100644
index 0000000..9b4923d
--- /dev/null
+++ b/plugins/Themes/Oxygen/interface.pro
@@ -0,0 +1,8 @@
+include($$PWD/../Oxygen/interfaceInclude.pri)
+
+!CONFIG(static) {
+RESOURCES += \
+ $$PWD/../Oxygen/interfaceResources.qrc \
+ $$PWD/../Oxygen/interfaceResources_unix.qrc \
+ $$PWD/../Oxygen/interfaceResources_windows.qrc
+}
diff --git a/plugins/Themes/Oxygen/interface.ui b/plugins/Themes/Oxygen/interface.ui
new file mode 100644
index 0000000..ef07b17
--- /dev/null
+++ b/plugins/Themes/Oxygen/interface.ui
@@ -0,0 +1,848 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>interfaceCopy</class>
+ <widget class="QWidget" name="interfaceCopy">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>508</width>
+ <height>448</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Ultracopier</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/main.png</normaloff>:/Themes/Oxygen/resources/main.png</iconset>
+ </property>
+ <layout class="QVBoxLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="from_label">
+ <property name="text">
+ <string>From:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="from">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>5</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="to_label">
+ <property name="text">
+ <string>To:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="to">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QLabel" name="overall">
+ <property name="text">
+ <string notr="true">File 0/0, Total: 0KB</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelTimeRemaining">
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="shutdown">
+ <property name="maximumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Close on transfer completion</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/SystemTrayIcon/exit.png</normaloff>:/Themes/Oxygen/resources/SystemTrayIcon/exit.png</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar_all">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>65535</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="current_file">
+ <property name="text">
+ <string notr="true">File Name, 0KB</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar_file">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>65535</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="ad_ultimate">
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="currentSpeed">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true">0KB/sec</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBarCurrentSpeed">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ <property name="format">
+ <string notr="true">0KB/sec</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="moreButton">
+ <property name="text">
+ <string>&amp;More</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/moveDown.png</normaloff>:/Themes/Oxygen/resources/moveDown.png</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pauseButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Pause</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/player_pause.png</normaloff>:/Themes/Oxygen/resources/player_pause.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="skipButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Skip</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/player_end.png</normaloff>:/Themes/Oxygen/resources/player_end.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/cancel.png</normaloff>:/Themes/Oxygen/resources/cancel.png</iconset>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="limitSpeedAsMain">
+ <item>
+ <widget class="QLabel" name="label_Slider_speed">
+ <property name="text">
+ <string>Limit copy speed to:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="SliderSpeed">
+ <property name="maximum">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_SpeedMaxValue">
+ <property name="text">
+ <string notr="true">Unlimited</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>1</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab_main">
+ <attribute name="title">
+ <string>Transfer list</string>
+ </attribute>
+ <layout class="QHBoxLayout">
+ <item>
+ <layout class="QVBoxLayout">
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="putOnTop">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Move the selected items to the top</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/putOnTop.png</normaloff>:/Themes/Oxygen/resources/putOnTop.png</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="pushUp">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Move up the selected items</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/moveUp.png</normaloff>:/Themes/Oxygen/resources/moveUp.png</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="pushDown">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Move down the selected items</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/moveDown.png</normaloff>:/Themes/Oxygen/resources/moveDown.png</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="putOnBottom">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Move the selected items to the bottom</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/putOnBottom.png</normaloff>:/Themes/Oxygen/resources/putOnBottom.png</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="add">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Add file/folder</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/add.png</normaloff>:/Themes/Oxygen/resources/add.png</iconset>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="del">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Delete the selected items</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/remove.png</normaloff>:/Themes/Oxygen/resources/remove.png</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="searchButton">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Search</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/search.png</normaloff>:/Themes/Oxygen/resources/search.png</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="exportTransferList">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Export the transfer list</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/export-transfer-list.png</normaloff>:/Themes/Oxygen/resources/export-transfer-list.png</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="importTransferList">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Import the transfer list</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/import-transfer-list.png</normaloff>:/Themes/Oxygen/resources/import-transfer-list.png</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <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>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTreeView" name="TransferList">
+ <property name="selectionMode">
+ <enum>QAbstractItemView::ExtendedSelection</enum>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayoutSearch">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLineEdit" name="lineEditSearch"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButtonSearchPrev">
+ <property name="text">
+ <string>Previous</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButtonSearchNext">
+ <property name="text">
+ <string>Next</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButtonCloseSearch">
+ <property name="minimumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/remove.png</normaloff>:/Themes/Oxygen/resources/remove.png</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_error">
+ <attribute name="title">
+ <string>Error</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QToolButton" name="exportErrorToTransferList">
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Export the errors into transfer list</string>
+ </property>
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/export-transfer-list.png</normaloff>:/Themes/Oxygen/resources/export-transfer-list.png</iconset>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </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>
+ <item>
+ <widget class="QTreeWidget" name="errorList">
+ <property name="selectionMode">
+ <enum>QAbstractItemView::NoSelection</enum>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ <property name="uniformRowHeights">
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text">
+ <string>Source</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Destination</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Error</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_interface">
+ <attribute name="title">
+ <string>Interface</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QScrollArea" name="optionsTab">
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>492</width>
+ <height>227</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ <action name="actionAddFile">
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/add.png</normaloff>:/Themes/Oxygen/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add file</string>
+ </property>
+ </action>
+ <action name="actionAddFolder">
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/add.png</normaloff>:/Themes/Oxygen/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Add folder</string>
+ </property>
+ </action>
+ <action name="actionAddFileToMove">
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/add.png</normaloff>:/Themes/Oxygen/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Move file(s)</string>
+ </property>
+ </action>
+ <action name="actionAddFolderToMove">
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/add.png</normaloff>:/Themes/Oxygen/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Move folder</string>
+ </property>
+ </action>
+ <action name="actionAddFileToCopy">
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/add.png</normaloff>:/Themes/Oxygen/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy file(s)</string>
+ </property>
+ </action>
+ <action name="actionAddFolderToCopy">
+ <property name="icon">
+ <iconset resource="interfaceResources.qrc">
+ <normaloff>:/Themes/Oxygen/resources/add.png</normaloff>:/Themes/Oxygen/resources/add.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy folder</string>
+ </property>
+ </action>
+ </widget>
+ <resources>
+ <include location="interfaceResources.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>moreButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>tabWidget</receiver>
+ <slot>setVisible(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>218</x>
+ <y>144</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>149</x>
+ <y>305</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/Themes/Oxygen/interfaceInclude.pri b/plugins/Themes/Oxygen/interfaceInclude.pri
new file mode 100644
index 0000000..5f7317b
--- /dev/null
+++ b/plugins/Themes/Oxygen/interfaceInclude.pri
@@ -0,0 +1,51 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+QT += widgets
+TEMPLATE = lib
+CONFIG += plugin
+HEADERS = \
+ $$PWD/ThemesFactory.h \
+ $$PWD/StructEnumDefinition.h \
+ $$PWD/DebugEngineMacro.h \
+ $$PWD/Environment.h \
+ $$PWD/Variable.h \
+ $$PWD/../../../interface/PluginInterface_Themes.h \
+ $$PWD/../../../interface/FacilityInterface.h \
+ $$PWD/../../../interface/OptionInterface.h \
+ $$PWD/../../../cpp11addition.h \
+ $$PWD/TransferModel.h \
+ $$PWD/interface.h
+SOURCES = \
+ $$PWD/ThemesFactory.cpp \
+ $$PWD/TransferModel.cpp \
+ $$PWD/interface.cpp \
+ $$PWD/../../../cpp11addition.cpp \
+ $$PWD/../../../cpp11additionstringtointcpp.cpp
+TARGET = $$qtLibraryTarget(interface)
+TRANSLATIONS += \
+ $$PWD/Languages/ar/translation.ts \
+ $$PWD/Languages/de/translation.ts \
+ $$PWD/Languages/el/translation.ts \
+ $$PWD/Languages/en/translation.ts \
+ $$PWD/Languages/es/translation.ts \
+ $$PWD/Languages/fr/translation.ts \
+ $$PWD/Languages/hi/translation.ts \
+ $$PWD/Languages/hu/translation.ts \
+ $$PWD/Languages/id/translation.ts \
+ $$PWD/Languages/it/translation.ts \
+ $$PWD/Languages/ja/translation.ts \
+ $$PWD/Languages/ko/translation.ts \
+ $$PWD/Languages/nl/translation.ts \
+ $$PWD/Languages/no/translation.ts \
+ $$PWD/Languages/pl/translation.ts \
+ $$PWD/Languages/pt/translation.ts \
+ $$PWD/Languages/ru/translation.ts \
+ $$PWD/Languages/th/translation.ts \
+ $$PWD/Languages/tr/translation.ts \
+ $$PWD/Languages/zh/translation.ts
+
+FORMS += \
+ $$PWD/interface.ui \
+ $$PWD/themesOptions.ui
diff --git a/plugins/Themes/Oxygen/interfaceResources.qrc b/plugins/Themes/Oxygen/interfaceResources.qrc
new file mode 100644
index 0000000..60060b3
--- /dev/null
+++ b/plugins/Themes/Oxygen/interfaceResources.qrc
@@ -0,0 +1,22 @@
+<RCC>
+ <qresource prefix="/Themes/Oxygen">
+ <file>resources/add.png</file>
+ <file>resources/cancel.png</file>
+ <file>resources/main.png</file>
+ <file>resources/moveDown.png</file>
+ <file>resources/moveUp.png</file>
+ <file>resources/player_end.png</file>
+ <file>resources/player_pause.png</file>
+ <file>resources/player_play.png</file>
+ <file>resources/putOnBottom.png</file>
+ <file>resources/putOnTop.png</file>
+ <file>resources/remove.png</file>
+ <file>resources/search.png</file>
+ <file>resources/export-transfer-list.png</file>
+ <file>resources/import-transfer-list.png</file>
+ <file>resources/SystemTrayIcon/add.png</file>
+ <file>resources/SystemTrayIcon/exit.png</file>
+ <file>resources/SystemTrayIcon/informations.png</file>
+ <file>resources/SystemTrayIcon/options.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins/Themes/Oxygen/interfaceResources_unix.qrc b/plugins/Themes/Oxygen/interfaceResources_unix.qrc
new file mode 100644
index 0000000..27fb1d2
--- /dev/null
+++ b/plugins/Themes/Oxygen/interfaceResources_unix.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Oxygen">
+ <file>resources/SystemTrayIcon/systray_Caught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Unix.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins/Themes/Oxygen/interfaceResources_windows.qrc b/plugins/Themes/Oxygen/interfaceResources_windows.qrc
new file mode 100644
index 0000000..f917ac3
--- /dev/null
+++ b/plugins/Themes/Oxygen/interfaceResources_windows.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Oxygen">
+ <file>resources/SystemTrayIcon/systray_Caught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Windows.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins/Themes/Oxygen/options.ui b/plugins/Themes/Oxygen/options.ui
new file mode 100644
index 0000000..96e4efa
--- /dev/null
+++ b/plugins/Themes/Oxygen/options.ui
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>options</class>
+ <widget class="QWidget" name="options">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>515</width>
+ <height>251</height>
+ </rect>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="4" column="2">
+ <widget class="QFrame" name="frameProgressionColor">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="progressColorWrite">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="progressColorRead">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="progressColorRemaining">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="labelProgressionColor">
+ <property name="text">
+ <string>Progression color</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2">
+ <widget class="QLabel" name="label_SpeedMaxValue">
+ <property name="text">
+ <string notr="true">Unlimited</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QCheckBox" name="checkBox_limitSpeed">
+ <property name="text">
+ <string>Limit copy speed at:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="QSpinBox" name="limitSpeed">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> KB/s</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>999999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QLabel" name="labelSpeedWithProgressBar">
+ <property name="text">
+ <string>Speed with progress bar</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>122</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="9" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="2">
+ <widget class="QComboBox" name="comboBox_copyEnd">
+ <item>
+ <property name="text">
+ <string notr="true">Don't close if errors are found</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Never close</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Always close</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>At the end of the copy: </string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QCheckBox" name="showDualProgression"/>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="label_Slider_speed">
+ <property name="text">
+ <string>Limit copy speed at:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QLabel" name="labelStartWithMoreButtonPushed">
+ <property name="text">
+ <string>Start with the &quot;more button&quot; pushed</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="QSlider" name="SliderSpeed">
+ <property name="maximum">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Show dual progression</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="checkBoxStartWithMoreButtonPushed"/>
+ </item>
+ <item row="2" column="2">
+ <widget class="QCheckBox" name="speedWithProgressBar"/>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="labelShowSpeedAsMain">
+ <property name="text">
+ <string>Show speed as main information</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QCheckBox" name="checkBoxShowSpeed"/>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>checkBox_limitSpeed</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>limitSpeed</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>109</x>
+ <y>144</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>199</x>
+ <y>144</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/Themes/Oxygen/plugin.json b/plugins/Themes/Oxygen/plugin.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins/Themes/Oxygen/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/add.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/add.png
new file mode 100644
index 0000000..7932127
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/add.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/exit.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/exit.png
new file mode 100644
index 0000000..ae3c4e8
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/exit.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/informations.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/informations.png
new file mode 100644
index 0000000..5b7b255
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/informations.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/options.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/options.png
new file mode 100644
index 0000000..23ec531
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/options.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Caught_Unix.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Caught_Unix.png
new file mode 100644
index 0000000..6f5d1cf
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Caught_Unix.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Caught_Windows.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Caught_Windows.png
new file mode 100644
index 0000000..5464856
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Caught_Windows.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
new file mode 100644
index 0000000..b2bb2e3
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
new file mode 100644
index 0000000..0abeb5f
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Uncaught_Unix.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Uncaught_Unix.png
new file mode 100644
index 0000000..5e313b9
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Uncaught_Unix.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Uncaught_Windows.png b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Uncaught_Windows.png
new file mode 100644
index 0000000..828e7e6
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/SystemTrayIcon/systray_Uncaught_Windows.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/add.png b/plugins/Themes/Oxygen/resources/add.png
new file mode 100644
index 0000000..7932127
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/add.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/cancel.png b/plugins/Themes/Oxygen/resources/cancel.png
new file mode 100644
index 0000000..ae3c4e8
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/cancel.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/export-transfer-list.png b/plugins/Themes/Oxygen/resources/export-transfer-list.png
new file mode 100644
index 0000000..3a0aac6
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/export-transfer-list.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/import-transfer-list.png b/plugins/Themes/Oxygen/resources/import-transfer-list.png
new file mode 100644
index 0000000..ee47f0d
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/import-transfer-list.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/main.png b/plugins/Themes/Oxygen/resources/main.png
new file mode 100644
index 0000000..5464856
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/main.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/moveDown.png b/plugins/Themes/Oxygen/resources/moveDown.png
new file mode 100644
index 0000000..82a312c
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/moveDown.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/moveUp.png b/plugins/Themes/Oxygen/resources/moveUp.png
new file mode 100644
index 0000000..7f7ba72
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/moveUp.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/player_end.png b/plugins/Themes/Oxygen/resources/player_end.png
new file mode 100644
index 0000000..18982db
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/player_end.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/player_pause.png b/plugins/Themes/Oxygen/resources/player_pause.png
new file mode 100644
index 0000000..68ee21f
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/player_pause.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/player_play.png b/plugins/Themes/Oxygen/resources/player_play.png
new file mode 100644
index 0000000..a1c5b83
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/player_play.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/putOnBottom.png b/plugins/Themes/Oxygen/resources/putOnBottom.png
new file mode 100644
index 0000000..512286e
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/putOnBottom.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/putOnTop.png b/plugins/Themes/Oxygen/resources/putOnTop.png
new file mode 100644
index 0000000..30fe96b
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/putOnTop.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/remove.png b/plugins/Themes/Oxygen/resources/remove.png
new file mode 100644
index 0000000..b711740
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/remove.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/resources/search.png b/plugins/Themes/Oxygen/resources/search.png
new file mode 100644
index 0000000..cef1836
--- /dev/null
+++ b/plugins/Themes/Oxygen/resources/search.png
Binary files differ
diff --git a/plugins/Themes/Oxygen/themesOptions.ui b/plugins/Themes/Oxygen/themesOptions.ui
new file mode 100644
index 0000000..b3ac73b
--- /dev/null
+++ b/plugins/Themes/Oxygen/themesOptions.ui
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>themesOptions</class>
+ <widget class="QWidget" name="themesOptions">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>519</width>
+ <height>389</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QToolBox" name="toolBox">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>509</width>
+ <height>292</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Use</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelStartWithMoreButtonPushed">
+ <property name="text">
+ <string>Start with the &quot;more button&quot; pushed</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="checkBoxStartWithMoreButtonPushed"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelAlwaysOnTop">
+ <property name="text">
+ <string>Always on top</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Minimize on close to systray</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="minimizeToSystray"/>
+ </item>
+ <item row="4" column="1" colspan="2">
+ <widget class="QComboBox" name="comboBox_copyEnd">
+ <item>
+ <property name="text">
+ <string notr="true">Don't close if errors are found</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Never close</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string notr="true">Always close</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>At the end of the copy</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_Slider_speed">
+ <property name="text">
+ <string>Limit copy speed to</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QSlider" name="SliderSpeed">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_SpeedMaxValue">
+ <property name="text">
+ <string notr="true">Unlimited</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="6" column="0">
+ <widget class="QCheckBox" name="checkBox_limitSpeed">
+ <property name="text">
+ <string>Limit copy speed to</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1" colspan="2">
+ <widget class="QSpinBox" name="limitSpeed">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> KB/s</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>999999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2">
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>133</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1" colspan="2">
+ <widget class="QCheckBox" name="alwaysOnTop"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_startMinimized">
+ <property name="text">
+ <string>Start minimized</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QCheckBox" name="startMinimized">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_2">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>509</width>
+ <height>292</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Informations</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelShowSpeedAsMain">
+ <property name="text">
+ <string>Show speed as main information</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="checkBoxShowSpeed"/>
+ </item>
+ <item row="1" column="2">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>529</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_3">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>509</width>
+ <height>292</height>
+ </rect>
+ </property>
+ <attribute name="label">
+ <string>Display</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelSpeedWithProgressBar">
+ <property name="text">
+ <string>Speed with progress bar</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="speedWithProgressBar"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="labelDualProgression">
+ <property name="text">
+ <string>Show dual progression</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="showDualProgression"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Show progression in the title</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="showProgressionInTheTitle"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="labelProgressionColor">
+ <property name="text">
+ <string>Progression color</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QFrame" name="frameProgressionColor">
+ <property name="minimumSize">
+ <size>
+ <width>225</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>225</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Click to edit the color</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="progressColorWrite">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="progressColorRead">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="progressColorRemaining">
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>75</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>455</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>checkBox_limitSpeed</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>limitSpeed</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>109</x>
+ <y>144</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>199</x>
+ <y>144</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/Themes/Supercopier/informations.xml b/plugins/Themes/Supercopier/informations.xml
new file mode 100644
index 0000000..d5cb35e
--- /dev/null
+++ b/plugins/Themes/Supercopier/informations.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Supercopier style for Ultracopier]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Style supercopier pour Ultracopier]]></title>
+ <!-- What kind of plugin this is -->
+ <category>Themes</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[Supercopier style for Ultracopier]]></description>
+ <description xml:lang="fr"><![CDATA[Style supercopier pour Ultracopier]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Supercopier</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package>
diff --git a/plugins/Themes/Supercopier/interface.pro b/plugins/Themes/Supercopier/interface.pro
new file mode 100644
index 0000000..1b0ef2e
--- /dev/null
+++ b/plugins/Themes/Supercopier/interface.pro
@@ -0,0 +1,10 @@
+DEFINES+=SUPERCOPIER
+
+include($$PWD/../Oxygen/interfaceInclude.pri)
+
+!CONFIG(static) {
+RESOURCES += \
+ $$PWD/../Supercopier/interfaceResources.qrc \
+ $$PWD/../Supercopier/interfaceResources_unix.qrc \
+ $$PWD/../Supercopier/interfaceResources_windows.qrc
+}
diff --git a/plugins/Themes/Supercopier/interfaceResources.qrc b/plugins/Themes/Supercopier/interfaceResources.qrc
new file mode 100644
index 0000000..d8990aa
--- /dev/null
+++ b/plugins/Themes/Supercopier/interfaceResources.qrc
@@ -0,0 +1,24 @@
+<RCC>
+ <qresource prefix="/Themes/Supercopier">
+ <file>resources/add.png</file>
+ <file>resources/cancel.png</file>
+ <file>resources/main.png</file>
+ <file>resources/moveDown.png</file>
+ <file>resources/moveUp.png</file>
+ <file>resources/player_end.png</file>
+ <file>resources/player_pause.png</file>
+ <file>resources/player_play.png</file>
+ <file>resources/putOnBottom.png</file>
+ <file>resources/putOnTop.png</file>
+ <file>resources/remove.png</file>
+ <file>resources/search.png</file>
+ <file>resources/export-transfer-list.png</file>
+ <file>resources/import-transfer-list.png</file>
+ <file>resources/SystemTrayIcon/add.png</file>
+ <file>resources/SystemTrayIcon/exit.png</file>
+ <file>resources/SystemTrayIcon/informations.png</file>
+ <file>resources/SystemTrayIcon/options.png</file>
+ <file>resources/progressbarleft.png</file>
+ <file>resources/progressbarright.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins/Themes/Supercopier/interfaceResources_unix.qrc b/plugins/Themes/Supercopier/interfaceResources_unix.qrc
new file mode 100644
index 0000000..2cf979f
--- /dev/null
+++ b/plugins/Themes/Supercopier/interfaceResources_unix.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Supercopier">
+ <file>resources/SystemTrayIcon/systray_Caught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Unix.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Unix.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins/Themes/Supercopier/interfaceResources_windows.qrc b/plugins/Themes/Supercopier/interfaceResources_windows.qrc
new file mode 100644
index 0000000..abbedba
--- /dev/null
+++ b/plugins/Themes/Supercopier/interfaceResources_windows.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/Themes/Supercopier">
+ <file>resources/SystemTrayIcon/systray_Caught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Semiuncaught_Windows.png</file>
+ <file>resources/SystemTrayIcon/systray_Uncaught_Windows.png</file>
+ </qresource>
+</RCC>
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/add.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/add.png
new file mode 100644
index 0000000..d41fce6
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/add.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/exit.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/exit.png
new file mode 100644
index 0000000..9599bba
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/exit.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/informations.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/informations.png
new file mode 100644
index 0000000..86c9ba6
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/informations.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/options.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/options.png
new file mode 100644
index 0000000..cf699d5
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/options.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Caught_Unix.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Caught_Unix.png
new file mode 100644
index 0000000..be2ba20
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Caught_Unix.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Caught_Windows.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Caught_Windows.png
new file mode 100644
index 0000000..9c597af
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Caught_Windows.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
new file mode 100644
index 0000000..be2ba20
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Semiuncaught_Unix.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
new file mode 100644
index 0000000..9c597af
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Semiuncaught_Windows.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Uncaught_Unix.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Uncaught_Unix.png
new file mode 100644
index 0000000..4da8cc0
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Uncaught_Unix.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Uncaught_Windows.png b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Uncaught_Windows.png
new file mode 100644
index 0000000..8bfbcf9
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/SystemTrayIcon/systray_Uncaught_Windows.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/add.png b/plugins/Themes/Supercopier/resources/add.png
new file mode 100644
index 0000000..af8a401
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/add.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/cancel.png b/plugins/Themes/Supercopier/resources/cancel.png
new file mode 100644
index 0000000..1e7579c
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/cancel.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/export-transfer-list.png b/plugins/Themes/Supercopier/resources/export-transfer-list.png
new file mode 100644
index 0000000..2bcc455
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/export-transfer-list.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/import-transfer-list.png b/plugins/Themes/Supercopier/resources/import-transfer-list.png
new file mode 100644
index 0000000..d208342
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/import-transfer-list.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/main.png b/plugins/Themes/Supercopier/resources/main.png
new file mode 100644
index 0000000..9bec399
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/main.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/moveDown.png b/plugins/Themes/Supercopier/resources/moveDown.png
new file mode 100644
index 0000000..7f4ff27
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/moveDown.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/moveUp.png b/plugins/Themes/Supercopier/resources/moveUp.png
new file mode 100644
index 0000000..9397b76
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/moveUp.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/player_end.png b/plugins/Themes/Supercopier/resources/player_end.png
new file mode 100644
index 0000000..9730302
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/player_end.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/player_pause.png b/plugins/Themes/Supercopier/resources/player_pause.png
new file mode 100644
index 0000000..429ae43
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/player_pause.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/player_play.png b/plugins/Themes/Supercopier/resources/player_play.png
new file mode 100644
index 0000000..a28ac73
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/player_play.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/progressbarleft.png b/plugins/Themes/Supercopier/resources/progressbarleft.png
new file mode 100644
index 0000000..bbee9c8
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/progressbarleft.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/progressbarright.png b/plugins/Themes/Supercopier/resources/progressbarright.png
new file mode 100644
index 0000000..93e5781
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/progressbarright.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/putOnBottom.png b/plugins/Themes/Supercopier/resources/putOnBottom.png
new file mode 100644
index 0000000..9ac517c
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/putOnBottom.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/putOnTop.png b/plugins/Themes/Supercopier/resources/putOnTop.png
new file mode 100644
index 0000000..5682829
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/putOnTop.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/remove.png b/plugins/Themes/Supercopier/resources/remove.png
new file mode 100644
index 0000000..3a2a9f1
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/remove.png
Binary files differ
diff --git a/plugins/Themes/Supercopier/resources/search.png b/plugins/Themes/Supercopier/resources/search.png
new file mode 100644
index 0000000..567f498
--- /dev/null
+++ b/plugins/Themes/Supercopier/resources/search.png
Binary files differ
diff --git a/plugins/static-plugins-oxygen.qrc b/plugins/static-plugins-oxygen.qrc
new file mode 100644
index 0000000..21b4be0
--- /dev/null
+++ b/plugins/static-plugins-oxygen.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/">
+ <file>Themes/Oxygen/informations.xml</file>
+ <file>Themes/Oxygen/Languages/fr/translation.qm</file>
+ </qresource>
+</RCC>
diff --git a/plugins/static-plugins-windows.qrc b/plugins/static-plugins-windows.qrc
new file mode 100644
index 0000000..6ddcdc0
--- /dev/null
+++ b/plugins/static-plugins-windows.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/">
+ <file>PluginLoader/catchcopy-v0002/informations.xml</file>
+ <file>PluginLoader/catchcopy-v0002/Languages/fr/translation.qm</file>
+ </qresource>
+</RCC>
diff --git a/plugins/static-plugins.qrc b/plugins/static-plugins.qrc
new file mode 100644
index 0000000..b250e7c
--- /dev/null
+++ b/plugins/static-plugins.qrc
@@ -0,0 +1,12 @@
+<RCC>
+ <qresource prefix="/">
+ <file>CopyEngine/Ultracopier/informations.xml</file>
+ <file>CopyEngine/Ultracopier/Languages/fr/translation.qm</file>
+ <file>Languages/fr/informations.xml</file>
+ <file>Languages/fr/flag.png</file>
+ <file>Languages/fr/translation.qm</file>
+ <file>Listener/catchcopy-v0002/informations.xml</file>
+ <file>Themes/Oxygen/informations.xml</file>
+ <file>Themes/Oxygen/Languages/fr/translation.qm</file>
+ </qresource>
+</RCC>
diff --git a/resources/Languages/en/flag.png b/resources/Languages/en/flag.png
new file mode 100644
index 0000000..b662ab4
--- /dev/null
+++ b/resources/Languages/en/flag.png
Binary files differ
diff --git a/resources/Languages/en/informations.xml b/resources/Languages/en/informations.xml
new file mode 100644
index 0000000..8b998f0
--- /dev/null
+++ b/resources/Languages/en/informations.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[English language]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>Languages</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[File to define all English language related, Ultracopier is written in English, then not translation file needed]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>1.4.0.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>en</name>
+ <dependencies><![CDATA[
+ ]]></dependencies>
+ <!-- Additional information that is specific to the category (in this case Language). -->
+ <categorySpecific>
+ <!-- The full name in the language we're translating to. -->
+ <fullName><![CDATA[English]]></fullName>
+ <!-- No short name, for do translation not found and leave un-translated -->
+ <!-- Short name, language ISO code -->
+ <shortName mainCode="true"><![CDATA[en]]></shortName>
+ <shortName><![CDATA[C]]></shortName>
+ </categorySpecific>
+</package> \ No newline at end of file
diff --git a/resources/Languages/en/translation.ts b/resources/Languages/en/translation.ts
new file mode 100644
index 0000000..604c4dd
--- /dev/null
+++ b/resources/Languages/en/translation.ts
@@ -0,0 +1,1256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en">
+<context>
+ <name>CliParser</name>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <location filename="../../../CliParser.cpp" line="180"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="26"/>
+ <source>Ultracopier is already running, right click on its system tray icon (near the clock) to use it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="72"/>
+ <source>Problem reading file, or file size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="160"/>
+ <location filename="../../../CliParser.cpp" line="171"/>
+ <source>The arguments possible are:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="162"/>
+ <location filename="../../../CliParser.cpp" line="173"/>
+ <source>To display the options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="163"/>
+ <location filename="../../../CliParser.cpp" line="174"/>
+ <source>To quit the other instances (if running)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="165"/>
+ <location filename="../../../CliParser.cpp" line="176"/>
+ <source>To copy sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="166"/>
+ <location filename="../../../CliParser.cpp" line="177"/>
+ <source>To move sources to destination, separated by space. If destination is &quot;?&quot;, ultracopier will ask the user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="170"/>
+ <source>Command not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="85"/>
+ <source>This file is not supported transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="95"/>
+ <source>Unable to open the transfer list file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="161"/>
+ <location filename="../../../CliParser.cpp" line="172"/>
+ <source>To display this help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="164"/>
+ <location filename="../../../CliParser.cpp" line="175"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CliParser.cpp" line="182"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineManager</name>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="231"/>
+ <source>Cannot find any copy engine with move support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="259"/>
+ <source>This copy engine does not support move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="236"/>
+ <source>Cannot find any compatible engine!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyEngineManager.cpp" line="273"/>
+ <source>Cannot find any engine with this name: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyListener</name>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../CopyListener.cpp" line="159"/>
+ <source>Error during the reception of the copy/move list
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Core</name>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="117"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <location filename="../../../Core.cpp" line="217"/>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="46"/>
+ <location filename="../../../Core.cpp" line="143"/>
+ <location filename="../../../Core.cpp" line="158"/>
+ <location filename="../../../Core.cpp" line="178"/>
+ <location filename="../../../Core.cpp" line="192"/>
+ <location filename="../../../Core.cpp" line="201"/>
+ <location filename="../../../Core.cpp" line="210"/>
+ <source>Unable to get a copy engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Group window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="94"/>
+ <source>Do you want group the transfer with another actual running transfer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="117"/>
+ <source>Unable to get a engine instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="217"/>
+ <source>The argument for the mode is not valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Do you want to copy? If no, it will be moved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="251"/>
+ <location filename="../../../Core.cpp" line="388"/>
+ <source>Unable to load the interface, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="393"/>
+ <source>Unable to load the copy engine, copy aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../Core.cpp" line="1136"/>
+ <source>Transfer mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EventDispatcher</name>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Key</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../EventDispatcher.cpp" line="152"/>
+ <source>Give the key of this software, more information on &lt;a href=&quot;http://ultracopier.first-world.info/&quot;&gt;ultracopier.first-world.info&lt;/a&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FacilityEngine</name>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="37"/>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="38"/>
+ <source>Too big</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="39"/>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="40"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="41"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="42"/>
+ <source>GB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="43"/>
+ <source>TB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="44"/>
+ <source>PB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="45"/>
+ <source>EB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="46"/>
+ <source>ZB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="47"/>
+ <source>YB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="48"/>
+ <source>Less than %10 seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="49"/>
+ <source>About %10 seconds remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="50"/>
+ <source>About %1 minutes remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="51"/>
+ <source>About %1 hours remaining</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="53"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="55"/>
+ <source>Copy</source>
+ <extracomment>a copy</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="57"/>
+ <source>Transfer</source>
+ <extracomment>a transfer</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="59"/>
+ <source>Move</source>
+ <extracomment>a move</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="60"/>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="61"/>
+ <source>Pause</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="62"/>
+ <source>Resume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="63"/>
+ <location filename="../../../FacilityEngine.cpp" line="77"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="64"/>
+ <source>Unlimited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="65"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="66"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="67"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="68"/>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="69"/>
+ <source>Target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="70"/>
+ <location filename="../../../FacilityEngine.cpp" line="74"/>
+ <source>Time remaining:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="71"/>
+ <source>Listing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="72"/>
+ <source>Copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="73"/>
+ <source>Listing and copying</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="76"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="78"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="79"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="80"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="81"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="82"/>
+ <source>Put to the end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="83"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="84"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="85"/>
+ <source>Internal error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="86"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="87"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="88"/>
+ <source>Save transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="89"/>
+ <source>Open transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="90"/>
+ <source>Transfer list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="91"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="92"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../FacilityEngine.cpp" line="93"/>
+ <source>Completed in %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpDialog</name>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="34"/>
+ <source>About Ultracopier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="67"/>
+ <source>Based on Qt. Advanced utility to copy files under GPL3 license.
+This version is compiled as version: %1.</source>
+ <extracomment>%1 will be replaced by a variable content (normal, debug, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="75"/>
+ <source>&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;</source>
+ <extracomment>%1 will be remplaced by the website into the corresponding languages</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="85"/>
+ <source>Platform: %1</source>
+ <extracomment>%1 will be replaced by the platform (windows, mac, linux, ...)</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="121"/>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="141"/>
+ <source>Do a crash</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="148"/>
+ <source>Save bug report</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.ui" line="155"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="73"/>
+ <source>For http://portableapps.com/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="76"/>
+ <source>Portable and all in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="78"/>
+ <source>Portable version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="83"/>
+ <source>All in one version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="85"/>
+ <source>Normal version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="102"/>
+ <source>http://ultracopier.first-world.info/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="109"/>
+ <source>http://ultracopier.first-world.info/shop.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../HelpDialog.cpp" line="111"/>
+ <source>http://ultracopier.first-world.info/download.html</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LocalListener</name>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LocalListener.cpp" line="160"/>
+ <source>Timeout while recomposing data from connected clients</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogThread</name>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="107"/>
+ <source>Log file already open, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../LogThread.cpp" line="116"/>
+ <location filename="../../../LogThread.cpp" line="126"/>
+ <source>Unable to open the log file, error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OSSpecific</name>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="26"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="58"/>
+ <source>Don&apos;t show again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.ui" line="83"/>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="23"/>
+ <source>The replacement of default copy/move system is not supported by the file manager (Dolphin, Nautilus, ...).&lt;br /&gt;Ask the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="25"/>
+ <source>Reboot the system if previously had similar software installed (like Teracopy, Supercopier or an earlier version of Ultracopier).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="27"/>
+ <source>The replacement of default copy/move system is not supported and blocked by finder of Mac OS X.&lt;br /&gt;You need do the copy/move manually by right clicking on the system tray icon near the clock (not the dock icon).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OSSpecific.cpp" line="29"/>
+ <source>The replacement of default copy/move system should be not supported by the file manager.&lt;br /&gt;Ask to the developer to support it.&lt;br /&gt;You need do the copy/move manually.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionDialog</name>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="14"/>
+ <location filename="../../../OptionDialog.ui" line="51"/>
+ <source>Options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="56"/>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="61"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="66"/>
+ <location filename="../../../OptionDialog.ui" line="322"/>
+ <location filename="../../../OptionDialog.cpp" line="286"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="71"/>
+ <location filename="../../../OptionDialog.ui" line="335"/>
+ <location filename="../../../OptionDialog.cpp" line="287"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="76"/>
+ <location filename="../../../OptionDialog.ui" line="340"/>
+ <location filename="../../../OptionDialog.cpp" line="288"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="84"/>
+ <location filename="../../../OptionDialog.ui" line="345"/>
+ <location filename="../../../OptionDialog.cpp" line="289"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="92"/>
+ <location filename="../../../OptionDialog.ui" line="350"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="97"/>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="222"/>
+ <source>Confirm to group the windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="245"/>
+ <source>Check for updates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="255"/>
+ <source>Give GPU time to fund the development</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="728"/>
+ <source>Write directly to the file when it receive a new entry (can produce 50% of lost of performance)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="312"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="117"/>
+ <source>Force the language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="127"/>
+ <source>Replace the default copy and move system</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="141"/>
+ <source>Load at the session loading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="155"/>
+ <source>When manual open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="181"/>
+ <source>Group the windows when</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="229"/>
+ <source>Display the OS warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="262"/>
+ <source>Remaining time algorithm</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="270"/>
+ <source>Traditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="275"/>
+ <source>Logarithmic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="317"/>
+ <source>Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="327"/>
+ <source>Language</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="358"/>
+ <source>Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="377"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="390"/>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="400"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="427"/>
+ <source>Copy engine by order of preference:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="498"/>
+ <source>Client connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="554"/>
+ <source>Themes:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="616"/>
+ <source>Unable to load the themes plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="666"/>
+ <source>No option for this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="697"/>
+ <source>Write the log file into:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="716"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="731"/>
+ <source>Synchronized log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="741"/>
+ <source>Write the transfers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="771"/>
+ <source>Write the errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="801"/>
+ <source>Write the folder operations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="748"/>
+ <source>The variables are %time%, %source%, %size%, %destination%</source>
+ <extracomment>%time%, %source%, %size%, %destination% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="778"/>
+ <source>The variables are %time%, %path%, %size%, %mtime%, %error%</source>
+ <extracomment>%time%, %path%, %size%, %mtime%, %error% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.ui" line="811"/>
+ <source>The variables are %path%, %operation%</source>
+ <extracomment>%path%, %operation% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="190"/>
+ <source>Load the theme?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="204"/>
+ <source>Load the language?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="294"/>
+ <source>Do nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="295"/>
+ <source>Ask source as folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="296"/>
+ <source>Ask sources as files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="297"/>
+ <source>Never</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="298"/>
+ <source>When source is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="299"/>
+ <source>When destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="300"/>
+ <source>When source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="301"/>
+ <source>When source or destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="302"/>
+ <source>Always</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="316"/>
+ <location filename="../../../OptionDialog.cpp" line="317"/>
+ <location filename="../../../OptionDialog.cpp" line="318"/>
+ <source>The variables are %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../OptionDialog.cpp" line="948"/>
+ <source>Save logs as: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OptionEngine</name>
+ <message>
+ <location filename="../../../OptionEngine.cpp" line="162"/>
+ <location filename="../../../OptionEngine.cpp" line="169"/>
+ <location filename="../../../OptionEngine.cpp" line="211"/>
+ <location filename="../../../OptionEngine.cpp" line="215"/>
+ <source>The variable was not found: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginInformation</name>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="14"/>
+ <source>About this plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="23"/>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="37"/>
+ <source>Category:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="51"/>
+ <source>Author:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="65"/>
+ <source>Website:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="79"/>
+ <source>Date:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="93"/>
+ <source>Description:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="107"/>
+ <source>Version:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.ui" line="121"/>
+ <source>Title:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="39"/>
+ <source>Copy engine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="42"/>
+ <source>Languages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="45"/>
+ <source>Listener</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="48"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="51"/>
+ <source>Session loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="54"/>
+ <source>Themes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="58"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginInformation.cpp" line="68"/>
+ <source>Information about %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginsManager</name>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="224"/>
+ <source>informations.xml is not accessible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="256"/>
+ <source>%1, parse error at line %2, column %3: %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="264"/>
+ <source>&quot;package&quot; root tag not found for the xml file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="340"/>
+ <source>Duplicated plugin found, already loaded!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="230"/>
+ <source>informations.xml not found for the plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="401"/>
+ <source>English text missing in the informations.xml for the tag: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="409"/>
+ <source>Tag not found: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="494"/>
+ <source>Dependencies part is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="515"/>
+ <source>Dependencies %1 are not satisfied, for plugin: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Remove %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="672"/>
+ <source>Are you sure about removing &quot;%1&quot; in version %2?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="683"/>
+ <source>Error while the removing plugin, please check the rights on the folder:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="707"/>
+ <source>Previous import is in progress...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Open Ultracopier plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="710"/>
+ <source>Ultracopier plugin (*.urc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Plugin loader</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="727"/>
+ <source>Unable to open the plugin: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="752"/>
+ <location filename="../../../PluginsManager.cpp" line="870"/>
+ <location filename="../../../PluginsManager.cpp" line="883"/>
+ <source>Unable to load the plugin content, please check it: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="820"/>
+ <source>Unable to create a folder to install the plugin:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="833"/>
+ <source>Unable to create a file to install the plugin:
+%1
+since:%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="852"/>
+ <source>Folder with same name is present, skip the plugin installation:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../PluginsManager.cpp" line="858"/>
+ <location filename="../../../PluginsManager.cpp" line="864"/>
+ <location filename="../../../PluginsManager.cpp" line="876"/>
+ <source>Unable to load the plugin content, please check it</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QXzDecode</name>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="38"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="93"/>
+ <source>Memory allocation failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="64"/>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="82"/>
+ <source>Write error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="97"/>
+ <source>Memory usage limit reached</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="101"/>
+ <source>Not a .xz file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="105"/>
+ <source>Unsupported options in the .xz headers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="110"/>
+ <source>The file is corrupted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="114"/>
+ <source>Bug!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../lib/qt-tar-xz/QXzDecode.cpp" line="124"/>
+ <source>The input data is too short</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SystrayIcon</name>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="155"/>
+ <source>No copy listener found. Do the copy manually by right click one the system tray icon.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="161"/>
+ <source>Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="179"/>
+ <source>Searching information...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="192"/>
+ <source>Do not replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="197"/>
+ <source>Semi replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../../SystrayIcon.cpp" line="202"/>
+ <source>Replace the explorer copy/move</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/resources/bug-128x128.png b/resources/bug-128x128.png
new file mode 100644
index 0000000..1329a1c
--- /dev/null
+++ b/resources/bug-128x128.png
Binary files differ
diff --git a/resources/img-src/application-exit.svgz b/resources/img-src/application-exit.svgz
new file mode 100644
index 0000000..0ffd56b
--- /dev/null
+++ b/resources/img-src/application-exit.svgz
Binary files differ
diff --git a/resources/img-src/applications-development.svgz b/resources/img-src/applications-development.svgz
new file mode 100644
index 0000000..89ab237
--- /dev/null
+++ b/resources/img-src/applications-development.svgz
Binary files differ
diff --git a/resources/img-src/arrow-down-double.svgz b/resources/img-src/arrow-down-double.svgz
new file mode 100644
index 0000000..e6fa6ff
--- /dev/null
+++ b/resources/img-src/arrow-down-double.svgz
Binary files differ
diff --git a/resources/img-src/arrow-down.svgz b/resources/img-src/arrow-down.svgz
new file mode 100644
index 0000000..1ea40d8
--- /dev/null
+++ b/resources/img-src/arrow-down.svgz
Binary files differ
diff --git a/resources/img-src/arrow-up-double.svgz b/resources/img-src/arrow-up-double.svgz
new file mode 100644
index 0000000..e2c774f
--- /dev/null
+++ b/resources/img-src/arrow-up-double.svgz
Binary files differ
diff --git a/resources/img-src/arrow-up.svgz b/resources/img-src/arrow-up.svgz
new file mode 100644
index 0000000..9cf1426
--- /dev/null
+++ b/resources/img-src/arrow-up.svgz
Binary files differ
diff --git a/resources/img-src/checkbox.svgz b/resources/img-src/checkbox.svgz
new file mode 100644
index 0000000..688081a
--- /dev/null
+++ b/resources/img-src/checkbox.svgz
Binary files differ
diff --git a/resources/img-src/document-encrypt.svgz b/resources/img-src/document-encrypt.svgz
new file mode 100644
index 0000000..55af667
--- /dev/null
+++ b/resources/img-src/document-encrypt.svgz
Binary files differ
diff --git a/resources/img-src/document-preview.svgz b/resources/img-src/document-preview.svgz
new file mode 100644
index 0000000..07fbe1c
--- /dev/null
+++ b/resources/img-src/document-preview.svgz
Binary files differ
diff --git a/resources/img-src/document-save_16.svgz b/resources/img-src/document-save_16.svgz
new file mode 100644
index 0000000..bab828f
--- /dev/null
+++ b/resources/img-src/document-save_16.svgz
Binary files differ
diff --git a/resources/img-src/document-save_22.svgz b/resources/img-src/document-save_22.svgz
new file mode 100644
index 0000000..e21b700
--- /dev/null
+++ b/resources/img-src/document-save_22.svgz
Binary files differ
diff --git a/resources/img-src/drive-removable-media-usb.svgz b/resources/img-src/drive-removable-media-usb.svgz
new file mode 100644
index 0000000..1a8ae23
--- /dev/null
+++ b/resources/img-src/drive-removable-media-usb.svgz
Binary files differ
diff --git a/resources/img-src/help-about.svgz b/resources/img-src/help-about.svgz
new file mode 100644
index 0000000..c00347b
--- /dev/null
+++ b/resources/img-src/help-about.svgz
Binary files differ
diff --git a/resources/img-src/kbugbuster.svgz b/resources/img-src/kbugbuster.svgz
new file mode 100644
index 0000000..29ca525
--- /dev/null
+++ b/resources/img-src/kbugbuster.svgz
Binary files differ
diff --git a/resources/img-src/list-add.svgz b/resources/img-src/list-add.svgz
new file mode 100644
index 0000000..3a85a24
--- /dev/null
+++ b/resources/img-src/list-add.svgz
Binary files differ
diff --git a/resources/img-src/media-playback-pause.svgz b/resources/img-src/media-playback-pause.svgz
new file mode 100644
index 0000000..58b9113
--- /dev/null
+++ b/resources/img-src/media-playback-pause.svgz
Binary files differ
diff --git a/resources/img-src/media-playback-start.svgz b/resources/img-src/media-playback-start.svgz
new file mode 100644
index 0000000..74fb624
--- /dev/null
+++ b/resources/img-src/media-playback-start.svgz
Binary files differ
diff --git a/resources/img-src/media-skip-forward.svgz b/resources/img-src/media-skip-forward.svgz
new file mode 100644
index 0000000..1558a93
--- /dev/null
+++ b/resources/img-src/media-skip-forward.svgz
Binary files differ
diff --git a/resources/img-src/process-stop.svgz b/resources/img-src/process-stop.svgz
new file mode 100644
index 0000000..62d5706
--- /dev/null
+++ b/resources/img-src/process-stop.svgz
Binary files differ
diff --git a/resources/img-src/system-shutdown.svgz b/resources/img-src/system-shutdown.svgz
new file mode 100644
index 0000000..b4abcc2
--- /dev/null
+++ b/resources/img-src/system-shutdown.svgz
Binary files differ
diff --git a/resources/img-src/text-formatting.svg b/resources/img-src/text-formatting.svg
new file mode 100644
index 0000000..f471aa4
--- /dev/null
+++ b/resources/img-src/text-formatting.svg
@@ -0,0 +1,11924 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1035"
+ height="672"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46+devel"
+ version="1.0"
+ sodipodi:docname="text-formatting.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/djm/text-ico.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ style="display:inline">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4372">
+ <stop
+ style="stop-color:#0066ff;stop-opacity:1;"
+ offset="0"
+ id="stop4374" />
+ <stop
+ style="stop-color:#80b3ff;stop-opacity:1"
+ offset="1"
+ id="stop4376" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5273">
+ <stop
+ style="stop-color:#eaf3de;stop-opacity:1;"
+ offset="0"
+ id="stop5275" />
+ <stop
+ style="stop-color:#eaf3de;stop-opacity:0;"
+ offset="1"
+ id="stop5277" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5161">
+ <stop
+ id="stop5163"
+ offset="0"
+ style="stop-color:#f7a5a0;stop-opacity:1" />
+ <stop
+ id="stop5165"
+ offset="1"
+ style="stop-color:#cd1f00;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4836">
+ <stop
+ style="stop-color:#929ea2;stop-opacity:1;"
+ offset="0"
+ id="stop4838" />
+ <stop
+ id="stop4942"
+ offset="0.5"
+ style="stop-color:#475154;stop-opacity:1;" />
+ <stop
+ style="stop-color:#717f84;stop-opacity:1;"
+ offset="1"
+ id="stop4840" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4698">
+ <stop
+ style="stop-color:#9ba6aa;stop-opacity:1;"
+ offset="0"
+ id="stop4700" />
+ <stop
+ id="stop4706"
+ offset="0.5"
+ style="stop-color:#606c71;stop-opacity:1;" />
+ <stop
+ style="stop-color:#c6cdcf;stop-opacity:1;"
+ offset="1"
+ id="stop4702" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4118">
+ <stop
+ id="stop4120"
+ offset="0"
+ style="stop-color:#e0f4b8;stop-opacity:1" />
+ <stop
+ id="stop4122"
+ offset="1"
+ style="stop-color:#92c441;stop-opacity:0.21459228" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4112">
+ <stop
+ id="stop4114"
+ offset="0"
+ style="stop-color:#bbf10e;stop-opacity:1" />
+ <stop
+ id="stop4116"
+ offset="1"
+ style="stop-color:#5f9207;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4105">
+ <stop
+ id="stop4107"
+ offset="0"
+ style="stop-color:#033a13;stop-opacity:1" />
+ <stop
+ id="stop4109"
+ offset="1"
+ style="stop-color:#398c37;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3783">
+ <stop
+ style="stop-color:#ffbfbf;stop-opacity:1;"
+ offset="0"
+ id="stop3785" />
+ <stop
+ style="stop-color:#ffbfbf;stop-opacity:0;"
+ offset="1"
+ id="stop3787" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3773">
+ <stop
+ style="stop-color:#590000;stop-opacity:1"
+ offset="0"
+ id="stop3775" />
+ <stop
+ style="stop-color:#bf0000;stop-opacity:1"
+ offset="1"
+ id="stop3777" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3763">
+ <stop
+ style="stop-color:#ff2222;stop-opacity:1;"
+ offset="0"
+ id="stop3765" />
+ <stop
+ style="stop-color:#cd1f00;stop-opacity:1;"
+ offset="1"
+ id="stop3767" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3249">
+ <stop
+ id="stop3251"
+ offset="0"
+ style="stop-color:#fcfcfc;stop-opacity:1" />
+ <stop
+ id="stop3253"
+ offset="1"
+ style="stop-color:#e0e0e0;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3228">
+ <stop
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="0"
+ id="stop3230" />
+ <stop
+ style="stop-color:#969696;stop-opacity:1;"
+ offset="1"
+ id="stop3232" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3200">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop3202" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3204" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4011"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4013"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4019"
+ gradientUnits="userSpaceOnUse"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201"
+ gradientTransform="matrix(0.6363636,0,0,1,147.63636,5)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4021"
+ gradientUnits="userSpaceOnUse"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649"
+ gradientTransform="matrix(0.6363636,0,0,1,147.63636,5)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4027"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,73.818182,10)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4029"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,73.818182,10)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4043"
+ gradientUnits="userSpaceOnUse"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201"
+ gradientTransform="matrix(1.3636364,0,0,1,-126.63637,-5)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4045"
+ gradientUnits="userSpaceOnUse"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649"
+ gradientTransform="matrix(1.3636364,0,0,1,-126.63636,-5)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4047"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0000028,0,0,1,20.998851,0)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4049"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(20.999994,0)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4051"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818181,0,0,1,-52.818188,10)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4053"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,1,-52.818182,10)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4059"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363637,0,0,1,168.63637,5)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4061"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363636,0,0,1,168.63636,5)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4079"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0991736,0,0,2,-398.26447,-217)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4081"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0909092,0,0,2,-394.90908,-217)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4099"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363636,0,0,2,-210.36363,-210)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4101"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,-210.36363,-210)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4111"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,2,-25.818188,-203)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4113"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,2,-25.818176,-203)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4115"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9008264,0,0,2,-317.73553,-196)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4117"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.909091,0,0,2,-321.0909,-196)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2934"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090908,0,0,3,-687.09087,-431)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2936"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-687.09089,-431)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2954"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.2727244,0,0,3,-428.72609,-422)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2956"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.2727274,0,0,3,-428.72726,-422)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2962"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8181817,0,0,3,-244.18179,-413)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2964"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8181819,0,0,3,-244.18181,-413)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2970"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7159091,0,0,3,-608.65909,-404)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2972"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-613.27271,-404)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3118"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-609.52271,-324)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3120"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7159091,0,0,3,-604.78412,-324)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3122"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8181819,0,0,3,-230.43181,-333)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3124"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8181817,0,0,3,-230.43179,-333)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3126"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.2727274,0,0,3,-419.97726,-342)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3128"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.2727244,0,0,3,-419.97609,-342)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3130"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-685.34089,-351)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3132"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090908,0,0,3,-685.34087,-351)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3134"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.909091,0,0,2,-316.0909,-116)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3136"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9008264,0,0,2,-312.55371,-116)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3138"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,2,-12.818176,-123)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3140"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,2,-12.727278,-123)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3142"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,-202.36363,-130)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3144"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363636,0,0,2,-202.27272,-130)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3146"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0909092,0,0,2,-391.90908,-137)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3148"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0991736,0,0,2,-395.26447,-137)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3150"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,1,-47.818182,90)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3152"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818181,0,0,1,-47.818157,90)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3154"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363636,0,0,1,179.63636,85)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3156"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363637,0,0,1,179.63634,85)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3158"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(27.999994,80)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3160"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0000028,0,0,1,27.998881,80)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3162"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636364,0,0,1,-123.63636,75)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3164"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636364,0,0,1,-123.63637,75)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3166"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,78.818182,90)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3168"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,78.818182,90)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3170"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363636,0,0,1,154.63636,85)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3172"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363636,0,0,1,154.63639,85)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3174"
+ gradientUnits="userSpaceOnUse"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649"
+ gradientTransform="translate(3,80)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3176"
+ gradientUnits="userSpaceOnUse"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201"
+ gradientTransform="translate(3,80)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3262"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-610.27271,-244)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3264"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7265124,0,0,3,-609.95991,-244)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3266"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8181819,0,0,3,-236.18181,-253)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3268"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8156792,0,0,3,-235.15201,-253)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3270"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1818183,0,0,3,-385.81817,-262)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1818201,0,0,3,-385.819,-262)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3274"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-685.09089,-271)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3276"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9076703,0,0,3,-684.49854,-271)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3278"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8181819,0,0,2,-281.18181,-36)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3280"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8181844,0,0,2,-281.18289,-36)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3282"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,2,18.090914,-43)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3284"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,2,18.090902,-43)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3286"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,-206.36363,-50)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3288"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,-206.36364,-50)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3290"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-355.99999,-57)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3292"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,-355.99999,-57)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3294"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,1,-49.818182,170)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3296"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818181,0,0,1,-49.818157,170)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3298"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363636,0,0,1,174.63636,165)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3300"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363637,0,0,1,174.63634,165)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3302"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(24.999994,160)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3304"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0000028,0,0,1,24.998896,160)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3306"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636364,0,0,1,-124.63636,155)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3308"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636364,0,0,1,-124.63637,155)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3310"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,76.818182,170)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3312"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,76.818182,170)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3314"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363636,0,0,1,151.63636,165)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3316"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363636,0,0,1,151.63639,165)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3318"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2,160)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3320"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2,160)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4176"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-685.09089,-164)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4178"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090903,0,0,3,-685.09074,-164)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4180"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.909091,0,0,3,-685.0909,-173)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4182"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090907,0,0,3,-685.09082,-173)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4184"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-685.09089,-182)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4186"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090927,0,0,3,-685.09171,-182)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4188"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-685.09089,-191)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4190"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9076703,0,0,3,-684.49854,-191)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4192"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-355.99999,44)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4194"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999923,0,0,2,-355.99682,44)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4196"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,-355.99999,37)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4198"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999814,0,0,2,-355.99237,37)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4200"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-355.99999,30)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4202"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999816,0,0,2,-355.99236,30)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4204"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-355.99999,23)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4206"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,-355.99999,23)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4208"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636364,0,0,1,-124.63636,250)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4210"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636303,0,0,1,-124.63388,250)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4212"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636363,0,0,1,-124.63637,245)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4214"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636304,0,0,1,-124.63389,245)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4216"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636364,0,0,1,-124.63637,240)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4218"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636272,0,0,1,-124.63253,240)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4220"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636364,0,0,1,-124.63636,235)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4222"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3636364,0,0,1,-124.63637,235)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4224"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.0000002,250)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4226"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.9999984,250)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4228"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1.9999943,245)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4230"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2.00003,245)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4232"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2,240)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4234"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(2,240)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2914"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4545455,0,0,3,52.454555,-409)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2916"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4545451,0,0,3,52.45461,-409)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2918"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,3,163.18182,-418)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2920"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818181,0,0,3,163.18185,-418)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2922"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727274,0,0,3,126.27274,-427)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2924"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727272,0,0,3,126.27274,-427)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2926"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,3,-6.36363,-436)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2928"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363634,0,0,3,-6.36359,-436)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2930"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.909091,0,0,2,234.90909,-201)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2932"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090911,0,0,2,234.90905,-201)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2935"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7272727,0,0,2,308.72728,-208)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2937"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7314901,0,0,2,307.01513,-208)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2939"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181819,0,0,2,271.81819,-215)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2941"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181709,0,0,2,271.82279,-215)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2943"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,2,171.09091,-222)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2945"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909078,0,0,2,171.09144,-222)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2947"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363637,0,0,1,318.63637,5)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2949"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6750873,0,0,1.3593233,302.73494,-68.1223)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2951"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4545454,0,0,1,392.45454,0)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2953"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5009302,0,0,1.510293,373.36726,-103.84461)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2955"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5454546,0,0,1,355.54545,-5)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2957"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.584768,0,0,1.432468,339.36802,-93.0072)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2959"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7272727,0,0,1,288.72727,-10)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2961"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7547388,0,0,1.3021258,277.42501,-71.48262)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2963"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2727272,0,0,1,447.27272,5)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2965"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.324675,0,0,1.5714291,425.89625,-111.28582)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2967"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4545455,0,0,1,373.45454,0)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2969"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4878901,0,0,1.3667903,359.73324,-74.64185)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient2971"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363636,0,0,1,302.63636,-5)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient2973"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6558886,0,0,1.214775,294.60183,-48.7067)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3763"
+ id="radialGradient3769"
+ cx="419.15976"
+ cy="531.81116"
+ fx="419.15976"
+ fy="531.81116"
+ r="2.5"
+ gradientTransform="matrix(1.5,0,0,1.4,-59.5,-535.2)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3773"
+ id="linearGradient3779"
+ x1="418"
+ y1="535"
+ x2="418"
+ y2="528"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(150,-323)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3783"
+ id="linearGradient3789"
+ x1="418"
+ y1="529"
+ x2="419.31973"
+ y2="533.92529"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(150,-325)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3773"
+ id="linearGradient3797"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4000011,0,0,1.4285683,6.99955,-555.35546)"
+ x1="418"
+ y1="535"
+ x2="418"
+ y2="528" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3763"
+ id="radialGradient3799"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1,0,0,1.96,-286.3,-837.28)"
+ cx="419.15976"
+ cy="531.81116"
+ fx="419.15976"
+ fy="531.81116"
+ r="2.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3783"
+ id="linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ x1="418"
+ y1="529"
+ x2="419.31973"
+ y2="533.92529"
+ gradientTransform="matrix(1.4,0,0,1.4,7,-543)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3773"
+ id="linearGradient3809"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.4,0,0,2.2857142,-378,-1014.0714)"
+ x1="418"
+ y1="535"
+ x2="418"
+ y2="528" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3763"
+ id="radialGradient3811"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.6,0,0,3.1999999,-880.8,-1499.1)"
+ cx="419.19449"
+ cy="531.98694"
+ fx="419.19449"
+ fy="531.98694"
+ r="2.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3783"
+ id="linearGradient3813"
+ gradientUnits="userSpaceOnUse"
+ x1="418"
+ y1="529"
+ x2="419.31973"
+ y2="533.92529"
+ gradientTransform="matrix(2.4,0,0,2.2857143,-378,-1018.6428)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3773"
+ id="linearGradient3893"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4000001,0,0,3.2040815,-748.00002,-1507.2652)"
+ x1="418"
+ y1="535"
+ x2="418"
+ y2="528" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3763"
+ id="radialGradient3895"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(5.1,0,0,4.4857141,-1460.3,-2187.1714)"
+ cx="419.19449"
+ cy="531.98694"
+ fx="419.19449"
+ fy="531.98694"
+ r="2.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3783"
+ id="linearGradient3897"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4,0,0,3.2040816,-748,-1513.6734)"
+ x1="418"
+ y1="529"
+ x2="419.31973"
+ y2="533.92529" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4004"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4,0,0,3.2040816,-768.99996,-1433.6734)"
+ x1="418"
+ y1="529"
+ x2="419.31973"
+ y2="533.92529" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="radialGradient4006"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(5.1,0,0,4.4857141,-1481.3,-2107.1714)"
+ cx="419.19449"
+ cy="531.98694"
+ fx="419.19449"
+ fy="531.98694"
+ r="2.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="linearGradient4008"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4000001,0,0,3.2040815,-769.00006,-1427.2652)"
+ x1="418"
+ y1="535"
+ x2="418"
+ y2="528" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4010"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.4,0,0,2.2857143,-392,-938.64285)"
+ x1="418"
+ y1="529"
+ x2="419.31973"
+ y2="533.92529" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="radialGradient4012"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.6,0,0,3.1999999,-894.8,-1419.1)"
+ cx="419.19449"
+ cy="531.98694"
+ fx="419.19449"
+ fy="531.98694"
+ r="2.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="linearGradient4014"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.4,0,0,2.2857142,-392,-934.0714)"
+ x1="418"
+ y1="535"
+ x2="418"
+ y2="528" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4016"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4,0,0,1.4,-3.99997,-463)"
+ x1="418"
+ y1="529"
+ x2="419.31973"
+ y2="533.92529" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="radialGradient4018"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1,0,0,1.96,-297.29997,-757.28)"
+ cx="419.15976"
+ cy="531.81116"
+ fx="419.15976"
+ fy="531.81116"
+ r="2.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="linearGradient4020"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4000011,0,0,1.4285683,-4.00047,-475.35546)"
+ x1="418"
+ y1="535"
+ x2="418"
+ y2="528" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4022"
+ gradientUnits="userSpaceOnUse"
+ x1="418"
+ y1="529"
+ x2="419.31973"
+ y2="533.92529"
+ gradientTransform="translate(141,-245)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="radialGradient4024"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5,0,0,1.4,-68.5,-455.2)"
+ cx="419.15976"
+ cy="531.81116"
+ fx="419.15976"
+ fy="531.81116"
+ r="2.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="linearGradient4026"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(141,-243)"
+ x1="418"
+ y1="535"
+ x2="418"
+ y2="528" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4028"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4545455,0,0,3,74.454555,-329)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4030"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4545451,0,0,3,74.45461,-329)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4032"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818182,0,0,3,185.18182,-338)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4034"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1818181,0,0,3,185.18185,-338)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4036"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727274,0,0,3,148.27274,-347)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4038"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727272,0,0,3,148.27274,-347)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4040"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,3,-164.99999,-356)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4042"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999997,0,0,3,-164.99994,-356)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4044"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.909091,0,0,2,251.90909,-121)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4046"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090911,0,0,2,251.90905,-121)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4048"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7272727,0,0,2,325.72728,-128)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4050"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7314901,0,0,2,324.01513,-128)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4052"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181819,0,0,2,288.81819,-135)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4054"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181709,0,0,2,288.82279,-135)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4056"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,2,92.272732,-142)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4058"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,2,92.272731,-142)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4060"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6363637,0,0,1,330.63635,85)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4062"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.6750873,0,0,1.3593233,314.73492,11.8777)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4064"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4545454,0,0,1,404.45452,80)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4066"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5009302,0,0,1.510293,385.36724,-23.84461)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4068"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5454546,0,0,1,367.54543,75)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4070"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.584768,0,0,1.432468,351.368,-13.0072)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4072"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(174,70)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4074"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.027466,0,0,1.3021258,162.69777,8.51738)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4076"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.2727272,0,0,1,454.27272,85)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4078"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.324675,0,0,1.5714291,432.89625,-31.28582)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4080"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4545455,0,0,1,380.45454,80)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4082"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4878901,0,0,1.3667903,366.73324,5.35815)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4084"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,225.81818,75)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4086"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8377071,0,0,1.214775,217.78351,31.2933)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3129"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-681.09089,-79)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3131"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090903,0,0,3,-681.09074,-79)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3133"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.909091,0,0,3,-681.0909,-85)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3135"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090907,0,0,3,-681.09082,-85)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3137"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-681.09089,-91)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3139"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090927,0,0,3,-681.09171,-91)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3141"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-681.09089,-97)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3143"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9076703,0,0,3,-680.49854,-97)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3145"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-352.99999,130)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3147"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999923,0,0,2,-352.99682,130)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3149"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,-352.99999,126)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3151"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999814,0,0,2,-352.99237,126)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-352.99999,122)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3155"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999816,0,0,2,-352.99236,122)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3157"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-352.99999,118)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3159"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,-352.99999,118)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3161"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,-85.727269,337)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3163"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727216,0,0,1,-85.72495,337)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3165"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727272,0,0,1,-85.727279,334)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3167"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727217,0,0,1,-85.72496,334)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3169"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,-85.727279,331)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3171"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727187,0,0,1,-85.72369,331)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3173"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,-85.727269,328)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3175"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,-85.727274,328)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3177"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,40.909091,337)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3179"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,40.909086,337)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3181"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,40.909086,335)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3184"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,40.909115,335)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3186"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,40.909091,333)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3188"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,40.909088,333)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient4704"
+ x1="163.63406"
+ y1="400"
+ x2="163.63406"
+ y2="395"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient4714"
+ x1="396.20865"
+ y1="562.6601"
+ x2="406.20865"
+ y2="562.6601"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,990.20864,937.16014)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient4722"
+ x1="411.70865"
+ y1="568.6601"
+ x2="424.70865"
+ y2="568.6601"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,1023.7087,949.66016)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient4730"
+ x1="428.70868"
+ y1="577.6601"
+ x2="447.70868"
+ y2="577.6601"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,1070.6602,960.70878)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient4913"
+ gradientUnits="userSpaceOnUse"
+ x1="404.55902"
+ y1="543.04877"
+ x2="425.55902"
+ y2="543.04877"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1036.0486,107.44099)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient4922"
+ gradientUnits="userSpaceOnUse"
+ x1="416.55902"
+ y1="581.04877"
+ x2="431.55902"
+ y2="581.04877"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1036.0486,107.44099)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient4937"
+ gradientUnits="userSpaceOnUse"
+ x1="422.55899"
+ y1="608.54877"
+ x2="434.55902"
+ y2="608.54877"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1036.0486,107.44099)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient4940"
+ gradientUnits="userSpaceOnUse"
+ x1="427.60754"
+ y1="629.09729"
+ x2="434.60757"
+ y2="629.09729"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1036.0486,107.44099)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient5260"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,1245.7087,1061.6601)"
+ x1="474.70865"
+ y1="577.6601"
+ x2="502.70868"
+ y2="577.6601" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5262"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-506.09089,-24)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5264"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090903,0,0,3,-506.09074,-24)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5266"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.909091,0,0,3,-506.0909,-33)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5268"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090907,0,0,3,-506.09082,-33)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5270"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-506.09089,-42)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090927,0,0,3,-506.09171,-42)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5274"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-506.09089,-51)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5276"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9076703,0,0,3,-505.49854,-51)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient5282"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,1198.7088,1018.6602)"
+ x1="441.70865"
+ y1="568.6601"
+ x2="463.70865"
+ y2="568.6601" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5300"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-177.99999,169)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5302"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999923,0,0,2,-177.99682,169)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5304"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,-177.99999,162)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5306"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999814,0,0,2,-177.99237,162)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5308"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-177.99999,155)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5310"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999816,0,0,2,-177.99236,155)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5312"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,-177.99999,148)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5314"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,-177.99999,148)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5328"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,215.90909,354)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5330"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,215.90909,354)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5332"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,215.90909,358)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5334"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,215.90912,358)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5336"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,215.90909,362)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5338"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,215.90909,362)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient5360"
+ gradientUnits="userSpaceOnUse"
+ x1="163.8069"
+ y1="424.9527"
+ x2="163.8069"
+ y2="415.99792"
+ gradientTransform="translate(418,141)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient5364"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,1165.2086,986.1601)"
+ x1="419.20865"
+ y1="562.6601"
+ x2="432.20865"
+ y2="562.6601" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5370"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,89.272731,363)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5372"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727216,0,0,1,89.27505,363)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5374"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727272,0,0,1,89.272721,359)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727217,0,0,1,89.27504,359)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5378"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,89.272721,355)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5380"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727187,0,0,1,89.27631,355)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5382"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,89.272731,351)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5384"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,89.272726,351)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient5448"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1211.0486,107.44099)"
+ x1="450.55899"
+ y1="543.04871"
+ x2="480.55902"
+ y2="543.04871" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient5454"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1211.0486,107.44099)"
+ x1="446.55902"
+ y1="581.04877"
+ x2="470.55905"
+ y2="581.04877" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient5460"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1211.0486,107.44099)"
+ x1="448.60754"
+ y1="629.09729"
+ x2="459.60757"
+ y2="629.09729" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient5464"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1211.0486,107.44099)"
+ x1="445.55902"
+ y1="608.54877"
+ x2="460.55902"
+ y2="608.54877" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient5734"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,1425.7087,1161.6601)"
+ x1="519.70868"
+ y1="577.6601"
+ x2="557.70868"
+ y2="577.6601" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5736"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-326.09089,31)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5738"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090903,0,0,3,-326.09074,31)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5740"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.909091,0,0,3,-326.0909,19)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5742"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090907,0,0,3,-326.09082,19)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5744"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-326.09089,6)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5746"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090927,0,0,3,-326.09171,6)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5748"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9090911,0,0,3,-326.09089,-6)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5750"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9076703,0,0,3,-325.49854,-6)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient5772"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,1378.7086,1088.6601)"
+ x1="476.70865"
+ y1="568.6601"
+ x2="498.70865"
+ y2="568.6601" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5776"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,2.00001,204)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5778"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999923,0,0,2,2.00318,204)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5780"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,2.00001,197)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5782"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999814,0,0,2,2.00763,197)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5784"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,2.00001,190)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5786"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999816,0,0,2,2.00764,190)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5788"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0000001,0,0,2,2.00001,183)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5790"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,2.00001,183)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,395.90909,377)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5810"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,395.90909,377)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5812"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,395.90909,383)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5814"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,395.90912,383)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5816"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,395.90909,389)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5818"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,395.90909,389)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5832"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,269.27273,390)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5834"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727216,0,0,1,269.27505,390)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5836"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727272,0,0,1,269.27272,385)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5838"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727217,0,0,1,269.27504,385)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5840"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,269.27272,379)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5842"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727187,0,0,1,269.27631,379)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient5844"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,269.27273,374)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5846"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,269.27273,374)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient5850"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(598,141)"
+ x1="164"
+ y1="452"
+ x2="164"
+ y2="439" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4698"
+ id="linearGradient5854"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,-0.9999999,-0.9999999,8.5712909e-8,1345.2087,1036.1601)"
+ x1="442.20865"
+ y1="562.6601"
+ x2="459.20865"
+ y2="562.6601" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient5938"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1391.0486,107.44099)"
+ x1="495.55902"
+ y1="543.04871"
+ x2="535.55902"
+ y2="543.04871" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient5944"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1391.0486,107.44099)"
+ x1="481.55902"
+ y1="581.04877"
+ x2="505.55902"
+ y2="581.04877" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient5950"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1391.0486,107.44099)"
+ x1="471.60757"
+ y1="629.09729"
+ x2="486.60757"
+ y2="629.09729" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4836"
+ id="linearGradient5954"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(8.5712909e-8,0.9999999,-0.9999999,8.5712909e-8,1391.0486,107.44099)"
+ x1="468.55899"
+ y1="608.54877"
+ x2="487.55899"
+ y2="608.54877" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4179"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8601696,0,0,0.8602996,35.605353,267.55435)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient4181"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8601694,0,0,0.9299323,35.605348,241.86439)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient4183"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.088999,0,0,1.0870857,255.57749,343.02861)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4187"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.157632,0,0,1.1519238,-22.541522,156.95783)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient4189"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1576318,0,0,1.2451606,-22.541527,122.55951)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient4191"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4655948,0,0,1.4555859,273.50101,258.01636)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4197"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6084729,0,0,1.5939159,-114.95439,-10.11099)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient4199"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6084726,0,0,1.7229278,-114.95441,-57.70794)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient4201"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0363721,0,0,2.0140932,296.38218,129.72359)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4205"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5540478,0,0,2.5198112,-329.10963,-359.3757)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient4207"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5540472,0,0,2.7237651,-329.10965,-434.62138)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient4209"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.2334964,0,0,3.1840666,324.03984,-138.31212)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4318"
+ x1="34.625347"
+ y1="561.3078"
+ x2="31.194677"
+ y2="564.73846"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(242,17)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4332"
+ cx="34.35376"
+ cy="561.81543"
+ fx="34.35376"
+ fy="561.81543"
+ r="4"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3532032,0,0,1.3528358,229.86614,-181.2286)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4384"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3532032,0,0,1.3528358,254.86614,-186.2286)"
+ cx="34.35376"
+ cy="561.81543"
+ fx="34.35376"
+ fy="561.81543"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4386"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(267,12)"
+ x1="34.625347"
+ y1="561.3078"
+ x2="29.340931"
+ y2="566.59222" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5161"
+ id="linearGradient5127"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,-1,332,1229)"
+ x1="30"
+ y1="566"
+ x2="36"
+ y2="560" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3773"
+ id="radialGradient5129"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.3532032,0,0,-1.3528358,344.13386,1427.2286)"
+ cx="34.35376"
+ cy="561.81543"
+ fx="34.35376"
+ fy="561.81543"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5161"
+ id="linearGradient5131"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.9999999,8.5712909e-8,-8.5712909e-8,-0.9999999,307.99999,1233.0001)"
+ x1="30.999945"
+ y1="565.00018"
+ x2="35.527653"
+ y2="560.47247" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3773"
+ id="radialGradient5133"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.3532032,4.3527857e-8,-3.8860884e-8,-1.3528358,320.13386,1431.2286)"
+ cx="34.35376"
+ cy="561.81543"
+ fx="34.35376"
+ fy="561.81543"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient5135"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.2334964,0,0,3.1840666,324.03984,-48.31212)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient5137"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5540472,0,0,2.7237651,-329.10965,-344.62138)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5139"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5540478,0,0,2.5198112,-329.10963,-269.3757)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient5141"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0363721,0,0,2.0140932,296.38218,219.72359)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient5143"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6084726,0,0,1.7229278,-114.95441,32.29206)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5145"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6084729,0,0,1.5939159,-114.95439,79.88901)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient5147"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4655948,0,0,1.4555859,273.50101,348.01636)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient5149"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1576318,0,0,1.2451606,-22.541527,212.55951)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5151"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.157632,0,0,1.1519238,-22.541522,246.95783)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient5153"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.088999,0,0,1.0870857,255.57749,433.02861)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient5155"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8601694,0,0,0.9299323,35.605348,331.86439)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient5157"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8601696,0,0,0.8602996,35.605353,357.55435)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient5266"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.5745258,0,0,3.5735553,212.90912,-1442.0476)"
+ cx="34.35376"
+ cy="561.81543"
+ fx="34.35376"
+ fy="561.81543"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient5269"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,267,-558)"
+ x1="34.625347"
+ y1="561.3078"
+ x2="27.629963"
+ y2="568.30316" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5273"
+ id="linearGradient5279"
+ x1="334.54462"
+ y1="561.83643"
+ x2="339.6665"
+ y2="566.95831"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient5297"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(5.585637,0,0,5.5841205,193.81989,-2585.6141)"
+ cx="34.35376"
+ cy="561.81543"
+ fx="34.35376"
+ fy="561.81543"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient5299"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,317,-572)"
+ x1="34.625347"
+ y1="561.3078"
+ x2="25.901016"
+ y2="570.0321" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5273"
+ id="linearGradient5301"
+ gradientUnits="userSpaceOnUse"
+ x1="334.54462"
+ y1="561.83643"
+ x2="339.6665"
+ y2="566.95831"
+ gradientTransform="translate(50,-14)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3783"
+ id="linearGradient5385"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,0.9999999,0.9999999,8.5712909e-8,-233.99999,323.99999)"
+ x1="332.16696"
+ y1="559.4588"
+ x2="338.55817"
+ y2="565.84998" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3763"
+ id="linearGradient5387"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-6.78982e-8,2.0000002,2.0000002,6.78982e-8,-791.99999,590.99998)"
+ x1="31.733051"
+ y1="565.5"
+ x2="35.754208"
+ y2="561.47882" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3773"
+ id="radialGradient5389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.3740749e-7,3.5745259,3.5735554,1.7220227e-8,-1676.0476,536.9091)"
+ cx="34.35376"
+ cy="561.81543"
+ fx="34.35376"
+ fy="561.81543"
+ r="4" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3773"
+ id="radialGradient5399"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.7379106e-7,5.1689736,5.1675702,0,-2525.5897,472.13384)"
+ cx="34.35376"
+ cy="561.81543"
+ fx="34.35376"
+ fy="561.81543"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3763"
+ id="linearGradient5401"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-6.78982e-8,2.0000002,2.0000002,6.78982e-8,-745.99999,580.99998)"
+ x1="29.115515"
+ y1="568.11749"
+ x2="35.754208"
+ y2="561.47882" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3783"
+ id="linearGradient5403"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-8.5712909e-8,0.9999999,0.9999999,8.5712909e-8,-187.99999,313.99999)"
+ x1="332.34216"
+ y1="559.63397"
+ x2="337.86154"
+ y2="565.15332" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3540"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-238.27271,-431)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3542"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272782,0,0,3,-238.27501,-431)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3556"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,166.63637,-216)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3558"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6446282,0,0,2,163.28098,-216)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3584"
+ gradientUnits="userSpaceOnUse"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649"
+ gradientTransform="matrix(0.9090909,0,0,1,410.90909,0)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3586"
+ gradientUnits="userSpaceOnUse"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201"
+ gradientTransform="matrix(0.9090909,0,0,1,410.90909,0)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3592"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,410.90909,10)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient3594"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,410.90909,10)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4378"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4385"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4395"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,410.90909,5)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4397"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9090909,0,0,1,410.90909,5)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4399"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4425"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,1,359.09091,-5)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4427"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,1,359.09091,-5)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4429"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,1,359.09091,9)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4431"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,1,359.09091,9)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4433"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4435"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4437"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,1,359.09091,2)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4439"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,1,359.09091,2)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4441"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4447"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6446282,0,0,2,163.28098,-196)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4459"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,166.63637,-196)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4461"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4471"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6446282,0,0,2,163.28098,-206)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4473"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,166.63637,-206)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4475"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4481"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4492"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272782,0,0,3,-238.27501,-405)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4494"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-238.27271,-405)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4496"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4506"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272782,0,0,3,-238.27501,-418)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4508"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-238.27271,-418)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4510"
+ gradientUnits="userSpaceOnUse"
+ x1="533.97046"
+ y1="62.640213"
+ x2="533.97046"
+ y2="69.536903" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4630"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-238.27271,-333)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4632"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272782,0,0,3,-238.27501,-333)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4636"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-238.27271,-320)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4638"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272782,0,0,3,-238.27501,-320)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4644"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,166.63637,-121)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4646"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6446282,0,0,2,163.28098,-121)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4650"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,166.63637,-111)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4652"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6446282,0,0,2,163.28098,-111)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4658"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(397,87)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4660"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(397.00001,87)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4666"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(397,94)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(397.00001,94)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4670"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(397,80)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4672"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(397.00001,80)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4676"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,448.81818,90)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4678"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,448.81818,90)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4684"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,448.81818,95)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4686"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,448.81818,95)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4688"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272729,0,0,3,-238.27271,-346)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4690"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.7272782,0,0,3,-238.27501,-346)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4692"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6363637,0,0,2,166.63637,-131)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4694"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6446282,0,0,2,163.28098,-131)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4696"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181784,0,0,1,448.81955,85)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4699"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8181818,0,0,1,448.81819,85)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <radialGradient
+ r="7"
+ fy="-89.655792"
+ fx="-689.56042"
+ cy="-89.655792"
+ cx="-689.56042"
+ spreadMethod="pad"
+ gradientTransform="matrix(1.1662695,0,0,1.3328795,118.61628,48.417682)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6068"
+ xlink:href="#linearGradient5803"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5803">
+ <stop
+ style="stop-color:#d3d3d3;stop-opacity:1;"
+ offset="0"
+ id="stop5805" />
+ <stop
+ style="stop-color:#5b5b5b;stop-opacity:1;"
+ offset="1"
+ id="stop5807" />
+ </linearGradient>
+ <radialGradient
+ r="6"
+ fy="-80.372871"
+ fx="-689.89008"
+ cy="-80.372871"
+ cx="-689.89008"
+ spreadMethod="reflect"
+ gradientTransform="matrix(1.3396979,0,0,1.0929141,236.1705,29.144383)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6070"
+ xlink:href="#linearGradient5652"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5652">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop5654" />
+ <stop
+ style="stop-color:#c5c5c5;stop-opacity:1"
+ offset="1"
+ id="stop5656" />
+ </linearGradient>
+ <clipPath
+ id="clipPath5787"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ sodipodi:nodetypes="cccccccccccccccscccccc"
+ id="path5789"
+ d="M -684,-70.999997 L -684,-69.999997 L -683,-69.999997 C -682.448,-69.999997 -682,-69.551997 -682,-68.999997 L -682,-58.999997 C -682,-58.447997 -682.448,-57.999997 -683,-57.999997 L -684,-57.999997 L -684,-56.999997 L -678,-56.999997 C -674,-56.999997 -672,-56.999997 -672,-60.999997 C -672,-62.999997 -674,-63.999997 -675,-64.499997 C -674,-64.999997 -673,-64.999997 -673,-67.499997 C -673,-69.999997 -675,-70.999997 -678,-70.999997 L -684,-70.999997 z M -679,-69.999997 C -676,-69.999997 -676,-68.999997 -676,-67.499997 C -676,-65.999997 -676,-64.999997 -679,-64.999997 L -679,-69.999997 z M -679,-63.968747 C -676,-63.999997 -675,-62.999997 -675,-60.999997 C -675,-58.999997 -675,-57.999997 -679,-57.999997 L -679,-63.968747 z"
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#c5c5c5;fill-opacity:1;stroke:none;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ </clipPath>
+ <linearGradient
+ y2="-67.000725"
+ x2="-671.69934"
+ y1="-58"
+ x1="-671.69934"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6072"
+ xlink:href="#linearGradient5970"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5970"
+ inkscape:collect="always">
+ <stop
+ id="stop5972"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop5974"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ r="9"
+ fy="-71.457085"
+ fx="-649"
+ cy="-71.457085"
+ cx="-649"
+ spreadMethod="pad"
+ gradientTransform="matrix(1.2280082,0,0,1.4680979,147.97726,31.544499)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6046"
+ xlink:href="#linearGradient5803"
+ inkscape:collect="always" />
+ <radialGradient
+ r="8"
+ fy="-57.278816"
+ fx="-652.24567"
+ cy="-57.278816"
+ cx="-652.24567"
+ spreadMethod="reflect"
+ gradientTransform="matrix(0.862499,2.9523774e-7,-3.2625582e-7,0.9531143,-89.684453,-1.9702176)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6048"
+ xlink:href="#linearGradient5652"
+ inkscape:collect="always" />
+ <clipPath
+ id="clipPath5944"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#720000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-56.5 C -654,-55.672 -654.672,-55 -655.5,-55 L -657,-55 L -657,-54 L -650,-54 C -643,-54 -641,-55 -641,-59 C -641,-62 -643.30127,-62.693081 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z M -650,-63 C -647,-63 -645,-62 -645,-59.5 C -645,-56 -647.37068,-56 -650,-56 L -650,-63 z"
+ id="path5946"
+ sodipodi:nodetypes="ccccccccccccccczcccccc" />
+ </clipPath>
+ <linearGradient
+ y2="-72"
+ x2="-648.30823"
+ y1="-60.278816"
+ x1="-648.30823"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6050"
+ xlink:href="#linearGradient5962"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5962"
+ inkscape:collect="always">
+ <stop
+ id="stop5964"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop5966"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ r="9"
+ fy="-71.457085"
+ fx="-649"
+ cy="-71.457085"
+ cx="-649"
+ spreadMethod="pad"
+ gradientTransform="matrix(1.2280082,0,0,1.4680979,147.97726,31.544499)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6074"
+ xlink:href="#linearGradient5803"
+ inkscape:collect="always" />
+ <radialGradient
+ r="8"
+ fy="-57.278816"
+ fx="-652.24567"
+ cy="-57.278816"
+ cx="-652.24567"
+ spreadMethod="reflect"
+ gradientTransform="matrix(0.862499,2.9523774e-7,-3.2625582e-7,0.9531143,-89.684453,-1.9702176)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6076"
+ xlink:href="#linearGradient5652"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-72"
+ x2="-648.30823"
+ y1="-60.278816"
+ x1="-648.30823"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6078"
+ xlink:href="#linearGradient5962"
+ inkscape:collect="always" />
+ <radialGradient
+ r="7"
+ fy="-89.655792"
+ fx="-689.56042"
+ cy="-89.655792"
+ cx="-689.56042"
+ spreadMethod="pad"
+ gradientTransform="matrix(1.1662695,0,0,1.3328795,118.61628,48.417682)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6080"
+ xlink:href="#linearGradient5803"
+ inkscape:collect="always" />
+ <radialGradient
+ r="6"
+ fy="-80.372871"
+ fx="-689.89008"
+ cy="-80.372871"
+ cx="-689.89008"
+ spreadMethod="reflect"
+ gradientTransform="matrix(1.3396979,0,0,1.0929141,236.1705,29.144383)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6082"
+ xlink:href="#linearGradient5652"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-67.000725"
+ x2="-671.69934"
+ y1="-58"
+ x1="-671.69934"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6084"
+ xlink:href="#linearGradient5970"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4988"
+ x1="778"
+ y1="295"
+ x2="778"
+ y2="290"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3574389,0,0,1.3574389,-295.60663,-97.982603)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4990"
+ x1="779"
+ y1="300"
+ x2="779"
+ y2="295"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3329491,0,0,1.3329491,-274.75405,-93.070223)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5016"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3648555,0,0,1.3648555,-282.32629,-104.06937)"
+ x1="778.88196"
+ y1="289.57986"
+ x2="778.88196"
+ y2="284.53162" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5018"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3414673,0,0,1.3414673,-262.0977,-97.572929)"
+ x1="778"
+ y1="295"
+ x2="778"
+ y2="290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5020"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5192267,0,0,1.5192267,-332.88171,-173.84066)"
+ x1="779"
+ y1="300"
+ x2="779"
+ y2="295" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5075"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.651178,0,0,1.651178,-459.7092,-200.86484)"
+ x1="778.88196"
+ y1="289.57986"
+ x2="778.88196"
+ y2="284.53162" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5085"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.644508,0,0,1.644508,-454.40434,-197.14865)"
+ x1="778"
+ y1="295"
+ x2="778"
+ y2="290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5095"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.637365,0,0,1.637365,-448.82057,-193.25482)"
+ x1="779"
+ y1="300"
+ x2="779"
+ y2="295" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.651178,0,0,1.651178,-422.7092,-211.86484)"
+ x1="778.88196"
+ y1="289.57986"
+ x2="778.88196"
+ y2="284.53162" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5123"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.644508,0,0,1.644508,-417.40434,-205.14865)"
+ x1="778"
+ y1="295"
+ x2="778"
+ y2="290" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient5125"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.637365,0,0,1.637365,-411.82057,-198.25482)"
+ x1="779"
+ y1="300"
+ x2="779"
+ y2="295" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3841"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8601696,0,0,0.8602996,35.605353,267.55435)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient3843"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8601694,0,0,0.9299323,35.605348,241.86439)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient3845"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.088999,0,0,1.0870857,255.57749,343.02861)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3847"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.157632,0,0,1.1519238,177.45848,156.95783)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient3849"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1576318,0,0,1.2451606,177.45847,122.55951)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient3851"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4655948,0,0,1.4555859,473.50101,258.01636)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3853"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6084729,0,0,1.5939159,85.04561,-10.11099)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient3855"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6084726,0,0,1.7229278,85.04559,-57.70794)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient3857"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0363721,0,0,2.0140932,496.38218,129.72359)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient3859"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5540478,0,0,2.5198112,-129.10963,-359.3757)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient3861"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5540472,0,0,2.7237651,-129.10965,-434.62138)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient3863"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.2334964,0,0,3.1840666,524.03984,-138.31212)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4691"
+ x1="456.53177"
+ y1="584.87073"
+ x2="456.53177"
+ y2="576.26294"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0375669,0,0,1.0375669,2.3977864,-22.826426)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4701"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0375669,0,0,1.0375669,27.397786,-27.826426)"
+ x1="456.53177"
+ y1="584.87073"
+ x2="456.53177"
+ y2="576.26294" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4711"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4421212,0,0,1.4421212,-122.18436,-271.87229)"
+ x1="456.53177"
+ y1="584.87073"
+ x2="456.53177"
+ y2="576.26294" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4721"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.7987903,0,0,1.7987903,-234.91838,-492.0969)"
+ x1="456.53177"
+ y1="584.87073"
+ x2="456.53177"
+ y2="576.26294" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4806"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.7987903,0,0,1.7987903,-234.91838,-381.0969)"
+ x1="456.53177"
+ y1="584.87073"
+ x2="456.53177"
+ y2="576.26294" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4421212,0,0,1.4421212,-122.18436,-171.87229)"
+ x1="456.53177"
+ y1="584.87073"
+ x2="456.53177"
+ y2="576.26294" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4810"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0375669,0,0,1.0375669,27.397786,65.173574)"
+ x1="456.53177"
+ y1="584.87073"
+ x2="456.53177"
+ y2="576.26294" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4812"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0375669,0,0,1.0375669,2.3977864,65.173574)"
+ x1="456.53177"
+ y1="584.87073"
+ x2="456.53177"
+ y2="576.26294" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient4814"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.2334964,0,0,3.1840666,524.03984,-63.31212)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient4816"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5540472,0,0,2.7237651,-129.10965,-359.62138)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4818"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5540478,0,0,2.5198112,-129.10963,-284.3757)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient4820"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0363721,0,0,2.0140932,496.38218,205.72359)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient4822"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6084726,0,0,1.7229278,85.04559,18.29206)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4824"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6084729,0,0,1.5939159,85.04561,65.88901)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient4826"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4655948,0,0,1.4555859,473.50101,336.01636)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient4828"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1576318,0,0,1.2451606,177.45847,200.55951)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4830"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.157632,0,0,1.1519238,177.45848,234.95783)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4832"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8601696,0,0,0.8602996,35.605353,267.55435)"
+ x1="274"
+ y1="375.01318"
+ x2="274"
+ y2="360.88922" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="radialGradient4834"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.8601694,0,0,0.9299323,35.605348,241.86439)"
+ cx="272"
+ cy="373.62082"
+ fx="272"
+ fy="373.62082"
+ r="9.4205933" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3200"
+ id="linearGradient4837"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.088999,0,0,1.0870857,255.57749,343.02861)"
+ x1="17.647669"
+ y1="223.56895"
+ x2="14.576819"
+ y2="212.10838" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4682"
+ cx="424"
+ cy="274.39999"
+ fx="424"
+ fy="274.39999"
+ r="3"
+ gradientTransform="matrix(2,0,0,1.6666667,-444,-185.33333)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4684"
+ cx="424"
+ cy="268.0195"
+ fx="424"
+ fy="268.0195"
+ r="4"
+ gradientTransform="matrix(1.334836,0,0,2.0022539,-161.97045,-275.20775)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4689"
+ x1="424"
+ y1="272"
+ x2="424"
+ y2="261.8233"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-20,-3.9999974)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4697"
+ x1="429.30026"
+ y1="273.82983"
+ x2="429.30026"
+ y2="271.99973"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-16,-3.9999974)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4699"
+ cx="429"
+ cy="272"
+ fx="429"
+ fy="272"
+ r="4"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2780113,0,0,1.2780113,-119.26685,-75.619073)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4703"
+ gradientUnits="userSpaceOnUse"
+ x1="430"
+ y1="269"
+ x2="430"
+ y2="275.0867" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.334836,0,0,2.0022539,-140.97045,-278.20775)"
+ cx="424"
+ cy="268.0195"
+ fx="424"
+ fy="268.0195"
+ r="4" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,1.6666667,-423,-188.33333)"
+ cx="424"
+ cy="274.39999"
+ fx="424"
+ fy="274.39999"
+ r="3" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4723"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1,-6.9999974)"
+ x1="424"
+ y1="272"
+ x2="424"
+ y2="261.8233" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4725"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2780113,0,0,1.2780113,-111.26685,-82.61907)"
+ cx="429"
+ cy="272"
+ fx="429"
+ fy="272"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4727"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(8,-6.9999974)"
+ x1="429.30026"
+ y1="273.82983"
+ x2="429.30026"
+ y2="271.99973" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4729"
+ gradientUnits="userSpaceOnUse"
+ x1="430"
+ y1="269"
+ x2="430"
+ y2="275.0867"
+ gradientTransform="translate(8,-6.9999974)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4746"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.334836,0,0,2.0022539,-113.97045,-283.20775)"
+ cx="424"
+ cy="268.0195"
+ fx="424"
+ fy="268.0195"
+ r="4" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4748"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3333333,0,0,1.6666667,-1385.3333,-193.33333)"
+ cx="424"
+ cy="277.39999"
+ fx="424"
+ fy="277.39999"
+ r="3" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4750"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(28,-11.999997)"
+ x1="424"
+ y1="272"
+ x2="424"
+ y2="254.00716" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4752"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.8400251,0,0,2.9820263,-745.81521,-550.77781)"
+ cx="429"
+ cy="272"
+ fx="429"
+ fy="272"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4754"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.2222222,0,0,2.3333333,-480.77778,-374.33333)"
+ x1="429.30026"
+ y1="273.82983"
+ x2="429.30026"
+ y2="271.99973" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4756"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.2222222,0,0,2.3333333,-480.77778,-374.33333)"
+ x1="430"
+ y1="269"
+ x2="430"
+ y2="275.0867" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4775"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.334836,0,0,2.0022539,-72.97045,-291.20775)"
+ cx="424"
+ cy="268.0195"
+ fx="424"
+ fy="268.0195"
+ r="4" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4777"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3333333,0,0,1.6666667,-1344.3333,-201.33333)"
+ cx="424"
+ cy="278.60001"
+ fx="424"
+ fy="278.60001"
+ r="3" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4779"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(69,-21.999997)"
+ x1="424"
+ y1="274"
+ x2="424"
+ y2="250" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4781"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.7081089,0,0,3.8935142,-1069.4488,-806.75354)"
+ cx="429"
+ cy="272"
+ fx="429"
+ fy="272"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4783"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9014685,0,0,3.046542,-723.39995,-576.37706)"
+ x1="429.30026"
+ y1="273.82983"
+ x2="429.30026"
+ y2="271.99973" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4785"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9014685,0,0,3.046542,-723.39995,-576.37706)"
+ x1="430"
+ y1="269"
+ x2="430"
+ y2="275.0867" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4856"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.9014685,0,0,3.046542,1735.4,-496.37706)"
+ x1="430"
+ y1="269"
+ x2="430"
+ y2="275.0867" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4858"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.9014685,0,0,3.046542,1735.4,-496.37706)"
+ x1="429.30026"
+ y1="273.82983"
+ x2="429.30026"
+ y2="271.99973" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4860"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-3.7081089,0,0,3.8935142,2081.4488,-726.75354)"
+ cx="429"
+ cy="272"
+ fx="429"
+ fy="272"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4862"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,1,943,58.000003)"
+ x1="424"
+ y1="274"
+ x2="424"
+ y2="250" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4864"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-4.3333333,0,0,1.6666667,2356.3333,-121.33333)"
+ cx="424"
+ cy="278.60001"
+ fx="424"
+ fy="278.60001"
+ r="3" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4866"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.334836,0,0,2.0022539,1084.9705,-211.20775)"
+ cx="424"
+ cy="268.0195"
+ fx="424"
+ fy="268.0195"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4868"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.2222222,0,0,2.3333333,1404.7778,-294.33333)"
+ x1="430"
+ y1="269"
+ x2="430"
+ y2="275.0867" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4870"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.2222222,0,0,2.3333333,1404.7778,-294.33333)"
+ x1="429.30026"
+ y1="273.82983"
+ x2="429.30026"
+ y2="271.99973" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4872"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.8400251,0,0,2.9820263,1669.8152,-470.77781)"
+ cx="429"
+ cy="272"
+ fx="429"
+ fy="272"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4874"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(49,68.000003)"
+ x1="424"
+ y1="272"
+ x2="424"
+ y2="254.00716" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4876"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3333333,0,0,1.6666667,-1364.3333,-113.33333)"
+ cx="424"
+ cy="277.39999"
+ fx="424"
+ fy="277.39999"
+ r="3" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4878"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.334836,0,0,2.0022539,-92.97045,-203.20775)"
+ cx="424"
+ cy="268.0195"
+ fx="424"
+ fy="268.0195"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4880"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,1,854,73.000003)"
+ x1="430"
+ y1="269"
+ x2="430"
+ y2="275.0867" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4882"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,1,854,73.000003)"
+ x1="429.30026"
+ y1="273.82983"
+ x2="429.30026"
+ y2="271.99973" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4884"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.2780113,0,0,1.2780113,973.26685,-2.61907)"
+ cx="429"
+ cy="272"
+ fx="429"
+ fy="272"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4886"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(13,73.000003)"
+ x1="424"
+ y1="272"
+ x2="424"
+ y2="261.8233" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4888"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,1.6666667,-411,-108.33333)"
+ cx="424"
+ cy="274.39999"
+ fx="424"
+ fy="274.39999"
+ r="3" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4890"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.334836,0,0,2.0022539,-128.97045,-198.20775)"
+ cx="424"
+ cy="268.0195"
+ fx="424"
+ fy="268.0195"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4118"
+ id="linearGradient4892"
+ gradientUnits="userSpaceOnUse"
+ x1="430"
+ y1="269"
+ x2="430"
+ y2="275.0867"
+ gradientTransform="matrix(-1,0,0,1,832,76.000003)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4112"
+ id="linearGradient4894"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,1,832,76.000003)"
+ x1="429.30026"
+ y1="273.82983"
+ x2="429.30026"
+ y2="271.99973" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4105"
+ id="radialGradient4896"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.2780113,0,0,1.2780113,951.26685,0.38093)"
+ cx="429"
+ cy="272"
+ fx="429"
+ fy="272"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4898"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-12,76.000003)"
+ x1="424"
+ y1="272"
+ x2="424"
+ y2="261.8233" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4900"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,1.6666667,-436,-105.33333)"
+ cx="424"
+ cy="274.39999"
+ fx="424"
+ fy="274.39999"
+ r="3" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4902"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.334836,0,0,2.0022539,-153.97045,-195.20775)"
+ cx="424"
+ cy="268.0195"
+ fx="424"
+ fy="268.0195"
+ r="4" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="linearGradient4695"
+ x1="274"
+ y1="296"
+ x2="274"
+ y2="287"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,-0.1120726,1,31.870966,0)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4712"
+ x1="32"
+ y1="149"
+ x2="32"
+ y2="142.73804"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,-0.1120726,1,259.06871,141)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4718"
+ cx="269.52783"
+ cy="285.73843"
+ fx="269.52783"
+ fy="285.73843"
+ r="3.0674951"
+ gradientTransform="matrix(1.0749808,0,-0.3111369,2.7762077,68.973368,-512.91543)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4730"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3976182,0,-0.4045196,3.6094402,31.48352,-756.71041)"
+ cx="269.75238"
+ cy="285.97995"
+ fx="269.75238"
+ fy="285.97995"
+ r="3.0674951" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="linearGradient4732"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3001334,0,-0.1457091,1.3001334,-16.754545,-89.851976)"
+ x1="274"
+ y1="296"
+ x2="274"
+ y2="287" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4734"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3001334,0,-0.1457091,1.3001334,278.63284,93.466824)"
+ x1="32"
+ y1="149"
+ x2="32"
+ y2="142.73804" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4787"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.2922574,0,-0.6634591,5.2985131,-105.40668,-1249.7855)"
+ cx="270.19836"
+ cy="286.27225"
+ fx="270.19836"
+ fy="286.27225"
+ r="3.0674951" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="linearGradient4789"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1323706,0,-0.2389802,1.9085433,-184.52275,-270.86377)"
+ x1="274"
+ y1="296"
+ x2="274"
+ y2="287" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4791"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1323706,0,-0.2389802,1.9085433,299.94701,-1.7591455)"
+ x1="32"
+ y1="149"
+ x2="32"
+ y2="142.73804" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4807"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.4947955,0,-1.0115152,8.0781584,-286.22957,-2060.6361)"
+ cx="269.96271"
+ cy="286.11655"
+ fx="269.96271"
+ fy="286.11655"
+ r="3.0674951" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="linearGradient4809"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.2510307,0,-0.3643511,2.9097814,-406.85058,-568.16358)"
+ x1="274"
+ y1="296"
+ x2="274"
+ y2="287" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5970"
+ id="linearGradient4811"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.2510307,0,-0.3643511,2.9097814,331.77619,-157.88434)"
+ x1="32"
+ y1="149"
+ x2="32"
+ y2="142.73804" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4697"
+ cx="28"
+ cy="231.16234"
+ fx="28"
+ fy="231.16234"
+ r="4.9945345"
+ gradientTransform="matrix(2.4026263,0,0,1.6102944,-39.273537,-140.23942)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4701"
+ cx="27.994534"
+ cy="221.00789"
+ fx="27.994534"
+ fy="221.00789"
+ r="5.9945345"
+ gradientTransform="matrix(1.1686423,0,0,1.1679873,-4.721062,-38.134414)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5962"
+ id="linearGradient4713"
+ x1="28"
+ y1="228"
+ x2="28"
+ y2="218"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909092,0,0,1,-420.90912,31.000006)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4724"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,1,-420.90909,31.000006)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4778"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999999,0,0,1.9999999,-740.99995,-173.99998)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4780"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1233922,0,0,2.0989433,21.379839,-258.25979)"
+ cx="27.994534"
+ cy="221.00789"
+ fx="27.994534"
+ fy="221.00789"
+ r="5.9945345" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4782"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9999998,0,0,2,-740.99993,-174)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4792"
+ cx="81.000183"
+ cy="225.79715"
+ fx="81.000183"
+ fy="225.79715"
+ r="9.0001822"
+ gradientTransform="matrix(2.477275,1.562197e-7,-9.4270102e-8,1.4949009,-119.65952,-110.02647)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5962"
+ id="linearGradient4827"
+ x1="82"
+ y1="219"
+ x2="82"
+ y2="200.88924"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4839"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2684988,0,0,1,-470.98723,30.000006)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4841"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4216047,0,0,1.420808,11.197369,-99.874945)"
+ cx="27.994534"
+ cy="221.00789"
+ fx="27.994534"
+ fy="221.00789"
+ r="5.9945345" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4843"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2727273,0,0,1,-472.72727,30.000006)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4845"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.922695,0,0,1.9588563,-30.83428,-224.08144)"
+ cx="28"
+ cy="231.16234"
+ fx="28"
+ fy="231.16234"
+ r="4.9945345" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5962"
+ id="linearGradient4847"
+ gradientUnits="userSpaceOnUse"
+ x1="28"
+ y1="228"
+ x2="28"
+ y2="218"
+ gradientTransform="matrix(1.2164585,0,0,1.2164585,16.940347,-53.486005)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4877"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.539943,2.2890162e-7,-1.347088e-7,2.1904104,-160.88052,-271.64794)"
+ cx="81.000183"
+ cy="225.79715"
+ fx="81.000183"
+ fy="225.79715"
+ r="9.0001822" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5962"
+ id="linearGradient4879"
+ gradientUnits="userSpaceOnUse"
+ x1="82"
+ y1="219"
+ x2="82"
+ y2="200.88924"
+ gradientTransform="matrix(1.6492899,0,0,1.6610903,-7.4988548,-152.0218)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4885"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5454545,0,0,2.9999847,-920.45452,-378.99687)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4887"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.5454543,0,0,3,-920.45448,-379)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4702"
+ cx="126"
+ cy="194.9758"
+ fx="126"
+ fy="194.9758"
+ r="14"
+ gradientTransform="matrix(1.57143,0,0,1.2142857,-72.000177,-44.785714)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient3961"
+ cx="271.40051"
+ cy="456.81781"
+ fx="271.40051"
+ fy="456.81781"
+ r="4.44072"
+ gradientTransform="matrix(2.1361226,0,0,1.8145654,-308.34425,-369.91251)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient3965"
+ cx="271.40051"
+ cy="448.53534"
+ fx="271.40051"
+ fy="448.53534"
+ r="4.44072"
+ gradientTransform="matrix(1.2609439,-3.138426e-6,3.3639786e-6,1.3515655,-70.821825,-160.23548)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5962"
+ id="linearGradient4784"
+ x1="31"
+ y1="312"
+ x2="31"
+ y2="289"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4815"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909092,0,0,1,-177.90912,249.00001)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4817"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0909091,0,0,1,-177.90909,249.00001)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4829"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.3535144,0,0,1.3471468,-312.34452,-172.26434)"
+ cx="271.40051"
+ cy="448.53534"
+ fx="271.40051"
+ fy="448.53534"
+ r="4.44072" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4831"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.9855487,0,0,3.3855916,-755.27932,-1090.3046)"
+ cx="271.40051"
+ cy="456.81781"
+ fx="271.40051"
+ fy="456.81781"
+ r="4.44072" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5962"
+ id="linearGradient4833"
+ gradientUnits="userSpaceOnUse"
+ x1="31"
+ y1="312"
+ x2="31"
+ y2="292.64075"
+ gradientTransform="matrix(1.8610133,0,0,1.8610133,273.54206,-135.60908)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4835"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.9994842,0,0,2,-496.78778,37.00002)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4838"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2,0,0,2,-497,37.00002)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4851"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.413705,0,0,1.953998,-557.11824,-458.34061)"
+ cx="271.40051"
+ cy="448.53534"
+ fx="271.40051"
+ fy="448.53534"
+ r="4.44072" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4853"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(5.7809241,0,0,4.9107038,-1199.5825,-1789.9321)"
+ cx="271.40051"
+ cy="456.81781"
+ fx="271.40051"
+ fy="456.81781"
+ r="4.44072" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5962"
+ id="linearGradient4855"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.6993463,0,0,2.6993463,292.69347,-405.17322)"
+ x1="31"
+ y1="312"
+ x2="31"
+ y2="292.64075" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4857"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.0909092,0,0,3.0000002,-902.90921,-175)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4860"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.0909091,0,0,3,-902.90909,-174.99997)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5803"
+ id="radialGradient4873"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.7037029,-4.0350731e-6,4.5451821e-6,1.737707,-168.38782,-338.43191)"
+ cx="271.40051"
+ cy="448.53534"
+ fx="271.40051"
+ fy="448.53534"
+ r="4.44072" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5652"
+ id="radialGradient4875"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.8812086,0,0,2.3329863,-487.95108,-608.01362)"
+ cx="271.40051"
+ cy="456.81781"
+ fx="271.40051"
+ fy="456.81781"
+ r="4.44072" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5962"
+ id="linearGradient4877"
+ gradientUnits="userSpaceOnUse"
+ x1="31"
+ y1="312"
+ x2="31"
+ y2="294.07007"
+ gradientTransform="matrix(1.3486562,0,0,1.2856997,255.67441,48.866453)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3228"
+ id="linearGradient4881"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4545453,0,0,1,-304.5454,246.00001)"
+ x1="410"
+ y1="205"
+ x2="410"
+ y2="201" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3249"
+ id="linearGradient4883"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4545455,0,0,1,-304.54545,246.00001)"
+ x1="411"
+ y1="203"
+ x2="412.11804"
+ y2="204.93649" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4372"
+ id="linearGradient4816"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3648599,0,0,1.3648599,-302.85836,-97.928698)"
+ x1="778.88196"
+ y1="289.57986"
+ x2="778.88196"
+ y2="284.53162" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#dddddd"
+ borderopacity="1"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.5"
+ inkscape:cx="138.77737"
+ inkscape:cy="401.40908"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4723"
+ showgrid="true"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="true"
+ borderlayer="false"
+ inkscape:showpageshadow="false"
+ showborder="false"
+ inkscape:window-width="804"
+ inkscape:window-height="733"
+ inkscape:window-x="0"
+ inkscape:window-y="402"
+ showguides="true"
+ inkscape:guide-bbox="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2383"
+ visible="true"
+ enabled="true"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="g3901"
+ inkscape:label="icon-ind-more"
+ transform="translate(-243,-141)"
+ style="display:inline">
+ <g
+ inkscape:label="plate9"
+ inkscape:groupmode="layer"
+ id="g3903"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ inkscape:label="48x48"
+ y="624.36218"
+ x="725"
+ height="48"
+ width="48"
+ id="rect3909"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3911"
+ width="32"
+ height="32"
+ x="689"
+ y="640.36218"
+ inkscape:label="32x32" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3913"
+ width="22"
+ height="22"
+ x="663"
+ y="650.36218"
+ inkscape:label="22x22" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3915"
+ width="16"
+ height="16"
+ x="643"
+ y="656.36218"
+ inkscape:label="16x16" />
+ <text
+ id="text3917"
+ y="614.7832"
+ x="644.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ y="614.7832"
+ x="644.55261"
+ sodipodi:role="line"
+ id="tspan4088">format-indent-more</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="644.55261"
+ y="629.7832"
+ id="text3921"
+ inkscape:label="context"><tspan
+ id="tspan3923"
+ sodipodi:role="line"
+ x="644.55261"
+ y="629.7832">actions</tspan></text>
+ </g>
+ <rect
+ y="277.89264"
+ x="557.89258"
+ height="1.214775"
+ width="9.2147789"
+ id="rect4007"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4086);stroke-width:1.78522503;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4084);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4005"
+ width="9"
+ height="1"
+ x="558"
+ y="278" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4082);stroke-width:1.63320971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4015"
+ width="5.3667903"
+ height="1.3667903"
+ x="564.81665"
+ y="282.81659" />
+ <rect
+ y="283"
+ x="565"
+ height="1"
+ width="5"
+ id="rect4017"
+ style="opacity:1;fill:url(#linearGradient4080);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="287.71423"
+ x="564.71429"
+ height="1.571429"
+ width="3.5714247"
+ id="rect4023"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4078);stroke-width:1.42857099;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4076);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4025"
+ width="3"
+ height="1"
+ x="565"
+ y="288" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4074);stroke-width:1.69787419;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4031"
+ width="11.302125"
+ height="1.3021258"
+ x="579.84894"
+ y="272.84894" />
+ <rect
+ y="273"
+ x="580"
+ height="1"
+ width="11"
+ id="rect4033"
+ style="opacity:1;fill:url(#linearGradient4072);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="277.78375"
+ x="588.78381"
+ height="1.4324678"
+ width="6.4324484"
+ id="rect4035"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4070);stroke-width:1.56753206;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4068);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4037"
+ width="6"
+ height="1"
+ x="589"
+ y="278" />
+ <rect
+ y="282.74487"
+ x="588.74487"
+ height="1.510293"
+ width="5.510232"
+ id="rect4055"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4066);stroke-width:1.48970699;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4064);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4057"
+ width="5"
+ height="1"
+ x="589"
+ y="283" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4062);stroke-width:1.64067674;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4039"
+ width="7.4259601"
+ height="1.3593233"
+ x="588.82037"
+ y="287.82031" />
+ <rect
+ y="288"
+ x="589"
+ height="1"
+ width="7"
+ id="rect4041"
+ style="opacity:1;fill:url(#linearGradient4060);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="264"
+ x="609"
+ height="2"
+ width="14.000001"
+ id="rect4063"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4058);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4056);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4065"
+ width="14"
+ height="2"
+ x="609"
+ y="264" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4054);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4095"
+ width="8.9998789"
+ height="2"
+ x="621.00012"
+ y="271" />
+ <rect
+ y="271"
+ x="621"
+ height="2"
+ width="9"
+ id="rect4097"
+ style="opacity:1;fill:url(#linearGradient4052);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4050);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4103"
+ width="8.0463905"
+ height="2"
+ x="621.00012"
+ y="278" />
+ <rect
+ y="278"
+ x="621"
+ height="2"
+ width="8"
+ id="rect4105"
+ style="opacity:1;fill:url(#linearGradient4048);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="285"
+ x="621"
+ height="2"
+ width="10.000001"
+ id="rect4107"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4046);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4044);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4109"
+ width="10"
+ height="2"
+ x="621"
+ y="285" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4042);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2918"
+ width="22"
+ height="3"
+ x="647"
+ y="253" />
+ <rect
+ y="253"
+ x="647"
+ height="3"
+ width="22"
+ id="rect2920"
+ style="opacity:1;fill:url(#linearGradient4040);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="262"
+ x="665"
+ height="3"
+ width="14"
+ id="rect2950"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4038);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4036);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2952"
+ width="14"
+ height="3"
+ x="665"
+ y="262" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4034);stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2958"
+ width="13"
+ height="3"
+ x="665"
+ y="271" />
+ <rect
+ y="271"
+ x="665"
+ height="3"
+ width="13"
+ id="rect2960"
+ style="opacity:1;fill:url(#linearGradient4032);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="280"
+ x="665"
+ height="3"
+ width="15.999999"
+ id="rect2966"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4030);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4028);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2968"
+ width="16"
+ height="3"
+ x="665"
+ y="280" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3771"
+ d="M 556,284 L 561,287.5 L 556,291 L 556,284 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4026);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#radialGradient4024);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 556,284 L 561,287.5 L 556,291 L 556,284 z"
+ id="path2975"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3781"
+ d="M 556,284 L 561,287.5 L 556,287.5 L 556,284 z"
+ style="fill:url(#linearGradient4022);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4020);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 577.00001,277.50001 L 584.00002,282.50001 L 577.00001,287.5 L 577.00001,277.50001 z"
+ id="path3791"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3793"
+ d="M 577.00003,277.6 L 584.00003,282.5 L 577.00003,287.4 L 577.00003,277.6 z"
+ style="fill:url(#radialGradient4018);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4016);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 577.00003,277.6 L 584.00003,282.5 L 577.01566,282.5 L 577.00003,277.6 z"
+ id="path3795"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4014);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 604,270.49997 L 616,278.49998 L 604,286.49998 L 604,270.49997 z"
+ id="path3803"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3805"
+ d="M 604,270.5 L 616,278.5 L 604,286.5 L 604,270.5 z"
+ style="fill:url(#radialGradient4012);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4010);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 604,270.5 L 616,278.5 L 604,278.5 L 604,270.5 z"
+ id="path3807"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3887"
+ d="M 642.00002,261.28569 L 659.00002,272.49999 L 642.00002,283.71427 L 642.00002,261.28569 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4008);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#radialGradient4006);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 642.00004,261.28572 L 659.00004,272.50001 L 642.00004,283.7143 L 642.00004,261.28572 z"
+ id="path3889"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3891"
+ d="M 642.00004,261.28572 L 659.00004,272.50001 L 642.00004,272.50001 L 642.00004,261.28572 z"
+ style="fill:url(#linearGradient4004);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ style="display:inline"
+ transform="translate(-243,-141)"
+ inkscape:label="icon-ind-less"
+ id="g3899"
+ inkscape:groupmode="layer">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g3902"
+ inkscape:groupmode="layer"
+ inkscape:label="plate8">
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3904"
+ width="48"
+ height="48"
+ x="725"
+ y="544.36218"
+ inkscape:label="48x48" />
+ <rect
+ inkscape:label="32x32"
+ y="560.36218"
+ x="689"
+ height="32"
+ width="32"
+ id="rect3906"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ inkscape:label="22x22"
+ y="570.36218"
+ x="663"
+ height="22"
+ width="22"
+ id="rect3908"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ inkscape:label="16x16"
+ y="576.36218"
+ x="643"
+ height="16"
+ width="16"
+ id="rect3910"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="644.55261"
+ y="534.7832"
+ id="text3912"><tspan
+ sodipodi:role="line"
+ x="644.55261"
+ y="534.7832"
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ id="tspan3914">format-indent-less</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text3916"
+ y="549.7832"
+ x="644.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="549.7832"
+ x="644.55261"
+ sodipodi:role="line"
+ id="tspan3918">actions</tspan></text>
+ </g>
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2973);stroke-width:1.78522503;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3920"
+ width="7.2147751"
+ height="1.214775"
+ x="560.89258"
+ y="197.89264" />
+ <rect
+ y="198"
+ x="561"
+ height="1"
+ width="7"
+ id="rect3922"
+ style="opacity:1;fill:url(#linearGradient2971);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="202.81659"
+ x="557.81665"
+ height="1.3667903"
+ width="5.3667903"
+ id="rect3924"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2969);stroke-width:1.63320971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2967);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3926"
+ width="5"
+ height="1"
+ x="558"
+ y="203" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2965);stroke-width:1.42857099;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3928"
+ width="3.5714247"
+ height="1.571429"
+ x="557.71429"
+ y="207.71423" />
+ <rect
+ y="208"
+ x="558"
+ height="1"
+ width="3"
+ id="rect3930"
+ style="opacity:1;fill:url(#linearGradient2963);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="192.84894"
+ x="583.84894"
+ height="1.3021258"
+ width="8.3021259"
+ id="rect3932"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2961);stroke-width:1.69787419;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2959);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3934"
+ width="8"
+ height="1"
+ x="584"
+ y="193" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2957);stroke-width:1.56753206;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3936"
+ width="6.4324484"
+ height="1.4324678"
+ x="576.78381"
+ y="197.78375" />
+ <rect
+ y="198"
+ x="577"
+ height="1"
+ width="6"
+ id="rect3938"
+ style="opacity:1;fill:url(#linearGradient2955);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2953);stroke-width:1.48970699;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3940"
+ width="5.510232"
+ height="1.510293"
+ x="576.74487"
+ y="202.74487" />
+ <rect
+ y="203"
+ x="577"
+ height="1"
+ width="5"
+ id="rect3942"
+ style="opacity:1;fill:url(#linearGradient2951);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="207.82031"
+ x="576.82037"
+ height="1.3593233"
+ width="7.4259601"
+ id="rect3944"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2949);stroke-width:1.64067674;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2947);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3946"
+ width="7"
+ height="1"
+ x="577"
+ y="208" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2945);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3948"
+ width="11.999986"
+ height="2"
+ x="614"
+ y="184" />
+ <rect
+ y="184"
+ x="614"
+ height="2"
+ width="12"
+ id="rect3950"
+ style="opacity:1;fill:url(#linearGradient2943);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="191"
+ x="604.00012"
+ height="2"
+ width="8.9998789"
+ id="rect3952"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2941);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2939);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3954"
+ width="9"
+ height="2"
+ x="604"
+ y="191" />
+ <rect
+ y="198"
+ x="604.00012"
+ height="2"
+ width="8.0463905"
+ id="rect3956"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2937);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2935);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3958"
+ width="8"
+ height="2"
+ x="604"
+ y="198" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2932);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3960"
+ width="10.000001"
+ height="2"
+ x="604"
+ y="205" />
+ <rect
+ y="205"
+ x="604"
+ height="2"
+ width="10"
+ id="rect3962"
+ style="opacity:1;fill:url(#linearGradient2930);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="173"
+ x="658"
+ height="3"
+ width="18"
+ id="rect3964"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2928);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2926);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3966"
+ width="18"
+ height="3"
+ x="658"
+ y="173" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2924);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3968"
+ width="14"
+ height="3"
+ x="643"
+ y="182" />
+ <rect
+ y="182"
+ x="643"
+ height="3"
+ width="14"
+ id="rect3970"
+ style="opacity:1;fill:url(#linearGradient2922);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="191"
+ x="643"
+ height="3"
+ width="13"
+ id="rect3972"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2920);stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2918);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3974"
+ width="13"
+ height="3"
+ x="643"
+ y="191" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2916);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3976"
+ width="15.999999"
+ height="3"
+ x="643"
+ y="200" />
+ <rect
+ y="200"
+ x="643"
+ height="3"
+ width="16"
+ id="rect3978"
+ style="opacity:1;fill:url(#linearGradient2914);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3779);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 570,204 L 565,207.5 L 570,211 L 570,204 z"
+ id="path3980"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3982"
+ d="M 570,204 L 565,207.5 L 570,211 L 570,204 z"
+ style="fill:url(#radialGradient3769);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient3789);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 570,204 L 565,207.5 L 570,207.5 L 570,204 z"
+ id="path3984"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3986"
+ d="M 595.00002,197.50001 L 588.00001,202.50001 L 595.00002,207.5 L 595.00002,197.50001 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3797);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#radialGradient3799);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 595,197.6 L 588,202.5 L 595,207.4 L 595,197.6 z"
+ id="path3988"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3990"
+ d="M 595,197.6 L 588,202.5 L 594.98437,202.5 L 595,197.6 z"
+ style="fill:url(#linearGradient3801);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3992"
+ d="M 630,190.49997 L 618,198.49998 L 630,206.49998 L 630,190.49997 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3809);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#radialGradient3811);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 630,190.5 L 618,198.5 L 630,206.5 L 630,190.5 z"
+ id="path3994"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path3996"
+ d="M 630,190.5 L 618,198.5 L 630,198.5 L 630,190.5 z"
+ style="fill:url(#linearGradient3813);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3893);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 680.00002,181.28569 L 663.00002,192.49999 L 680.00002,203.71427 L 680.00002,181.28569 z"
+ id="path3998"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path4000"
+ d="M 680,181.28572 L 663,192.50001 L 680,203.7143 L 680,181.28572 z"
+ style="fill:url(#radialGradient3895);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient3897);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 680,181.28572 L 663,192.50001 L 680,192.50001 L 680,181.28572 z"
+ id="path4002"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <g
+ style="display:inline"
+ transform="translate(-243,-141)"
+ inkscape:label="icon-linespace3"
+ id="g2834"
+ inkscape:groupmode="layer">
+ <path
+ id="path4738"
+ d="M 781.99992,593.99999 L 781.99991,593.49998 L 780.99991,593.49997 L 780.99991,577.50002 L 781.9999,577.50001 L 781.99992,577.00001 L 783.99993,576.99999 L 783.99991,577.99999 L 781.99993,578.00002 L 781.99993,582 L 783.99992,581.99999 L 783.99993,582.99999 L 781.9999,582.99998 L 781.99992,587.99998 L 783.99993,588 L 783.99991,588.99998 L 781.99993,588.99999 L 781.99991,593 L 783.99992,593 L 783.99992,593.99999 L 781.99992,593.99999 z"
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient5954);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path4742"
+ d="M 761.95139,580.04856 L 761.9514,580.54856 L 760.95139,580.54855 L 760.9514,592.54857 L 761.95139,592.54856 L 761.95139,593.04856 L 762.95139,593.04855 L 762.95139,592.04857 L 761.95139,592.04857 L 761.95139,587.04855 L 762.95137,587.04855 L 762.95138,586.04856 L 761.95138,586.04855 L 761.9514,581.04856 L 762.95139,581.04856 L 762.95139,580.04856 L 761.95139,580.04856 z"
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient5950);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path4748"
+ d="M 808.99993,612.00002 L 808.99993,611.50003 L 807.99991,611.50001 L 807.99991,590.50003 L 808.99992,590.50003 L 808.99993,590.00002 L 811.99995,590 L 811.99993,591.00002 L 808.99993,591 L 808.99993,597.00004 L 811.99994,597.00003 L 811.99995,598.00002 L 808.99993,598.00001 L 808.99995,604 L 811.99995,604.00002 L 811.99995,605.00001 L 808.99993,605.00001 L 808.99993,611.00005 L 811.99995,611.00002 L 811.99994,612.00001 L 808.99993,612.00002 z"
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient5944);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path4754"
+ d="M 845.99997,642 L 845.99997,641.49998 L 844.99995,641.5 L 844.99999,604.50001 L 845.99996,604.5 L 845.99995,604 L 850.99997,604 L 850.99997,605.00003 L 845.99997,604.99999 L 845.99997,616.00003 L 850.99996,616 L 850.99999,616.99999 L 845.99997,616.99998 L 845.99999,629 L 850.99995,628.99997 L 850.99997,629.99998 L 845.99998,629.99998 L 845.99996,640.99997 L 850.99999,641 L 850.99997,642 L 845.99997,642 z"
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient5938);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g2836"
+ inkscape:groupmode="layer"
+ inkscape:label="plate10">
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="849.55261"
+ y="869.7832"
+ id="text2846"><tspan
+ sodipodi:role="line"
+ x="849.55261"
+ y="869.7832"
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ id="tspan2848">format-line-spacing-triple</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text2850"
+ y="884.7832"
+ x="849.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="884.7832"
+ x="849.55261"
+ sodipodi:role="line"
+ id="tspan2852">actions</tspan></text>
+ <rect
+ inkscape:label="22x22"
+ y="955.36218"
+ x="868"
+ height="22"
+ width="22"
+ id="rect4075"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ inkscape:label="16x16"
+ y="959.36218"
+ x="848"
+ height="16"
+ width="16"
+ id="rect4215"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ inkscape:label="32x32"
+ y="965.36218"
+ x="894"
+ height="32"
+ width="32"
+ id="rect4293"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4629"
+ width="48"
+ height="48"
+ x="930"
+ y="979.36218"
+ inkscape:label="48x48" />
+ </g>
+ <path
+ style="fill:url(#linearGradient5854);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 782.04852,593.95145 L 782.04853,593.45143 L 781.04852,593.45143 L 781.04852,577.45145 L 782.04852,577.45145 L 782.04854,576.95145 L 784.04854,576.95144 L 784.04852,577.95144 L 782.04854,577.95145 L 782.04853,581.95145 L 784.04852,581.95144 L 784.04852,582.95144 L 782.04851,582.95144 L 782.04853,587.95143 L 784.04854,587.95145 L 784.04852,588.95143 L 782.04854,588.95144 L 782.04852,592.95145 L 784.04853,592.95145 L 784.04853,593.95144 L 782.04852,593.95145 z"
+ id="rect4093" />
+ <path
+ style="fill:url(#linearGradient5850);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 762,580 L 762,580.5 L 761,580.5 L 761,592.5 L 762,592.5 L 762,593 L 763,593 L 763,592 L 762,592 L 762,587 L 763,587 L 763,586 L 762,586 L 762,581 L 763,581 L 763,580 L 762,580 z"
+ id="rect4251" />
+ <rect
+ y="577"
+ x="786"
+ height="1"
+ width="13.999999"
+ id="rect4077"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5846);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5844);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4079"
+ width="14"
+ height="1"
+ x="786"
+ y="577" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5842);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4081"
+ width="13.999906"
+ height="1"
+ x="786"
+ y="582" />
+ <rect
+ y="582"
+ x="786"
+ height="1"
+ width="14"
+ id="rect4083"
+ style="opacity:1;fill:url(#linearGradient5840);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5838);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4085"
+ width="13.999938"
+ height="1"
+ x="786"
+ y="588" />
+ <rect
+ y="588"
+ x="786"
+ height="1"
+ width="14"
+ id="rect4087"
+ style="opacity:1;fill:url(#linearGradient5836);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="593"
+ x="786"
+ height="1"
+ width="13.999938"
+ id="rect4089"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5834);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5832);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4091"
+ width="14"
+ height="1"
+ x="786"
+ y="593" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5818);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4217"
+ width="10"
+ height="1"
+ x="765"
+ y="592" />
+ <rect
+ y="592"
+ x="765"
+ height="1"
+ width="10"
+ id="rect4219"
+ style="opacity:1;fill:url(#linearGradient5816);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="586"
+ x="765"
+ height="1"
+ width="9.999999"
+ id="rect4221"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5814);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5812);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4223"
+ width="10"
+ height="1"
+ x="765"
+ y="586" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5810);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4225"
+ width="10"
+ height="1"
+ x="765"
+ y="580" />
+ <rect
+ y="580"
+ x="765"
+ height="1"
+ width="10"
+ id="rect4227"
+ style="opacity:1;fill:url(#linearGradient5808);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5790);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4295"
+ width="22"
+ height="2"
+ x="814"
+ y="589" />
+ <rect
+ y="589"
+ x="814"
+ height="2"
+ width="22"
+ id="rect4297"
+ style="opacity:1;fill:url(#linearGradient5788);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="596"
+ x="814.00012"
+ height="2"
+ width="21.999796"
+ id="rect4299"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5786);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5784);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4301"
+ width="22"
+ height="2"
+ x="814"
+ y="596" />
+ <rect
+ y="603"
+ x="814.00012"
+ height="2"
+ width="21.999796"
+ id="rect4303"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5782);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5780);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4305"
+ width="22"
+ height="2"
+ x="814"
+ y="603" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5778);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4307"
+ width="21.999912"
+ height="2"
+ x="814"
+ y="610" />
+ <rect
+ y="610"
+ x="814"
+ height="2"
+ width="22"
+ id="rect4309"
+ style="opacity:1;fill:url(#linearGradient5776);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient5772);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 809.04855,611.95147 L 809.04853,611.45148 L 808.04853,611.45146 L 808.04853,590.45147 L 809.04854,590.45147 L 809.04855,589.95147 L 812.04855,589.95146 L 812.04855,590.95147 L 809.04855,590.95146 L 809.04855,596.95149 L 812.04855,596.95148 L 812.04856,597.95147 L 809.04854,597.95146 L 809.04856,603.95146 L 812.04856,603.95147 L 812.04856,604.95146 L 809.04855,604.95145 L 809.04853,610.95149 L 812.04855,610.95147 L 812.04856,611.95145 L 809.04855,611.95147 z"
+ id="rect4462" />
+ <rect
+ y="603"
+ x="855.01562"
+ height="3"
+ width="31.984375"
+ id="rect4631"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5750);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5748);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4633"
+ width="32"
+ height="3"
+ x="855"
+ y="603" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5746);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4635"
+ width="32.000023"
+ height="3"
+ x="855"
+ y="615" />
+ <rect
+ y="615"
+ x="855"
+ height="3"
+ width="32"
+ id="rect4637"
+ style="opacity:1;fill:url(#linearGradient5744);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="628"
+ x="855"
+ height="3"
+ width="32"
+ id="rect4639"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5742);stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5740);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4641"
+ width="32"
+ height="3"
+ x="855"
+ y="628" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5738);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4643"
+ width="31.999998"
+ height="3"
+ x="855"
+ y="640" />
+ <rect
+ y="640"
+ x="855"
+ height="3"
+ width="32"
+ id="rect4645"
+ style="opacity:1;fill:url(#linearGradient5736);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient5734);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 846.04857,641.95146 L 846.04857,641.45144 L 845.04856,641.45145 L 845.04858,604.45147 L 846.04857,604.45146 L 846.04857,603.95146 L 851.04858,603.95145 L 851.04858,604.95147 L 846.04857,604.95144 L 846.04859,615.95147 L 851.04857,615.95144 L 851.04858,616.95145 L 846.04858,616.95144 L 846.04859,628.95146 L 851.04857,628.95145 L 851.04858,629.95145 L 846.04859,629.95145 L 846.04857,640.95143 L 851.04859,640.95146 L 851.04858,641.95146 L 846.04857,641.95146 z"
+ id="rect4647" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="g5470"
+ inkscape:label="icon-linespace2"
+ transform="translate(-243,-141)"
+ style="display:inline">
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient5464);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 601.99993,567.00003 L 601.99993,566.50003 L 600.99992,566.50003 L 600.9999,554.50002 L 601.99992,554.50002 L 601.99992,554.00001 L 603.99991,554.00003 L 603.99991,555.00003 L 601.99991,555.00001 L 601.99994,558.00002 L 603.99991,557.99999 L 603.99992,559.00001 L 601.99991,559.00001 L 601.99993,562.00002 L 603.99992,562.00003 L 603.99992,563.00001 L 601.9999,563.00003 L 601.9999,566.00001 L 603.99992,566.00001 L 603.99992,567.00003 L 601.99993,567.00003 z"
+ id="path5476" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient5460);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 581.9514,557.04856 L 581.95139,557.54857 L 580.95139,557.54857 L 580.95138,565.54856 L 581.95138,565.54856 L 581.9514,566.04857 L 582.95138,566.04856 L 582.95138,565.04856 L 581.95138,565.04856 L 581.95139,562.04855 L 582.95139,562.04856 L 582.95139,561.04857 L 581.95139,561.04857 L 581.95139,558.04855 L 582.95138,558.04856 L 582.95139,557.04855 L 581.9514,557.04856 z"
+ id="path5480" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient5454);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 628.99996,577.00001 L 628.99995,576.50001 L 627.99993,576.5 L 627.99994,555.50001 L 628.99996,555.50001 L 628.99996,555.00002 L 631.99995,555 L 631.99994,556.00003 L 628.99994,556.00003 L 628.99992,562.00001 L 631.99994,562.00001 L 631.99994,563.00002 L 628.99994,563.00002 L 628.99994,569.00001 L 631.99993,569.00002 L 631.99993,570.00003 L 628.99993,570.00001 L 628.99994,576 L 631.99993,576.00001 L 631.99993,577.00004 L 628.99996,577.00001 z"
+ id="path5486" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient5448);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 666,587 L 665.99999,586.49999 L 664.99995,586.50001 L 664.99994,559.5 L 665.99995,559.5 L 665.99995,558.99999 L 670.99996,559 L 670.99996,559.99999 L 665.99993,559.99999 L 665.99998,568.00002 L 670.99995,568.00001 L 670.99997,569 L 665.99992,568.99999 L 665.99997,577.00001 L 670.99998,577.00001 L 670.99995,577.99999 L 665.99996,578 L 665.99999,585.99998 L 670.99997,586 L 670.99999,587.00001 L 666,587 z"
+ id="path5492" />
+ <g
+ inkscape:label="plate9#1"
+ inkscape:groupmode="layer"
+ id="g5496"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <text
+ id="text5506"
+ y="869.7832"
+ x="669.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ id="tspan5508"
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ y="869.7832"
+ x="669.55261"
+ sodipodi:role="line">format-line-spacing-double</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="669.55261"
+ y="884.7832"
+ id="text5510"
+ inkscape:label="context"><tspan
+ id="tspan5512"
+ sodipodi:role="line"
+ x="669.55261"
+ y="884.7832">actions</tspan></text>
+ <rect
+ inkscape:label="22x22"
+ y="930.36218"
+ x="688"
+ height="22"
+ width="22"
+ id="rect5514"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ inkscape:label="16x16"
+ y="934.36218"
+ x="668"
+ height="16"
+ width="16"
+ id="rect5518"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ inkscape:label="32x32"
+ y="930.36218"
+ x="714"
+ height="32"
+ width="32"
+ id="rect5522"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5526"
+ width="48"
+ height="48"
+ x="750"
+ y="929.36218"
+ inkscape:label="48x48" />
+ </g>
+ <rect
+ y="554"
+ x="606"
+ height="1"
+ width="13.999999"
+ id="rect5590"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5384);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5382);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5592"
+ width="14"
+ height="1"
+ x="606"
+ y="554" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5380);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5594"
+ width="13.999906"
+ height="1"
+ x="606"
+ y="558" />
+ <rect
+ y="558"
+ x="606"
+ height="1"
+ width="14"
+ id="rect5596"
+ style="opacity:1;fill:url(#linearGradient5378);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5376);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5598"
+ width="13.999938"
+ height="1"
+ x="606"
+ y="562" />
+ <rect
+ y="562"
+ x="606"
+ height="1"
+ width="14"
+ id="rect5600"
+ style="opacity:1;fill:url(#linearGradient5374);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="566"
+ x="606"
+ height="1"
+ width="13.999938"
+ id="rect5602"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5372);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5370);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5604"
+ width="14"
+ height="1"
+ x="606"
+ y="566" />
+ <path
+ id="path5610"
+ d="M 602.04854,566.95147 L 602.04853,566.45147 L 601.04853,566.45146 L 601.04853,554.45147 L 602.04853,554.45146 L 602.04852,553.95145 L 604.04852,553.95147 L 604.04853,554.95147 L 602.04853,554.95145 L 602.04855,557.95146 L 604.04851,557.95144 L 604.04853,558.95145 L 602.04852,558.95145 L 602.04854,561.95147 L 604.04853,561.95146 L 604.04853,562.95146 L 602.04852,562.95147 L 602.04851,565.95146 L 604.04853,565.95145 L 604.04853,566.95147 L 602.04854,566.95147 z"
+ style="fill:url(#linearGradient5364);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path5614"
+ d="M 582,557 L 582,557.5 L 581,557.5 L 581,565.5 L 582,565.5 L 582,566 L 583,566 L 583,565 L 582,565 L 582,562 L 583,562 L 583,561 L 582,561 L 582,558 L 583,558 L 583,557 L 582,557 z"
+ style="fill:url(#linearGradient5360);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5338);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5636"
+ width="10"
+ height="1"
+ x="585"
+ y="565" />
+ <rect
+ y="565"
+ x="585"
+ height="1"
+ width="10"
+ id="rect5638"
+ style="opacity:1;fill:url(#linearGradient5336);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="561"
+ x="585"
+ height="1"
+ width="9.999999"
+ id="rect5640"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5334);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5332);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5642"
+ width="10"
+ height="1"
+ x="585"
+ y="561" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5330);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5644"
+ width="10"
+ height="1"
+ x="585"
+ y="557" />
+ <rect
+ y="557"
+ x="585"
+ height="1"
+ width="10"
+ id="rect5646"
+ style="opacity:1;fill:url(#linearGradient5328);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5314);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5660"
+ width="22"
+ height="2"
+ x="634"
+ y="554" />
+ <rect
+ y="554"
+ x="634"
+ height="2"
+ width="22"
+ id="rect5662"
+ style="opacity:1;fill:url(#linearGradient5312);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="561"
+ x="634.00012"
+ height="2"
+ width="21.999796"
+ id="rect5664"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5310);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5308);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5666"
+ width="22"
+ height="2"
+ x="634"
+ y="561" />
+ <rect
+ y="568"
+ x="634.00012"
+ height="2"
+ width="21.999796"
+ id="rect5668"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5306);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5304);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5670"
+ width="22"
+ height="2"
+ x="634"
+ y="568" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5302);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5672"
+ width="21.999912"
+ height="2"
+ x="634"
+ y="575" />
+ <rect
+ y="575"
+ x="634"
+ height="2"
+ width="22"
+ id="rect5674"
+ style="opacity:1;fill:url(#linearGradient5300);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path5692"
+ d="M 629.04856,576.95147 L 629.04856,576.45146 L 628.04856,576.45145 L 628.04855,555.45145 L 629.04857,555.45146 L 629.04856,554.95147 L 632.04856,554.95145 L 632.04855,555.95147 L 629.04856,555.95146 L 629.04854,561.95146 L 632.04855,561.95146 L 632.04855,562.95147 L 629.04854,562.95147 L 629.04854,568.95145 L 632.04855,568.95147 L 632.04855,569.95148 L 629.04854,569.95146 L 629.04855,575.95145 L 632.04855,575.95146 L 632.04855,576.95147 L 629.04856,576.95147 z"
+ style="fill:url(#linearGradient5282);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="558"
+ x="675.01562"
+ height="3"
+ width="31.984375"
+ id="rect5698"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5276);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5274);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5700"
+ width="32"
+ height="3"
+ x="675"
+ y="558" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5272);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5702"
+ width="32.000023"
+ height="3"
+ x="675"
+ y="567" />
+ <rect
+ y="567"
+ x="675"
+ height="3"
+ width="32"
+ id="rect5704"
+ style="opacity:1;fill:url(#linearGradient5270);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="576"
+ x="675"
+ height="3"
+ width="32"
+ id="rect5706"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5268);stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient5266);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5708"
+ width="32"
+ height="3"
+ x="675"
+ y="576" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient5264);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5710"
+ width="31.999998"
+ height="3"
+ x="675"
+ y="585" />
+ <rect
+ y="585"
+ x="675"
+ height="3"
+ width="32"
+ id="rect5712"
+ style="opacity:1;fill:url(#linearGradient5262);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path5714"
+ d="M 666.0486,586.95146 L 666.04859,586.45145 L 665.04857,586.45146 L 665.04856,559.45146 L 666.04857,559.45145 L 666.04857,558.95144 L 671.04858,558.95144 L 671.04858,559.95144 L 666.04856,559.95145 L 666.04859,567.95146 L 671.04858,567.95145 L 671.04859,568.95146 L 666.04855,568.95145 L 666.04858,576.95146 L 671.0486,576.95146 L 671.04857,577.95144 L 666.04858,577.95145 L 666.0486,585.95142 L 671.04858,585.95146 L 671.04859,586.95146 L 666.0486,586.95146 z"
+ style="fill:url(#linearGradient5260);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="g4978"
+ inkscape:label="icon-linespace1"
+ transform="translate(-243,-141)"
+ style="display:inline">
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient4940);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 406.95139,536.04855 L 406.9514,536.54856 L 405.95138,536.54855 L 405.95139,540.54855 L 406.95139,540.54856 L 406.95139,541.04855 L 407.95139,541.04856 L 407.95139,540.04857 L 406.95139,540.04855 L 406.95139,539.04857 L 407.9514,539.04857 L 407.95139,538.04855 L 406.9514,538.04855 L 406.95139,537.04856 L 407.95138,537.04855 L 407.95138,536.04855 L 406.95139,536.04855 z"
+ id="path4980" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient4937);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 426.99991,541.00001 L 426.99991,540.50002 L 425.99993,540.50003 L 425.99991,531.50004 L 426.99991,531.50002 L 426.99993,531 L 428.99993,531.00001 L 428.99992,532.00001 L 426.99992,532 L 426.99994,534.00002 L 428.99993,534.00003 L 428.9999,535.00002 L 426.99991,535.00002 L 426.99992,537.00002 L 428.99991,537.00003 L 428.99992,538.00002 L 426.99993,538.00003 L 426.99993,540.00001 L 428.99992,540.00003 L 428.99993,541.00001 L 426.99991,541.00001 z"
+ id="path4982" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient4922);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 453.99995,538 L 453.99996,537.50001 L 452.99993,537.50001 L 452.99991,525.50002 L 453.99992,525.50002 L 453.99994,525.00002 L 456.99991,525.00003 L 456.99992,526.00003 L 453.99992,526.00002 L 453.99993,529.00003 L 456.99993,529.00005 L 456.99993,530.00003 L 453.99994,530.00005 L 453.99994,533.00002 L 456.99993,533.00002 L 456.99994,534.00002 L 453.99993,534.00001 L 453.99992,537.00004 L 456.99994,537.00004 L 456.99992,538.00003 L 453.99995,538 z"
+ id="path4992" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:url(#linearGradient4913);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 490.99995,532.00001 L 490.99995,531.50001 L 489.99994,531.5 L 489.99996,513.50002 L 490.99996,513.50001 L 490.99997,513.00001 L 495.99996,513.00006 L 495.99993,514.00005 L 490.99995,514.00001 L 490.99995,519.00001 L 495.99995,519.00003 L 495.99996,519.99999 L 490.99996,520.00003 L 490.99995,525.00002 L 495.99997,525 L 495.99997,526.00003 L 490.99995,526.00002 L 490.99995,531.00003 L 495.99996,531.00001 L 495.99996,532 L 490.99995,532.00001 z"
+ id="path4998" />
+ <g
+ inkscape:label="plate7"
+ inkscape:groupmode="layer"
+ id="g5004"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ inkscape:label="48x48"
+ y="879.36218"
+ x="575"
+ height="48"
+ width="48"
+ id="rect5006"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5008"
+ width="32"
+ height="32"
+ x="539"
+ y="895.36218"
+ inkscape:label="32x32" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5010"
+ width="22"
+ height="22"
+ x="513"
+ y="905.36218"
+ inkscape:label="22x22" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5012"
+ width="16"
+ height="16"
+ x="493"
+ y="911.36218"
+ inkscape:label="16x16" />
+ <text
+ id="text5014"
+ y="869.7832"
+ x="494.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ id="tspan5016"
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ y="869.7832"
+ x="494.55261"
+ sodipodi:role="line">format-line-spacing-normal</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="494.55261"
+ y="884.7832"
+ id="text5018"
+ inkscape:label="context"><tspan
+ id="tspan5020"
+ sodipodi:role="line"
+ x="494.55261"
+ y="884.7832">actions</tspan></text>
+ </g>
+ <rect
+ y="540"
+ x="410"
+ height="1"
+ width="10"
+ id="rect5038"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3179);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3177);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5040"
+ width="10"
+ height="1"
+ x="410"
+ y="540" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3175);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5042"
+ width="13.999999"
+ height="1"
+ x="431"
+ y="531" />
+ <rect
+ y="531"
+ x="431"
+ height="1"
+ width="14"
+ id="rect5044"
+ style="opacity:1;fill:url(#linearGradient3173);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="534"
+ x="431"
+ height="1"
+ width="13.999906"
+ id="rect5046"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3171);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3169);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5048"
+ width="14"
+ height="1"
+ x="431"
+ y="534" />
+ <rect
+ y="537"
+ x="431.00003"
+ height="1"
+ width="13.999938"
+ id="rect5050"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3167);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3165);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5052"
+ width="14"
+ height="1"
+ x="431"
+ y="537" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3163);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5054"
+ width="13.999938"
+ height="1"
+ x="431"
+ y="540" />
+ <rect
+ y="540"
+ x="431"
+ height="1"
+ width="14"
+ id="rect5056"
+ style="opacity:1;fill:url(#linearGradient3161);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="524"
+ x="459"
+ height="2"
+ width="22"
+ id="rect5058"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3159);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3157);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5060"
+ width="22"
+ height="2"
+ x="459"
+ y="524" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3155);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5062"
+ width="21.999796"
+ height="2"
+ x="459.00012"
+ y="528" />
+ <rect
+ y="528"
+ x="459"
+ height="2"
+ width="22"
+ id="rect5064"
+ style="opacity:1;fill:url(#linearGradient3153);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3151);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5066"
+ width="21.999796"
+ height="2"
+ x="459.00012"
+ y="532" />
+ <rect
+ y="532"
+ x="459"
+ height="2"
+ width="22"
+ id="rect5068"
+ style="opacity:1;fill:url(#linearGradient3149);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="536"
+ x="459"
+ height="2"
+ width="21.999912"
+ id="rect5070"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3147);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3145);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5072"
+ width="22"
+ height="2"
+ x="459"
+ y="536" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3143);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5074"
+ width="31.984375"
+ height="3"
+ x="500.01562"
+ y="512" />
+ <rect
+ y="512"
+ x="500"
+ height="3"
+ width="32"
+ id="rect5076"
+ style="opacity:1;fill:url(#linearGradient3141);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="518"
+ x="500"
+ height="3"
+ width="32.000023"
+ id="rect5078"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3139);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3137);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5080"
+ width="32"
+ height="3"
+ x="500"
+ y="518" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3135);stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5082"
+ width="32"
+ height="3"
+ x="500"
+ y="524" />
+ <rect
+ y="524"
+ x="500"
+ height="3"
+ width="32"
+ id="rect5084"
+ style="opacity:1;fill:url(#linearGradient3133);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="530"
+ x="500"
+ height="3"
+ width="31.999998"
+ id="rect5086"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3131);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3129);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5088"
+ width="32"
+ height="3"
+ x="500"
+ y="530" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3184);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5090"
+ width="9.999999"
+ height="1"
+ x="410"
+ y="538" />
+ <rect
+ y="538"
+ x="410"
+ height="1"
+ width="10"
+ id="rect5092"
+ style="opacity:1;fill:url(#linearGradient3181);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="536"
+ x="410"
+ height="1"
+ width="10"
+ id="rect5094"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3188);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3186);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5096"
+ width="10"
+ height="1"
+ x="410"
+ y="536" />
+ <path
+ id="path5114"
+ transform="translate(243,141)"
+ d="M 164,395 L 164,395.5 L 163,395.5 L 163,399.5 L 164,399.5 L 164,400 L 165,400 L 165,399 L 164,399 L 164,398 L 165,398 L 165,397 L 164,397 L 164,396 L 165,396 L 165,395 L 164,395 z"
+ style="fill:url(#linearGradient4704);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path5116"
+ d="M 427.04853,540.95146 L 427.04852,540.45146 L 426.04854,540.45146 L 426.04852,531.45148 L 427.04852,531.45145 L 427.04854,530.95145 L 429.04854,530.95145 L 429.04853,531.95145 L 427.04853,531.95144 L 427.04854,533.95147 L 429.04853,533.95146 L 429.04852,534.95146 L 427.04852,534.95146 L 427.04853,536.95146 L 429.04852,536.95146 L 429.04853,537.95146 L 427.04854,537.95147 L 427.04854,539.95146 L 429.04854,539.95146 L 429.04853,540.95146 L 427.04853,540.95146 z"
+ style="fill:url(#linearGradient4714);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path5126"
+ d="M 454.04856,537.95146 L 454.04856,537.45146 L 453.04854,537.45145 L 453.04853,525.45146 L 454.04854,525.45146 L 454.04856,524.95146 L 457.04854,524.95146 L 457.04855,525.95146 L 454.04854,525.95146 L 454.04855,528.95147 L 457.04854,528.95148 L 457.04854,529.95147 L 454.04857,529.95149 L 454.04856,532.95148 L 457.04856,532.95146 L 457.04857,533.95146 L 454.04855,533.95145 L 454.04854,536.95148 L 457.04856,536.95148 L 457.04855,537.95147 L 454.04856,537.95146 z"
+ style="fill:url(#linearGradient4722);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path5204"
+ d="M 490.99998,532.00001 L 490.99998,531.50001 L 489.99998,531.5 L 489.99999,513.50001 L 491,513.5 L 491,513 L 495.99998,513.00004 L 495.99998,514.00004 L 491,514 L 490.99998,519.00001 L 495.99999,519.00001 L 495.99999,519.99999 L 490.99999,520.00002 L 490.99998,525.00002 L 496,525.00001 L 495.99999,526.00003 L 490.99997,526.00002 L 490.99998,531.00001 L 495.99999,531.00002 L 495.99998,532 L 490.99998,532.00001 z"
+ style="fill:url(#linearGradient4730);fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="g3049"
+ inkscape:label="icon-fill"
+ transform="translate(-243,-141)"
+ style="display:inline">
+ <g
+ inkscape:label="plate7"
+ inkscape:groupmode="layer"
+ id="g3051"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ inkscape:label="48x48"
+ y="789.36218"
+ x="575"
+ height="48"
+ width="48"
+ id="rect3053"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3055"
+ width="32"
+ height="32"
+ x="539"
+ y="805.36218"
+ inkscape:label="32x32" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3057"
+ width="22"
+ height="22"
+ x="513"
+ y="815.36218"
+ inkscape:label="22x22" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3059"
+ width="16"
+ height="16"
+ x="493"
+ y="821.36218"
+ inkscape:label="16x16" />
+ <text
+ id="text3061"
+ y="779.7832"
+ x="494.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ id="tspan3063"
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ y="779.7832"
+ x="494.55261"
+ sodipodi:role="line">format-justify-fill</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="494.55261"
+ y="794.7832"
+ id="text3065"
+ inkscape:label="context"><tspan
+ id="tspan3067"
+ sodipodi:role="line"
+ x="494.55261"
+ y="794.7832">actions</tspan></text>
+ </g>
+ <rect
+ y="443"
+ x="408"
+ height="1"
+ width="11"
+ id="rect3069"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4234);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4232);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3071"
+ width="11"
+ height="1"
+ x="408"
+ y="443" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4230);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3073"
+ width="10.999999"
+ height="1"
+ x="408"
+ y="448" />
+ <rect
+ y="448"
+ x="408"
+ height="1"
+ width="11"
+ id="rect3075"
+ style="opacity:1;fill:url(#linearGradient4228);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="453"
+ x="408"
+ height="1"
+ width="11"
+ id="rect3077"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4226);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4224);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3079"
+ width="11"
+ height="1"
+ x="408"
+ y="453" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4222);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3081"
+ width="15"
+ height="1"
+ x="429"
+ y="438" />
+ <rect
+ y="438"
+ x="429"
+ height="1"
+ width="15"
+ id="rect3083"
+ style="opacity:1;fill:url(#linearGradient4220);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="443"
+ x="429.00003"
+ height="1"
+ width="14.9999"
+ id="rect3085"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4218);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4216);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3087"
+ width="15"
+ height="1"
+ x="429"
+ y="443" />
+ <rect
+ y="448"
+ x="429.00006"
+ height="1"
+ width="14.999934"
+ id="rect3089"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4214);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4212);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3091"
+ width="15"
+ height="1"
+ x="429"
+ y="448" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4210);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3093"
+ width="14.999934"
+ height="1"
+ x="429.00003"
+ y="453" />
+ <rect
+ y="453"
+ x="429"
+ height="1"
+ width="15"
+ id="rect3095"
+ style="opacity:1;fill:url(#linearGradient4208);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="429"
+ x="456"
+ height="2"
+ width="22"
+ id="rect3097"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4206);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4204);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3099"
+ width="22"
+ height="2"
+ x="456"
+ y="429" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4202);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3101"
+ width="21.999796"
+ height="2"
+ x="456.00012"
+ y="436" />
+ <rect
+ y="436"
+ x="456"
+ height="2"
+ width="22"
+ id="rect3103"
+ style="opacity:1;fill:url(#linearGradient4200);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4198);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3105"
+ width="21.999796"
+ height="2"
+ x="456.00012"
+ y="443" />
+ <rect
+ y="443"
+ x="456"
+ height="2"
+ width="22"
+ id="rect3107"
+ style="opacity:1;fill:url(#linearGradient4196);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="450"
+ x="456"
+ height="2"
+ width="21.999912"
+ id="rect3109"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4194);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4192);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3111"
+ width="22"
+ height="2"
+ x="456"
+ y="450" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4190);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3113"
+ width="31.984375"
+ height="3"
+ x="496.01562"
+ y="418" />
+ <rect
+ y="418"
+ x="496"
+ height="3"
+ width="32"
+ id="rect3115"
+ style="opacity:1;fill:url(#linearGradient4188);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="427"
+ x="496"
+ height="3"
+ width="32.000023"
+ id="rect3117"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4186);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4184);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3119"
+ width="32"
+ height="3"
+ x="496"
+ y="427" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4182);stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3121"
+ width="32"
+ height="3"
+ x="496"
+ y="436" />
+ <rect
+ y="436"
+ x="496"
+ height="3"
+ width="32"
+ id="rect3123"
+ style="opacity:1;fill:url(#linearGradient4180);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="445"
+ x="496"
+ height="3"
+ width="31.999998"
+ id="rect3125"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4178);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4176);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3127"
+ width="32"
+ height="3"
+ x="496"
+ y="445" />
+ </g>
+ <g
+ style="display:inline"
+ transform="translate(-243,-141)"
+ inkscape:label="icon-center"
+ id="g4092"
+ inkscape:groupmode="layer">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g4094"
+ inkscape:groupmode="layer"
+ inkscape:label="plate6">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4100"
+ width="48"
+ height="48"
+ x="575"
+ y="709.36218" />
+ <rect
+ y="725.36218"
+ x="539"
+ height="32"
+ width="32"
+ id="rect4102"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="32x32" />
+ <rect
+ y="735.36218"
+ x="513"
+ height="22"
+ width="22"
+ id="rect4104"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="22x22" />
+ <rect
+ y="741.36218"
+ x="493"
+ height="16"
+ width="16"
+ id="rect4106"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="494.55261"
+ y="699.7832"
+ id="text4108"><tspan
+ sodipodi:role="line"
+ x="494.55261"
+ y="699.7832"
+ id="tspan4110"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-justify-center</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text4112"
+ y="714.7832"
+ x="494.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="714.7832"
+ x="494.55261"
+ sodipodi:role="line"
+ id="tspan4114">actions</tspan></text>
+ </g>
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3320);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4116"
+ width="11"
+ height="1"
+ x="408"
+ y="363" />
+ <rect
+ y="363"
+ x="408"
+ height="1"
+ width="11"
+ id="rect4118"
+ style="opacity:1;fill:url(#linearGradient3318);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="368"
+ x="410"
+ height="1"
+ width="6.9999995"
+ id="rect4120"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3316);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3314);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4122"
+ width="7"
+ height="1"
+ x="410"
+ y="368" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3312);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4124"
+ width="9"
+ height="1"
+ x="409"
+ y="373" />
+ <rect
+ y="373"
+ x="409"
+ height="1"
+ width="9"
+ id="rect4126"
+ style="opacity:1;fill:url(#linearGradient3310);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="358"
+ x="429"
+ height="1"
+ width="15"
+ id="rect4128"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3308);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3306);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4130"
+ width="15"
+ height="1"
+ x="429"
+ y="358" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3304);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4132"
+ width="11.000031"
+ height="1"
+ x="430.99997"
+ y="363" />
+ <rect
+ y="363"
+ x="431"
+ height="1"
+ width="11"
+ id="rect4134"
+ style="opacity:1;fill:url(#linearGradient3302);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3300);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4136"
+ width="7.0000005"
+ height="1"
+ x="433"
+ y="368" />
+ <rect
+ y="368"
+ x="433"
+ height="1"
+ width="7"
+ id="rect4138"
+ style="opacity:1;fill:url(#linearGradient3298);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="373"
+ x="430"
+ height="1"
+ width="13"
+ id="rect4140"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3296);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3294);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4142"
+ width="13"
+ height="1"
+ x="430"
+ y="373" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3292);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4144"
+ width="22"
+ height="2"
+ x="456"
+ y="349" />
+ <rect
+ y="349"
+ x="456"
+ height="2"
+ width="22"
+ id="rect4146"
+ style="opacity:1;fill:url(#linearGradient3290);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="356"
+ x="458"
+ height="2"
+ width="18"
+ id="rect4148"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3288);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3286);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4150"
+ width="18"
+ height="2"
+ x="458"
+ y="356" />
+ <rect
+ y="363"
+ x="461"
+ height="2"
+ width="12"
+ id="rect4152"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3284);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3282);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4154"
+ width="12"
+ height="2"
+ x="461"
+ y="363" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3280);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4156"
+ width="20.000027"
+ height="2"
+ x="456.99994"
+ y="370" />
+ <rect
+ y="370"
+ x="457"
+ height="2"
+ width="20"
+ id="rect4158"
+ style="opacity:1;fill:url(#linearGradient3278);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="338"
+ x="496.01562"
+ height="3"
+ width="31.984375"
+ id="rect4160"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3276);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3274);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4162"
+ width="32"
+ height="3"
+ x="496"
+ y="338" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3272);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4164"
+ width="24.000023"
+ height="3"
+ x="500"
+ y="347" />
+ <rect
+ y="347"
+ x="500"
+ height="3"
+ width="24"
+ id="rect4166"
+ style="opacity:1;fill:url(#linearGradient3270);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="356"
+ x="502.01376"
+ height="3"
+ width="19.972473"
+ id="rect4168"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3268);stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3266);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4170"
+ width="20"
+ height="3"
+ x="502"
+ y="356" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3264);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4172"
+ width="29.99164"
+ height="3"
+ x="497.00418"
+ y="365" />
+ <rect
+ y="365"
+ x="497"
+ height="3"
+ width="30"
+ id="rect4174"
+ style="opacity:1;fill:url(#linearGradient3262);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ style="display:inline"
+ transform="translate(-243,-141)"
+ inkscape:label="icon-right"
+ id="g3178"
+ inkscape:groupmode="layer">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g3180"
+ inkscape:groupmode="layer"
+ inkscape:label="plate5">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3186"
+ width="48"
+ height="48"
+ x="575"
+ y="629.36218" />
+ <rect
+ y="645.36218"
+ x="539"
+ height="32"
+ width="32"
+ id="rect3188"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="32x32" />
+ <rect
+ y="655.36218"
+ x="513"
+ height="22"
+ width="22"
+ id="rect3190"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="22x22" />
+ <rect
+ y="661.36218"
+ x="493"
+ height="16"
+ width="16"
+ id="rect3192"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="494.55261"
+ y="619.7832"
+ id="text3194"><tspan
+ sodipodi:role="line"
+ x="494.55261"
+ y="619.7832"
+ id="tspan3196"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-justify-right</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text3198"
+ y="634.7832"
+ x="494.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="634.7832"
+ x="494.55261"
+ sodipodi:role="line"
+ id="tspan3200">actions</tspan></text>
+ </g>
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3176);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3202"
+ width="11"
+ height="1"
+ x="409"
+ y="283" />
+ <rect
+ y="283"
+ x="409"
+ height="1"
+ width="11"
+ id="rect3204"
+ style="opacity:1;fill:url(#linearGradient3174);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="288"
+ x="413"
+ height="1"
+ width="6.9999995"
+ id="rect3206"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3172);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3170);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3208"
+ width="7"
+ height="1"
+ x="413"
+ y="288" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3168);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3210"
+ width="9"
+ height="1"
+ x="411"
+ y="293" />
+ <rect
+ y="293"
+ x="411"
+ height="1"
+ width="9"
+ id="rect3212"
+ style="opacity:1;fill:url(#linearGradient3166);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="278"
+ x="430"
+ height="1"
+ width="15"
+ id="rect3214"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3164);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3162);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3216"
+ width="15"
+ height="1"
+ x="430"
+ y="278" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3160);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3218"
+ width="11.000031"
+ height="1"
+ x="433.99997"
+ y="283" />
+ <rect
+ y="283"
+ x="434"
+ height="1"
+ width="11"
+ id="rect3220"
+ style="opacity:1;fill:url(#linearGradient3158);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3156);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3222"
+ width="7.0000005"
+ height="1"
+ x="438"
+ y="288" />
+ <rect
+ y="288"
+ x="438"
+ height="1"
+ width="7"
+ id="rect3224"
+ style="opacity:1;fill:url(#linearGradient3154);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="293"
+ x="432"
+ height="1"
+ width="13"
+ id="rect3226"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3152);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3150);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3228"
+ width="13"
+ height="1"
+ x="432"
+ y="293" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3148);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3230"
+ width="23.09091"
+ height="2"
+ x="457"
+ y="269" />
+ <rect
+ y="269"
+ x="457"
+ height="2"
+ width="23"
+ id="rect3232"
+ style="opacity:1;fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="276"
+ x="462.09091"
+ height="2"
+ width="18"
+ id="rect3234"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3144);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3142);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3236"
+ width="18"
+ height="2"
+ x="462"
+ y="276" />
+ <rect
+ y="283"
+ x="467.09091"
+ height="2"
+ width="13"
+ id="rect3238"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3140);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3138);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3240"
+ width="13"
+ height="2"
+ x="467"
+ y="283" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3136);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3242"
+ width="20.90909"
+ height="2"
+ x="459.18182"
+ y="290" />
+ <rect
+ y="290"
+ x="459"
+ height="2"
+ width="21"
+ id="rect3244"
+ style="opacity:1;fill:url(#linearGradient3134);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="258"
+ x="495.75"
+ height="3"
+ width="32"
+ id="rect3246"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3132);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3130);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3248"
+ width="32"
+ height="3"
+ x="495.75"
+ y="258" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3128);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3250"
+ width="24.999969"
+ height="3"
+ x="502.75003"
+ y="267" />
+ <rect
+ y="267"
+ x="502.75"
+ height="3"
+ width="25"
+ id="rect3252"
+ style="opacity:1;fill:url(#linearGradient3126);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="276"
+ x="507.75"
+ height="3"
+ width="20"
+ id="rect3254"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3124);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3256"
+ width="20"
+ height="3"
+ x="507.75"
+ y="276" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3120);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3258"
+ width="29.875002"
+ height="3"
+ x="497.875"
+ y="285" />
+ <rect
+ y="285"
+ x="497.75"
+ height="3"
+ width="30"
+ id="rect3260"
+ style="opacity:1;fill:url(#linearGradient3118);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="translate(-243,-141)"
+ inkscape:label="icon-left"
+ id="g2974"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g2976"
+ inkscape:groupmode="layer"
+ inkscape:label="plate4">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2982"
+ width="48"
+ height="48"
+ x="575"
+ y="549.36218" />
+ <rect
+ y="565.36218"
+ x="539"
+ height="32"
+ width="32"
+ id="rect2984"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="32x32" />
+ <rect
+ y="575.36218"
+ x="513"
+ height="22"
+ width="22"
+ id="rect2986"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="22x22" />
+ <rect
+ y="581.36218"
+ x="493"
+ height="16"
+ width="16"
+ id="rect2988"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="494.55261"
+ y="539.7832"
+ id="text2990"><tspan
+ sodipodi:role="line"
+ x="494.55261"
+ y="539.7832"
+ id="tspan2992"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-justify-left</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text2994"
+ y="554.7832"
+ x="494.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="554.7832"
+ x="494.55261"
+ sodipodi:role="line"
+ id="tspan2996">actions</tspan></text>
+ </g>
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4011);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2998"
+ width="11"
+ height="1"
+ x="406"
+ y="203" />
+ <rect
+ y="203"
+ x="406"
+ height="1"
+ width="11"
+ id="rect3000"
+ style="opacity:1;fill:url(#linearGradient4013);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="208"
+ x="405.99997"
+ height="1"
+ width="6.9999995"
+ id="rect3002"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4019);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3004"
+ width="7"
+ height="1"
+ x="406"
+ y="208" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4027);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3006"
+ width="9"
+ height="1"
+ x="406"
+ y="213" />
+ <rect
+ y="213"
+ x="406"
+ height="1"
+ width="9"
+ id="rect3008"
+ style="opacity:1;fill:url(#linearGradient4029);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="198"
+ x="427"
+ height="1"
+ width="15"
+ id="rect3010"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4043);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4045);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3012"
+ width="15"
+ height="1"
+ x="427"
+ y="198" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4047);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3014"
+ width="11.000031"
+ height="1"
+ x="426.99994"
+ y="203" />
+ <rect
+ y="203"
+ x="427"
+ height="1"
+ width="11"
+ id="rect3016"
+ style="opacity:1;fill:url(#linearGradient4049);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4059);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3018"
+ width="7.0000005"
+ height="1"
+ x="427.00003"
+ y="208" />
+ <rect
+ y="208"
+ x="427"
+ height="1"
+ width="7"
+ id="rect3020"
+ style="opacity:1;fill:url(#linearGradient4061);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="213"
+ x="426.99997"
+ height="1"
+ width="13"
+ id="rect3022"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4051);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4053);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3024"
+ width="13"
+ height="1"
+ x="427"
+ y="213" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4079);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3026"
+ width="23.09091"
+ height="2"
+ x="454"
+ y="189" />
+ <rect
+ y="189"
+ x="454"
+ height="2"
+ width="23"
+ id="rect3028"
+ style="opacity:1;fill:url(#linearGradient4081);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="196"
+ x="454"
+ height="2"
+ width="18"
+ id="rect3030"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4099);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4101);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3032"
+ width="18"
+ height="2"
+ x="454"
+ y="196" />
+ <rect
+ y="203"
+ x="454"
+ height="2"
+ width="13"
+ id="rect3034"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4111);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4113);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3036"
+ width="13"
+ height="2"
+ x="454"
+ y="203" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4115);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3038"
+ width="20.90909"
+ height="2"
+ x="454"
+ y="210" />
+ <rect
+ y="210"
+ x="454"
+ height="2"
+ width="21"
+ id="rect3040"
+ style="opacity:1;fill:url(#linearGradient4117);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="178"
+ x="494"
+ height="3"
+ width="32"
+ id="rect3042"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2934);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2936);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3044"
+ width="32"
+ height="3"
+ x="494"
+ y="178" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2954);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3046"
+ width="24.999969"
+ height="3"
+ x="494.00003"
+ y="187" />
+ <rect
+ y="187"
+ x="494"
+ height="3"
+ width="25"
+ id="rect3048"
+ style="opacity:1;fill:url(#linearGradient2956);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="196"
+ x="494"
+ height="3"
+ width="20"
+ id="rect3050"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2962);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient2964);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3052"
+ width="20"
+ height="3"
+ x="494"
+ y="196" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient2970);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3054"
+ width="29.875002"
+ height="3"
+ x="494.00003"
+ y="205" />
+ <rect
+ y="205"
+ x="494"
+ height="3"
+ width="30"
+ id="rect3056"
+ style="opacity:1;fill:url(#linearGradient2972);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ style="display:inline"
+ inkscape:groupmode="layer"
+ id="g3447"
+ inkscape:label="icon-unord"
+ transform="translate(-243,-141)">
+ <g
+ inkscape:label="plate13"
+ inkscape:groupmode="layer"
+ id="g3449"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ y="549.36218"
+ x="945"
+ height="48"
+ width="48"
+ id="rect3451"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="48x48" />
+ <rect
+ inkscape:label="32x32"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3453"
+ width="32"
+ height="32"
+ x="909"
+ y="565.36218" />
+ <rect
+ inkscape:label="22x22"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3455"
+ width="22"
+ height="22"
+ x="883"
+ y="575.36218" />
+ <rect
+ inkscape:label="16x16"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3457"
+ width="16"
+ height="16"
+ x="863"
+ y="581.36218" />
+ <text
+ id="text3459"
+ y="539.7832"
+ x="864.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ id="tspan3461"
+ y="539.7832"
+ x="864.55261"
+ sodipodi:role="line">format-list-unordered</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="864.55261"
+ y="554.7832"
+ id="text3463"
+ inkscape:label="context"><tspan
+ id="tspan3465"
+ sodipodi:role="line"
+ x="864.55261"
+ y="554.7832">actions</tspan></text>
+ </g>
+ <rect
+ y="203"
+ x="780"
+ height="1"
+ width="10"
+ id="rect3467"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3586);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3584);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3469"
+ width="10"
+ height="1"
+ x="780"
+ y="203" />
+ <rect
+ y="190"
+ x="831"
+ height="2"
+ width="18.09091"
+ id="rect3495"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3558);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient3556);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3497"
+ width="18"
+ height="2"
+ x="831"
+ y="190" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3542);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3511"
+ width="30.000061"
+ height="3"
+ x="868.99994"
+ y="178" />
+ <rect
+ y="178"
+ x="869"
+ height="3"
+ width="30"
+ id="rect3513"
+ style="opacity:1;fill:url(#linearGradient3540);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3592);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3588"
+ width="10"
+ height="1"
+ x="780"
+ y="213" />
+ <rect
+ y="213"
+ x="780"
+ height="1"
+ width="10"
+ id="rect3590"
+ style="opacity:1;fill:url(#linearGradient3594);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.3333333,0,0,-0.3333333,598.66667,225)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4368"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4378);stroke-width:6.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path3596"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.3333333,0,0,0.3333333,598.66667,182)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4385);stroke-width:6.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4381"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.3333333,0,0,-0.3333333,598.66667,235)" />
+ <path
+ transform="matrix(0.3333333,0,0,0.3333333,598.66667,192)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4383"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <rect
+ y="208"
+ x="780"
+ height="1"
+ width="10"
+ id="rect4387"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4395);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4397);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4389"
+ width="10"
+ height="1"
+ x="780"
+ y="208" />
+ <path
+ transform="matrix(0.3333333,0,0,-0.3333333,598.66667,230)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4391"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4399);stroke-width:6.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4393"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.3333333,0,0,0.3333333,598.66667,187)" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4425);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4401"
+ width="12"
+ height="1"
+ x="802"
+ y="198" />
+ <rect
+ y="198"
+ x="802"
+ height="1"
+ width="12"
+ id="rect4403"
+ style="opacity:1;fill:url(#linearGradient4427);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ y="212"
+ x="802"
+ height="1"
+ width="12"
+ id="rect4405"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4429);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4431);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4407"
+ width="12"
+ height="1"
+ x="802"
+ y="212" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4433);stroke-width:6.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4409"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.3333333,0,0,-0.3333333,620.66667,220)" />
+ <path
+ transform="matrix(0.3333333,0,0,0.3333333,620.66667,177)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4411"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.3333333,0,0,-0.3333333,620.66667,234)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4413"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4435);stroke-width:6.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4415"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.3333333,0,0,0.3333333,620.66667,191)" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4437);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4417"
+ width="12"
+ height="1"
+ x="802"
+ y="205" />
+ <rect
+ y="205"
+ x="802"
+ height="1"
+ width="12"
+ id="rect4419"
+ style="opacity:1;fill:url(#linearGradient4439);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4441);stroke-width:6.00000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4421"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.3333333,0,0,-0.3333333,620.66667,227)" />
+ <path
+ transform="matrix(0.3333333,0,0,0.3333333,620.66667,184)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4423"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.6666618,0,0,-0.6666659,470.3359,233.99995)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4443"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4447);stroke-width:3.0000124;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4445"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.666657,0,0,0.6666674,470.33849,147.99995)" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4457);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4449"
+ width="18.09091"
+ height="2"
+ x="831"
+ y="210" />
+ <rect
+ y="210"
+ x="831"
+ height="2"
+ width="18"
+ id="rect4451"
+ style="opacity:1;fill:url(#linearGradient4459);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4461);stroke-width:3.0000124;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4453"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.6666618,0,0,-0.6666659,470.3359,253.99995)" />
+ <path
+ transform="matrix(0.666657,0,0,0.6666674,470.33849,167.99995)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4455"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4471);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4463"
+ width="18.09091"
+ height="2"
+ x="831"
+ y="200" />
+ <rect
+ y="200"
+ x="831"
+ height="2"
+ width="18"
+ id="rect4465"
+ style="opacity:1;fill:url(#linearGradient4473);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4475);stroke-width:3.0000124;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4467"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.6666618,0,0,-0.6666659,470.3359,243.99995)" />
+ <path
+ transform="matrix(0.666657,0,0,0.6666674,470.33849,157.99995)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4469"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4481);stroke-width:2.00001931;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4477"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.9999877,0,0,-0.9999928,330.00654,243.99955)" />
+ <path
+ transform="matrix(0.9999839,0,0,0.9999995,330.00862,115.00003)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4479"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <rect
+ y="204"
+ x="868.99994"
+ height="3"
+ width="30.000061"
+ id="rect4483"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4492);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4494);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4485"
+ width="30"
+ height="3"
+ x="869"
+ y="204" />
+ <path
+ transform="matrix(0.9999877,0,0,-0.9999928,330.00654,269.99955)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4487"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4496);stroke-width:2.00001931;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4489"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.9999839,0,0,0.9999995,330.00862,141.00003)" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4506);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4498"
+ width="30.000061"
+ height="3"
+ x="868.99994"
+ y="191" />
+ <rect
+ y="191"
+ x="869"
+ height="3"
+ width="30"
+ id="rect4500"
+ style="opacity:1;fill:url(#linearGradient4508);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4510);stroke-width:2.00001931;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path4502"
+ sodipodi:cx="533.5"
+ sodipodi:cy="64.5"
+ sodipodi:rx="1.5"
+ sodipodi:ry="1.5"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ transform="matrix(0.9999877,0,0,-0.9999928,330.00654,256.99955)" />
+ <path
+ transform="matrix(0.9999839,0,0,0.9999995,330.00862,128.00003)"
+ d="m 535,64.5 c 0,0.828427 -0.67157,1.5 -1.5,1.5 -0.82843,0 -1.5,-0.671573 -1.5,-1.5 0,-0.828427 0.67157,-1.5 1.5,-1.5 0.82843,0 1.5,0.671573 1.5,1.5 z"
+ sodipodi:ry="1.5"
+ sodipodi:rx="1.5"
+ sodipodi:cy="64.5"
+ sodipodi:cx="533.5"
+ id="path4504"
+ style="opacity:1;fill:#bfd9ff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ transform="translate(-243,-141)"
+ inkscape:label="icon-ord"
+ id="g4512"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g4514"
+ inkscape:groupmode="layer"
+ inkscape:label="plate14">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none"
+ id="rect4516"
+ width="48"
+ height="48"
+ x="945"
+ y="634.36218" />
+ <rect
+ y="650.36218"
+ x="909"
+ height="32"
+ width="32"
+ id="rect4518"
+ style="fill:#dddddd;fill-opacity:1;stroke:none"
+ inkscape:label="32x32" />
+ <rect
+ y="660.36218"
+ x="883"
+ height="22"
+ width="22"
+ id="rect4520"
+ style="fill:#dddddd;fill-opacity:1;stroke:none"
+ inkscape:label="22x22" />
+ <rect
+ y="666.36218"
+ x="863"
+ height="16"
+ width="16"
+ id="rect4522"
+ style="fill:#dddddd;fill-opacity:1;stroke:none"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="864.55261"
+ y="624.7832"
+ id="text4524"><tspan
+ sodipodi:role="line"
+ x="864.55261"
+ y="624.7832"
+ id="tspan4526"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-list-ordered</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text4528"
+ y="639.7832"
+ x="864.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="639.7832"
+ x="864.55261"
+ sodipodi:role="line"
+ id="tspan4530">actions</tspan></text>
+ </g>
+ <rect
+ style="fill:none;stroke:url(#linearGradient4699);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4532"
+ width="9"
+ height="1"
+ x="781"
+ y="288" />
+ <rect
+ y="288"
+ x="781"
+ height="1"
+ width="8.9999628"
+ id="rect4534"
+ style="fill:url(#linearGradient4696);fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:none;stroke:url(#linearGradient4694);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4536"
+ width="18.09091"
+ height="2"
+ x="831"
+ y="275" />
+ <rect
+ y="275"
+ x="831"
+ height="2"
+ width="18"
+ id="rect4538"
+ style="fill:url(#linearGradient4692);fill-opacity:1;stroke:none" />
+ <rect
+ y="263"
+ x="868.99994"
+ height="3"
+ width="30.000061"
+ id="rect4540"
+ style="fill:none;stroke:url(#linearGradient4690);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ style="fill:url(#linearGradient4688);fill-opacity:1;stroke:none"
+ id="rect4542"
+ width="30"
+ height="3"
+ x="869"
+ y="263" />
+ <rect
+ y="298"
+ x="781"
+ height="1"
+ width="9"
+ id="rect4544"
+ style="fill:none;stroke:url(#linearGradient4686);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ style="fill:url(#linearGradient4684);fill-opacity:1;stroke:none"
+ id="rect4546"
+ width="9"
+ height="1"
+ x="781"
+ y="298" />
+ <rect
+ style="fill:none;stroke:url(#linearGradient4678);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4556"
+ width="9"
+ height="1"
+ x="781"
+ y="293" />
+ <rect
+ y="293"
+ x="781"
+ height="1"
+ width="9"
+ id="rect4558"
+ style="fill:url(#linearGradient4676);fill-opacity:1;stroke:none" />
+ <rect
+ y="283"
+ x="803"
+ height="1"
+ width="11"
+ id="rect4564"
+ style="fill:none;stroke:url(#linearGradient4672);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ style="fill:url(#linearGradient4670);fill-opacity:1;stroke:none"
+ id="rect4566"
+ width="11"
+ height="1"
+ x="803"
+ y="283" />
+ <rect
+ style="fill:none;stroke:url(#linearGradient4668);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4568"
+ width="11"
+ height="1"
+ x="803"
+ y="297" />
+ <rect
+ y="297"
+ x="803"
+ height="1"
+ width="11"
+ id="rect4570"
+ style="fill:url(#linearGradient4666);fill-opacity:1;stroke:none" />
+ <rect
+ y="290"
+ x="803"
+ height="1"
+ width="11"
+ id="rect4580"
+ style="fill:none;stroke:url(#linearGradient4660);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ style="fill:url(#linearGradient4658);fill-opacity:1;stroke:none"
+ id="rect4582"
+ width="11"
+ height="1"
+ x="803"
+ y="290" />
+ <rect
+ y="295"
+ x="831"
+ height="2"
+ width="18.09091"
+ id="rect4592"
+ style="fill:none;stroke:url(#linearGradient4652);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ style="fill:url(#linearGradient4650);fill-opacity:1;stroke:none"
+ id="rect4594"
+ width="18"
+ height="2"
+ x="831"
+ y="295" />
+ <rect
+ y="285"
+ x="831"
+ height="2"
+ width="18.09091"
+ id="rect4600"
+ style="fill:none;stroke:url(#linearGradient4646);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ style="fill:url(#linearGradient4644);fill-opacity:1;stroke:none"
+ id="rect4602"
+ width="18"
+ height="2"
+ x="831"
+ y="285" />
+ <rect
+ style="fill:none;stroke:url(#linearGradient4638);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4612"
+ width="30.000061"
+ height="3"
+ x="868.99994"
+ y="289" />
+ <rect
+ y="289"
+ x="869"
+ height="3"
+ width="30"
+ id="rect4614"
+ style="fill:url(#linearGradient4636);fill-opacity:1;stroke:none" />
+ <rect
+ y="276"
+ x="868.99994"
+ height="3"
+ width="30.000061"
+ id="rect4620"
+ style="fill:none;stroke:url(#linearGradient4632);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ style="fill:url(#linearGradient4630);fill-opacity:1;stroke:none"
+ id="rect4622"
+ width="30"
+ height="3"
+ x="869"
+ y="276" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4984"
+ y="306.81451"
+ x="760.9967"
+ style="font-size:23.24950790000000111px;font-style:normal;font-weight:normal;line-height:125%;fill:none;stroke:url(#linearGradient4990);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0195341,0.9808401)"><tspan
+ style="font-size:5.81237697999999980px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:url(#linearGradient4990);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans;stroke-linecap:round"
+ y="306.81451"
+ x="760.9967"
+ id="tspan4986"
+ sodipodi:role="line">3</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22.80405045px;font-style:normal;font-weight:normal;line-height:125%;fill:#ddebff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="775.9599"
+ y="300.93597"
+ id="text4966"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4968"
+ x="775.9599"
+ y="300.93597"
+ style="font-size:5.70101261px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ddebff;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">3</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4992"
+ y="291.73874"
+ x="778.21686"
+ style="font-size:23.80602645999999822px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:url(#linearGradient5016);stroke-width:1.99999996000000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0236447,0.9769015)"><tspan
+ style="font-size:5.95150661000000003px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill-opacity:1;stroke:url(#linearGradient5016);stroke-width:1.99999996000000002;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans;stroke-linecap:round"
+ y="291.73874"
+ x="778.21686"
+ id="tspan4994"
+ sodipodi:role="line">1</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4996"
+ y="298.15985"
+ x="780.27191"
+ style="font-size:23.39807891999999967px;font-style:normal;font-weight:normal;line-height:125%;fill:none;stroke:url(#linearGradient5018);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0210954,0.9793405)"><tspan
+ style="font-size:5.84951972999999992px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:url(#linearGradient5018);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans;stroke-linecap:round"
+ y="298.15985"
+ x="780.27191"
+ id="tspan4998"
+ sodipodi:role="line">2</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22.9146862px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="796.79919"
+ y="292"
+ id="text5000"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5002"
+ x="796.79919"
+ y="292"
+ style="font-size:5.72867155px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">2</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:26.49859238000000161px;font-style:normal;font-weight:normal;line-height:125%;fill:none;stroke:url(#linearGradient5020);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="847.61353"
+ y="281.9274"
+ id="text5004"
+ sodipodi:linespacing="125%"
+ transform="scale(0.9400059,1.0638232)"><tspan
+ sodipodi:role="line"
+ id="tspan5006"
+ x="847.61353"
+ y="281.9274"
+ style="font-size:6.62464808999999999px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:url(#linearGradient5020);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans;stroke-linecap:round">3</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5008"
+ y="277.66632"
+ x="860.72589"
+ style="font-size:26.09829712px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(0.9257986,1.0801485)"><tspan
+ style="font-size:6.52457428px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ y="277.66632"
+ x="860.72589"
+ id="tspan5010"
+ sodipodi:role="line">3</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22.80005646px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="796.73364"
+ y="285"
+ id="text5012"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5014"
+ x="796.73364"
+ y="285"
+ style="font-size:5.70001411px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">1</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:28.80010223px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:url(#linearGradient5075);stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="823.31732"
+ y="277.97672"
+ id="text5067"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5069"
+ x="823.31732"
+ y="277.97672"
+ style="font-size:7.20002556px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill-opacity:1;stroke:url(#linearGradient5075);stroke-width:1.99999988;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">1</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5071"
+ y="277.97681"
+ x="823.31738"
+ style="font-size:28.80010796px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:7.20002699px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ y="277.97681"
+ x="823.31738"
+ id="tspan5073"
+ sodipodi:role="line">1</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:28.68376541px;font-style:normal;font-weight:normal;line-height:125%;fill:none;stroke:url(#linearGradient5085);stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="823.43945"
+ y="287.9812"
+ id="text5077"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5079"
+ x="823.43945"
+ y="287.9812"
+ style="font-size:7.17094135px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:url(#linearGradient5085);stroke-width:2.00000024;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">2</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5081"
+ y="287.98117"
+ x="823.43945"
+ style="font-size:28.68376732px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:7.17094183px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ y="287.98117"
+ x="823.43945"
+ id="tspan5083"
+ sodipodi:role="line">2</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5087"
+ y="297.95468"
+ x="823.47253"
+ style="font-size:28.55917931px;font-style:normal;font-weight:normal;line-height:125%;fill:none;stroke:url(#linearGradient5095);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:7.13979483px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:url(#linearGradient5095);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ y="297.95468"
+ x="823.47253"
+ id="tspan5089"
+ sodipodi:role="line">3</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:28.55917549px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="823.47253"
+ y="297.95471"
+ id="text5091"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5093"
+ x="823.47253"
+ y="297.95471"
+ style="font-size:7.13979387px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">3</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5097"
+ y="266.97672"
+ x="860.31732"
+ style="font-size:28.80010223000000025px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:url(#linearGradient5121);stroke-width:1.99999988000000006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:7.20002556000000027px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill-opacity:1;stroke:url(#linearGradient5121);stroke-width:1.99999988000000006;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans;stroke-linecap:round"
+ y="266.97672"
+ x="860.31732"
+ id="tspan5099"
+ sodipodi:role="line">1</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:28.80010796px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="860.31738"
+ y="266.97681"
+ id="text5101"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5103"
+ x="860.31738"
+ y="266.97681"
+ style="font-size:7.20002699px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">1</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5105"
+ y="279.9812"
+ x="860.43945"
+ style="font-size:28.68376540999999946px;font-style:normal;font-weight:normal;line-height:125%;fill:none;stroke:url(#linearGradient5123);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:7.17094134999999966px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:url(#linearGradient5123);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans;stroke-linecap:round"
+ y="279.9812"
+ x="860.43945"
+ id="tspan5107"
+ sodipodi:role="line">2</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:28.68376732px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="860.43945"
+ y="279.98117"
+ id="text5109"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5111"
+ x="860.43945"
+ y="279.98117"
+ style="font-size:7.17094183px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">2</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:28.55917931000000110px;font-style:normal;font-weight:normal;line-height:125%;fill:none;stroke:url(#linearGradient5125);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="860.47253"
+ y="292.95468"
+ id="text5113"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5115"
+ x="860.47253"
+ y="292.95468"
+ style="font-size:7.13979482999999959px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:url(#linearGradient5125);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans;stroke-linecap:round">3</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5117"
+ y="292.95471"
+ x="860.47253"
+ style="font-size:28.55917549px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:7.13979387px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ y="292.95471"
+ x="860.47253"
+ id="tspan5119"
+ sodipodi:role="line">3</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:23.67666245px;font-style:normal;font-weight:normal;line-height:125%;fill:none;stroke:url(#linearGradient4988);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="759.17352"
+ y="302.46188"
+ id="text4980"
+ sodipodi:linespacing="125%"
+ transform="scale(1.0218307,0.9786357)"><tspan
+ sodipodi:role="line"
+ id="tspan4982"
+ x="759.17352"
+ y="302.46188"
+ style="font-size:5.91916561px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:url(#linearGradient4988);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">2</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4962"
+ y="296"
+ x="775.84839"
+ style="font-size:23.17082977px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:5.79270744px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ y="296"
+ x="775.84839"
+ id="tspan4964"
+ sodipodi:role="line">2</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:23.80610085px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:url(#linearGradient4816);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="757.68817"
+ y="297.88068"
+ id="text4957"
+ sodipodi:linespacing="125%"
+ transform="scale(1.0236449,0.9769012)"><tspan
+ sodipodi:role="line"
+ id="tspan4959"
+ x="757.68817"
+ y="297.88068"
+ style="font-size:5.95152521px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill-opacity:1;stroke:url(#linearGradient4816);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">1</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4970"
+ y="291"
+ x="775.71381"
+ style="font-size:23.25621033px;font-style:normal;font-weight:normal;line-height:125%;fill:#bfd9ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:5.81405258px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bfd9ff;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ y="291"
+ x="775.71381"
+ id="tspan4972"
+ sodipodi:role="line">1</tspan></text>
+ </g>
+ <g
+ transform="translate(-243,-141)"
+ inkscape:label="icon-strike"
+ id="g3645"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g3647"
+ inkscape:groupmode="layer"
+ inkscape:label="plate19">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3653"
+ width="48"
+ height="48"
+ x="433"
+ y="793.36218" />
+ <rect
+ y="809.36218"
+ x="397"
+ height="32"
+ width="32"
+ id="rect3655"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="32x32" />
+ <rect
+ y="819.36218"
+ x="371"
+ height="22"
+ width="22"
+ id="rect3657"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="22x22" />
+ <rect
+ y="825.36218"
+ x="351"
+ height="16"
+ width="16"
+ id="rect3659"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="352.55261"
+ y="783.7832"
+ id="text3661"><tspan
+ sodipodi:role="line"
+ x="352.55261"
+ y="783.7832"
+ id="tspan3663"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-text-strikethrough</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text3665"
+ y="798.7832"
+ x="352.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="798.7832"
+ x="352.55261"
+ sodipodi:role="line"
+ id="tspan3667">actions</tspan></text>
+ </g>
+ <path
+ id="path3963"
+ d="M 266.98009,456.09948 L 267.63986,456.09948 L 267.99511,457.93666 C 268.12368,458.09907 268.303,458.25471 268.53308,458.40357 C 268.76314,458.54568 269.0169,458.67425 269.29434,458.78928 C 269.57854,458.89755 269.87628,458.98552 270.18756,459.05319 C 270.49883,459.11409 270.80334,459.14454 271.10108,459.14454 C 271.61535,459.14454 272.06196,459.07687 272.44091,458.94154 C 272.81984,458.79943 273.13111,458.60658 273.37473,458.36297 C 273.62509,458.11937 273.81118,457.83178 273.93299,457.5002 C 274.05478,457.16863 274.11568,456.80661 274.11569,456.41413 C 274.11568,455.92693 274.0108,455.5243 273.80104,455.20626 C 273.59802,454.88822 273.32735,454.62093 272.98902,454.40439 C 272.65744,454.18109 272.2785,453.995 271.8522,453.84613 C 271.42588,453.6905 270.98604,453.53486 270.53267,453.37922 C 270.08605,453.22359 269.6496,453.05104 269.22329,452.86156 C 268.79698,452.67209 268.41465,452.43187 268.07632,452.14089 C 267.74474,451.84993 267.47407,451.49129 267.2643,451.06497 C 267.06129,450.6319 266.95979,450.10071 266.95979,449.47139 C 266.95979,448.94359 267.06129,448.46653 267.2643,448.04021 C 267.4673,447.60714 267.76504,447.24174 268.15752,446.94398 C 268.54999,446.63949 269.03043,446.40604 269.59885,446.24362 C 270.17402,446.08123 270.82702,446.00003 271.55784,446.00001 C 272.22775,446.00003 272.86383,446.04401 273.46608,446.13197 C 274.06832,446.21995 274.49819,446.32145 275.00571,446.43647 L 275.00571,449.26838 L 274.47095,449.26838 L 274.11569,447.60375 C 273.81795,447.38722 273.45254,447.3329 273.01947,447.19079 C 272.58639,447.0487 272.09918,446.97764 271.55784,446.97763 C 271.05709,446.97764 270.62401,446.90678 270.25861,447.01504 C 269.89997,447.12332 269.60223,447.39719 269.36539,447.58664 C 269.12855,447.76936 269.041,447.98928 268.92597,448.24641 C 268.81093,448.49679 268.79761,448.64246 268.79761,448.93343 C 268.79761,449.37328 269.07589,449.73869 269.2789,450.02965 C 269.48866,450.32063 269.75933,450.571 270.09091,450.78076 C 270.42925,450.98378 270.81157,451.15971 271.23789,451.30858 C 271.67096,451.45745 271.80144,451.61309 272.24805,451.77548 C 272.70142,451.93113 273.14127,452.11045 273.56758,452.31345 C 274.00065,452.50969 274.38297,452.76345 274.71456,453.07471 C 275.05289,453.37922 275.32356,453.75478 275.52657,454.20139 C 275.73633,454.64123 275.84122,455.18596 275.84123,455.83557 C 275.84122,456.46489 275.7431,457.0333 275.54687,457.54081 C 275.35739,458.04832 275.06642,458.48478 274.67395,458.85018 C 274.28824,459.20882 273.80103,459.48626 273.21232,459.6825 C 272.63037,459.87197 271.94354,459.96671 271.15183,459.96671 C 270.73228,459.96671 270.31951,459.94641 269.9135,459.90581 C 269.50749,459.8652 269.12517,459.81107 268.76653,459.7434 C 268.40789,459.67573 268.07631,459.59792 267.77181,459.50995 C 267.4673,459.42198 267.2034,459.33401 266.98009,459.24604 L 266.98009,456.09948"
+ style="font-size:20.7876358px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient3965);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ sodipodi:nodetypes="cccsssssssssssssssssssssccccssssssssssssssssssssscc" />
+ <path
+ style="font-size:20.7876358px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#radialGradient3961);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ d="M 266.98009,456.09948 L 267.63986,456.09948 L 267.99511,457.93666 C 268.12368,458.09907 268.303,458.25471 268.53308,458.40357 C 268.76314,458.54568 269.0169,458.67425 269.29434,458.78928 C 269.57854,458.89755 269.87628,458.98552 270.18756,459.05319 C 270.49883,459.11409 270.80334,459.14454 271.10108,459.14454 C 271.61535,459.14454 272.06196,459.07687 272.44091,458.94154 C 272.81984,458.79943 273.13111,458.60658 273.37473,458.36297 C 273.62509,458.11937 273.81118,457.83178 273.93299,457.5002 C 274.05478,457.16863 274.11568,456.80661 274.11569,456.41413 C 274.11568,455.92693 274.0108,455.5243 273.80104,455.20626 C 273.59802,454.88822 273.32735,454.62093 272.98902,454.40439 C 272.65744,454.18109 272.2785,453.995 271.8522,453.84613 C 271.42588,453.6905 270.98604,453.53486 270.53267,453.37922 C 270.08605,453.22359 269.6496,453.05104 269.22329,452.86156 C 268.79698,452.67209 268.41465,452.43187 268.07632,452.14089 C 267.74474,451.84993 267.47407,451.49129 267.2643,451.06497 C 267.06129,450.6319 266.95979,450.10071 266.95979,449.47139 C 266.95979,448.94359 267.06129,448.46653 267.2643,448.04021 C 267.4673,447.60714 267.76504,447.24174 268.15752,446.94398 C 268.54999,446.63949 269.03043,446.40604 269.59885,446.24362 C 270.17402,446.08123 270.82702,446.00003 271.55784,446.00001 C 272.22775,446.00003 272.86383,446.04401 273.46608,446.13197 C 274.06832,446.21995 274.49819,446.32145 275.00571,446.43647 L 275.00571,449.01838 L 274.15845,449.01838 L 274.11569,447.60375 C 273.81795,447.38722 273.45254,447.2079 273.01947,447.06579 C 272.58639,446.9237 272.09918,446.85264 271.55784,446.85263 C 271.05709,446.85264 270.62401,446.90678 270.25861,447.01504 C 269.89997,447.12332 269.60223,447.27219 269.36539,447.46164 C 269.12855,447.64436 268.95261,447.86428 268.83758,448.12141 C 268.72254,448.37179 268.66503,448.64246 268.66503,448.93343 C 268.66503,449.37328 268.76653,449.73869 268.96954,450.02965 C 269.1793,450.32063 269.44997,450.571 269.78155,450.78076 C 270.11989,450.98378 270.50221,451.15971 270.92853,451.30858 C 271.3616,451.45745 271.80144,451.61309 272.24805,451.77548 C 272.70142,451.93113 273.14127,452.11045 273.56758,452.31345 C 274.00065,452.50969 274.38297,452.76345 274.71456,453.07471 C 275.05289,453.37922 275.32356,453.75478 275.52657,454.20139 C 275.73633,454.64123 275.84122,455.18596 275.84123,455.83557 C 275.84122,456.46489 275.7431,457.0333 275.54687,457.54081 C 275.35739,458.04832 275.06642,458.48478 274.67395,458.85018 C 274.28824,459.20882 273.80103,459.48626 273.21232,459.6825 C 272.63037,459.87197 271.94354,459.96671 271.15183,459.96671 C 270.73228,459.96671 270.31951,459.94641 269.9135,459.90581 C 269.50749,459.8652 269.12517,459.81107 268.76653,459.7434 C 268.40789,459.67573 268.07631,459.59792 267.77181,459.50995 C 267.4673,459.42198 267.2034,459.33401 266.98009,459.24604 L 266.98009,456.09948"
+ id="text6522"
+ sodipodi:nodetypes="cccsssssssssssssssssssssccccssssssssssssssssssssscc" />
+ <path
+ style="font-size:20.78763580000000033px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4784);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ d="M 28.5625,305 C 27.83168,305.00002 27.16892,305.08761 26.59375,305.25 C 26.02533,305.41242 25.54872,305.63302 25.15625,305.9375 C 24.76377,306.23526 24.453001,306.59817 24.25,307.03125 C 24.04699,307.45757 23.968751,307.94093 23.96875,308.46875 C 23.96875,309.09807 24.046991,309.62943 24.25,310.0625 C 24.45977,310.48882 24.730919,310.86528 25.0625,311.15625 C 25.40083,311.44723 25.792441,311.68552 26.21875,311.875 C 26.64506,312.06448 27.084631,312.21938 27.53125,312.375 C 27.98462,312.53064 28.41743,312.68812 28.84375,312.84375 C 28.919087,312.87006 28.990121,312.90887 29.0625,312.9375 C 30.072181,312.82211 30.985153,312.5234 31.78125,312.125 C 31.760178,312.10496 31.740375,312.08196 31.71875,312.0625 C 31.38716,311.75124 30.995571,311.50874 30.5625,311.3125 C 30.13619,311.1095 29.968534,310.9369 29.515165,310.78125 C 29.068555,310.61886 28.635735,310.46136 28.202665,310.3125 C 27.776345,310.16363 27.384756,309.98427 27.046415,309.78125 C 26.714835,309.57149 26.443675,309.32222 26.233915,309.03125 C 26.030905,308.74029 25.921415,308.37734 25.921415,307.9375 C 25.921415,307.64653 25.993875,307.37539 26.108915,307.125 C 26.223945,306.86787 26.403324,306.65147 26.640165,306.46875 C 26.877005,306.2793 27.095438,306.23044 27.454078,306.12217 C 27.819478,306.01391 28.06175,306.00666 28.5625,306.00665 C 29.10384,306.00666 29.59817,305.9204 30.03125,306.0625 C 30.46432,306.20461 30.82726,306.37721 31.125,306.59375 L 31.15625,307.96875 L 32,307.96875 L 32,305.4375 C 31.49248,305.32248 31.07099,305.21299 30.46875,305.125 C 29.8665,305.03704 29.23241,305.00003 28.5625,305 z"
+ id="path4774"
+ transform="translate(243,141)"
+ sodipodi:nodetypes="csssssssssccssssssssssssccccsc" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4815);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="rect4786"
+ width="12.000001"
+ height="1"
+ x="265"
+ y="452" />
+ <rect
+ y="452"
+ x="265"
+ height="1"
+ width="12"
+ id="rect4788"
+ style="opacity:1;fill:url(#linearGradient4817);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <path
+ style="font-size:20.78763580000000033px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4829);stroke-width:1.99999963999999997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ d="M 317.95759,450.98168 L 319.3813,450.98168 L 320.04443,453.89846 C 320.28436,454.20162 320.61906,454.49214 321.04851,454.77006 C 321.47791,455.03535 321.95153,455.27536 322.46939,455.49009 C 322.99979,455.69219 323.55554,455.85645 324.13652,455.98277 C 324.71751,456.09647 324.90124,456.15327 325.45695,456.15327 C 326.41683,456.15327 327.25042,456.02699 327.95774,455.77431 C 328.66498,455.50906 329.24596,455.14905 329.70068,454.69427 C 330.16795,454.23956 330.51531,453.70266 330.74259,453.08371 C 330.96996,452.46471 331.08363,451.78889 331.08364,451.05625 C 331.08363,450.14672 330.88789,449.77971 330.49635,449.18599 C 330.11741,448.59228 329.80457,448.09332 329.17306,447.68909 C 328.55418,447.27226 328.03921,446.92485 327.24357,446.64696 C 326.44782,446.35644 325.62684,446.06587 324.78069,445.77533 C 323.94711,445.48478 323.13247,445.16266 322.33677,444.80901 C 321.54108,444.45528 320.82747,444.00683 320.19597,443.46365 C 319.57714,442.92049 319.07188,442.251 318.68037,441.45515 C 318.30142,440.6467 318.11197,439.65506 318.11197,438.48025 C 318.11197,437.49496 318.30142,436.60445 318.68037,435.80861 C 319.05926,435.00015 319.61497,434.31802 320.34749,433.76215 C 321.08005,433.19375 321.97678,432.75793 323.03774,432.45474 C 324.11127,432.15163 325.33008,432.00002 326.69413,431.99999 C 327.94449,432.00002 329.13175,432.0821 330.25579,432.24631 C 331.37985,432.41054 332.15913,432.60002 333.10637,432.81476 L 333.10637,438.10131 L 332.13136,438.10131 L 331.46826,435.44711 C 330.91255,435.04285 330.23055,434.70815 329.42224,434.44283 C 328.61387,434.17759 327.70453,434.04491 326.69413,434.0449 C 325.75948,434.04491 324.6947,434.146 324.01278,434.34809 C 323.34336,434.55022 322.78762,434.82814 322.34558,435.18181 C 321.90352,435.52287 321.57515,435.93345 321.36043,436.41348 C 321.14573,436.88086 321.0384,437.38612 321.0384,437.92932 C 321.0384,438.75039 321.2278,438.97924 321.60674,439.52241 C 321.99824,440.06564 322.50344,440.533 323.12231,440.92459 C 323.75383,441.30358 324.4674,441.63198 325.26314,441.90991 C 326.07142,442.1878 327.1488,442.47837 327.9824,442.78152 C 328.82857,443.07206 329.97004,443.4068 330.76576,443.78575 C 331.57405,444.1521 332.28765,444.62582 332.90654,445.20686 C 333.53805,445.77533 334.04323,446.47643 334.42215,447.31014 C 334.81369,448.13121 335.00946,449.14813 335.00947,450.3608 C 335.00946,451.5356 334.82627,452.59673 334.46004,453.54411 C 334.10636,454.49151 333.5633,455.30627 332.83076,455.9884 C 332.11085,456.6579 330.88095,457.17581 329.7822,457.54215 C 328.69598,457.89586 327.41402,458.07273 325.93633,458.07273 C 325.15324,458.07273 324.38285,458.03483 323.62504,457.95903 C 322.86725,457.88325 322.1536,457.78215 321.48421,457.65585 C 320.81482,457.52952 320.19596,457.3843 319.6276,457.22004 C 319.05926,457.05583 318.37439,456.89163 317.95759,456.72744 L 317.95759,450.98168"
+ id="path4819"
+ sodipodi:nodetypes="cccsssssssssccssscssssssccccssssssscsccccscsssssscc" />
+ <path
+ id="path4821"
+ d="M 317.96064,451.04969 L 319.38392,451.04969 L 320.04677,453.90059 C 320.28668,454.20357 320.62126,454.49396 321.05053,454.77172 C 321.47974,455.03687 321.95322,455.27674 322.47086,455.49135 C 323.00112,455.69336 323.55665,455.85749 324.13742,455.98374 C 324.7182,456.09736 325.28637,456.15421 325.84188,456.15421 C 326.8014,456.15421 327.31418,456.02795 328.02116,455.77543 C 328.72819,455.5103 329.30893,455.15045 329.7635,454.69598 C 330.2306,454.24147 330.57778,453.7049 330.80512,453.08621 C 331.03235,452.46757 331.14596,451.7921 331.14597,451.05985 C 331.14596,450.15084 330.95022,449.78421 330.55889,449.19085 C 330.18012,448.59746 329.67509,448.09875 329.04386,447.69471 C 328.42516,447.27809 328.03866,446.9309 327.24331,446.65311 C 326.44785,446.36274 325.62721,446.07236 324.78131,445.78197 C 323.94803,445.49159 323.13366,445.16966 322.33832,444.81612 C 321.54292,444.46258 320.82956,444.0144 320.19832,443.4715 C 319.57962,442.92864 319.07463,442.25952 318.68324,441.46408 C 318.30449,440.65601 318.11509,439.66495 318.11509,438.49079 C 318.11509,437.506 318.30449,436.61593 318.68324,435.82049 C 319.062,435.01248 319.61752,434.33073 320.34983,433.77518 C 321.08207,433.20706 321.97848,432.77148 323.03902,432.46844 C 324.11219,432.16545 325.33055,432.01397 326.69408,432.01394 C 327.94402,432.01397 329.13077,432.09603 330.25445,432.26016 C 331.37808,432.42429 332.09285,432.61369 333.03979,432.82829 L 333.03979,438.112 L 332.12932,438.112 L 331.46648,435.41414 C 330.91096,435.01012 330.22918,434.67553 329.4212,434.41039 C 328.61313,434.14529 327.7041,434.01271 326.69408,434.01269 C 325.75979,434.01271 324.69537,434.11371 324.01356,434.31572 C 323.34445,434.51773 322.78891,434.79551 322.34706,435.14899 C 321.90511,435.48988 321.57684,435.90022 321.36224,436.37997 C 321.14758,436.84713 321.04031,436.94417 321.04031,437.48706 C 321.04031,438.30774 321.22971,438.9895 321.60844,439.53237 C 321.99979,440.07534 322.50483,440.54243 323.12348,440.9338 C 323.75473,441.31257 324.46809,441.64083 325.2635,441.91859 C 326.07152,442.19636 327.14858,442.48673 327.98187,442.78973 C 328.82772,443.08014 329.90482,443.41472 330.70023,443.79348 C 331.50824,444.15962 332.22161,444.63307 332.84024,445.21381 C 333.4715,445.78197 333.9765,446.48267 334.3553,447.31596 C 334.74665,448.1366 334.94234,449.15298 334.94235,450.36499 C 334.94234,451.53913 334.75929,452.59969 334.39315,453.54661 C 334.03963,454.49352 333.49676,455.30785 332.76449,455.98962 C 332.04484,456.65875 331.13579,457.17641 330.03739,457.54253 C 328.9516,457.89604 327.41373,458.07277 325.93655,458.07277 C 325.15374,458.07277 324.38364,458.03494 323.62608,457.95919 C 322.86854,457.88342 322.15524,457.78242 321.48612,457.65618 C 320.81697,457.52986 320.19831,457.38473 319.63017,457.22057 C 319.062,457.0565 318.37732,456.89234 317.96064,456.72822 L 317.96064,451.04969"
+ style="font-size:20.7876358px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#radialGradient4831);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ sodipodi:nodetypes="cccssssssssscsssscssssssccccssssssscsccccscsssssscc" />
+ <path
+ id="path4823"
+ d="M 326.69726,432 C 325.3372,432.00003 324.1038,432.16305 323.0334,432.46527 C 321.97554,432.76753 321.08857,433.17808 320.35824,433.74469 C 319.62778,434.29884 319.04942,434.97424 318.67168,435.78017 C 318.29383,436.57357 318.14823,437.47312 318.14823,438.4554 C 318.14823,439.62657 318.29383,440.61546 318.67168,441.42137 C 319.06203,442.21479 319.56666,442.91538 320.18373,443.4569 C 320.81335,443.99839 321.54215,444.44185 322.33552,444.79448 C 323.12889,445.14711 323.94695,445.43536 324.7781,445.72501 C 325.62186,446.01465 326.42728,446.30767 327.22065,446.59733 C 327.36087,446.64631 327.4931,446.71853 327.62777,446.7718 C 329.50685,446.55707 331.20587,446.00116 332.68741,445.25975 C 332.6482,445.22247 332.61136,445.17964 332.57111,445.14343 C 331.95399,444.56416 331.22521,444.11285 330.41929,443.74764 C 329.62592,443.36986 328.82043,443.04865 327.9767,442.75899 C 327.14557,442.45677 326.08368,442.16367 325.27775,441.88664 C 324.48432,441.60958 323.75556,441.27582 323.12591,440.89798 C 322.50884,440.50759 322.00424,440.04373 321.61388,439.50222 C 321.23605,438.96076 321.03228,438.69327 321.03228,437.87468 C 321.03228,437.3332 321.16714,436.8286 321.38123,436.36262 C 321.59532,435.88411 321.92911,435.48139 322.36992,435.14133 C 322.81067,434.78879 323.33085,434.47047 323.99827,434.26896 C 324.67828,434.0675 325.76538,433.97821 326.69726,433.97818 C 327.70475,433.97821 328.62467,434.12082 329.43064,434.38527 C 330.23658,434.64976 330.912,434.97096 331.46612,435.37393 L 332.10585,438.10645 L 333.00661,438.10645 L 333.00661,432.81422 C 332.06211,432.60013 331.36561,432.39634 330.24484,432.23264 C 329.12405,432.06892 327.94402,432.00006 326.69726,432 z"
+ style="font-size:20.78763580000000033px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4833);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ sodipodi:nodetypes="csssscssssccsccscsssssssccccsc" />
+ <rect
+ y="443"
+ x="315.00284"
+ height="2"
+ width="21.994328"
+ id="rect4825"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4835);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4838);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="rect4827"
+ width="22"
+ height="2"
+ x="315"
+ y="443" />
+ <path
+ sodipodi:nodetypes="cccsssssssssccssscssssssccccssssssscsccccscsssssscc"
+ id="path4841"
+ d="M 356.9918,445.9934 L 359.1819,445.9934 L 360.14379,449.89054 C 360.49178,450.33029 360.97727,450.75168 361.60015,451.15478 C 362.22299,451.53959 362.90997,451.88772 363.66109,452.19916 C 364.43042,452.49228 365.23653,452.73057 366.07923,452.91379 C 366.92193,453.07871 367.18847,453.16108 367.99452,453.16108 C 369.38676,453.16108 370.59588,452.97792 371.62182,452.61142 C 372.64765,452.22668 373.49034,451.70448 374.14991,451.04487 C 374.82763,450.38529 375.33148,449.60652 375.66116,448.70878 C 375.99096,447.81093 376.15583,446.83068 376.15584,445.76799 C 376.15583,444.44875 375.87188,443.91645 375.30396,443.05526 C 374.75437,442.19411 374.30058,441.47037 373.38459,440.88401 C 372.4869,440.27944 371.73996,439.77553 370.5859,439.37244 C 369.43171,438.95105 368.24091,438.52959 367.0136,438.10818 C 365.80448,437.68675 364.31534,437.21951 363.16121,436.70658 C 362.00707,436.19347 360.972,435.543 360.05604,434.75516 C 359.15841,433.96734 358.42556,432.99624 357.85768,431.84188 C 357.30804,430.66927 357.0332,429.23091 357.0332,427.52688 C 357.0332,426.09776 357.30804,424.68306 357.85768,423.52871 C 358.40727,422.35609 359.21329,421.36668 360.27578,420.56038 C 361.33832,419.73593 362.82357,419.10378 364.36245,418.66402 C 365.91962,418.22435 367.81046,418.00444 369.78896,418.0044 C 371.60258,418.00444 373.32468,418.12352 374.95509,418.36173 C 376.58548,418.59991 377.71578,418.87478 379.08973,419.18624 L 379.08973,426.97726 L 377.6755,426.97726 L 376.71369,423.12741 C 375.90765,422.54104 374.91843,422.05555 373.746,421.67071 C 372.57352,421.28599 371.25453,421.09353 369.78896,421.09352 C 368.43327,421.09353 367.38095,421.24015 366.39179,421.5333 C 365.42089,421.82648 364.61478,422.22958 363.97362,422.74258 C 363.33243,423.23729 362.8561,423.83283 362.54463,424.52906 C 362.23327,425.20703 362.07759,425.93987 362.07759,426.72776 C 362.07759,427.91871 362.35234,428.25064 362.90194,429.03849 C 363.4698,429.82643 364.20258,430.50433 365.10024,431.07234 C 366.01627,431.62203 367.05125,432.09837 368.20545,432.50151 C 369.37784,432.90461 371.11452,433.32603 372.32363,433.76575 C 373.55096,434.18717 374.5406,434.6727 375.69473,435.22233 C 376.86716,435.75375 378.07621,436.44084 378.97388,437.28366 C 379.88986,438.10818 380.62261,439.12511 381.17221,440.33437 C 381.74014,441.5253 382.02408,443.00036 382.02409,444.75928 C 382.02408,446.46329 381.75839,448.00243 381.22721,449.37657 C 380.71418,450.75077 379.92647,451.93253 378.86396,452.92197 C 377.81976,453.89302 376.03579,454.64427 374.44209,455.1756 C 372.8666,455.68863 370.83315,455.94522 368.6898,455.94522 C 367.55393,455.94522 366.43652,455.89021 365.33736,455.7803 C 364.23819,455.67038 363.20307,455.52373 362.23212,455.34055 C 361.2612,455.15729 360.36358,454.94664 359.53914,454.70839 C 358.71483,454.47021 357.59633,454.23203 356.9918,453.9939 L 356.9918,445.9934"
+ style="font-size:20.7876358px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4851);stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans" />
+ <path
+ sodipodi:nodetypes="cccssssssssscsssscssssssccccssssssscsccccscsssssscc"
+ style="font-size:20.7876358px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#radialGradient4853);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ d="M 357.12135,446.00871 L 359.18575,446.00871 L 360.14718,449.89371 C 360.49519,450.33314 360.98049,450.75434 361.60314,451.15724 C 362.22565,451.54183 362.91244,451.88974 363.66326,452.20102 C 364.4324,452.49403 365.23816,452.73208 366.08055,452.91523 C 366.92295,453.08002 367.74707,453.16248 368.55283,453.16248 C 369.94459,453.16248 370.68837,452.97933 371.71384,452.61306 C 372.73937,452.22852 373.5817,451.70657 374.24101,451.04736 C 374.91854,450.38811 375.42212,449.60983 375.75188,448.71245 C 376.08146,447.81511 376.24627,446.83536 376.24628,445.77325 C 376.24627,444.45475 375.96233,443.92298 375.39474,443.06232 C 374.84535,442.20166 374.11279,441.47828 373.19718,440.89222 C 372.29978,440.28792 371.73923,439.78433 370.58559,439.38142 C 369.43178,438.96022 368.24146,438.53906 367.01449,438.11785 C 365.80585,437.69667 364.25557,437.22973 363.10193,436.7169 C 361.94823,436.20413 360.91353,435.55407 359.99792,434.76657 C 359.10055,433.97916 358.36809,433.00865 357.80039,431.85486 C 357.25099,430.68279 356.97628,429.2453 356.97628,427.54219 C 356.97628,426.1138 357.25099,424.82278 357.80039,423.669 C 358.34975,422.49703 359.15549,421.50813 360.21771,420.70237 C 361.27981,419.87831 362.58002,419.2465 364.11828,418.80694 C 365.67488,418.36747 367.81115,418.14776 369.7889,418.14773 C 371.60191,418.14776 373.32327,418.2668 374.95313,418.50485 C 376.58294,418.74293 377.61969,419.01764 378.9932,419.32888 L 378.9932,426.99278 L 377.6726,426.99278 L 376.71114,423.0796 C 375.90538,422.49358 374.91647,422.00827 373.74452,421.62371 C 372.57244,421.23916 371.25396,421.04687 369.7889,421.04684 C 368.43375,421.04687 367.38194,421.19337 366.39301,421.48639 C 365.42248,421.77937 364.61669,422.1823 363.97579,422.69502 C 363.33473,423.18947 362.85861,423.78466 362.54733,424.48049 C 362.23594,425.15813 362.08036,425.29887 362.08036,426.08631 C 362.08036,427.2767 362.35511,428.26555 362.90444,429.05301 C 363.47209,429.84054 364.20463,430.51803 365.10195,431.08572 C 366.01758,431.63512 367.05228,432.11123 368.20598,432.51411 C 369.37801,432.91702 370.94028,433.33818 372.14891,433.77771 C 373.37579,434.1989 374.65997,434.68421 375.81365,435.23359 C 376.98569,435.76465 378.0204,436.4514 378.91771,437.29375 C 379.83333,438.11785 380.56582,439.13418 381.11528,440.34284 C 381.6829,441.53318 381.96674,443.00739 381.96675,444.76538 C 381.96674,446.46843 381.70124,448.00677 381.17016,449.38021 C 380.65739,450.75369 379.86999,451.93485 378.80784,452.92374 C 377.76401,453.89429 376.44545,454.64517 374.85228,455.17621 C 373.27735,455.68898 371.04671,455.94529 368.90409,455.94529 C 367.76867,455.94529 366.43772,455.89042 365.33887,455.78054 C 364.24008,455.67068 363.20543,455.52415 362.23493,455.34105 C 361.26437,455.15783 360.36698,454.94733 359.54293,454.7092 C 358.71882,454.47126 357.60061,454.23312 356.99626,453.99504 L 356.99626,446.00871"
+ id="path4843" />
+ <path
+ sodipodi:nodetypes="csssscssssccsccscsssssssccccsc"
+ style="font-size:20.7876358px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4855);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ d="M 369.79351,418.0045 C 367.8208,418.00453 365.60119,418.24099 364.04864,418.67933 C 362.51424,419.11775 361.2277,419.71325 360.16839,420.5351 C 359.10888,421.33891 358.26997,422.31853 357.7221,423.4875 C 357.17401,424.63829 356.96285,426.0661 356.96285,427.49088 C 356.96285,429.18963 357.17401,430.62397 357.7221,431.79291 C 358.28827,432.94375 359.45081,433.95993 360.34585,434.7454 C 361.25909,435.53081 361.88563,436.17406 363.03637,436.68554 C 364.18714,437.19702 365.80428,437.61511 367.00985,438.03522 C 368.2337,438.45535 369.40197,438.88035 370.55271,439.30052 C 370.75609,439.37154 370.94789,439.47631 371.14323,439.55357 C 373.8688,439.24211 376.33316,438.43578 378.48205,437.3604 C 378.42523,437.3063 378.37181,437.24417 378.3134,437.19165 C 377.41828,436.35146 376.36122,435.69684 375.19226,435.16711 C 374.04149,434.61916 373.3037,434.15325 372.07992,433.7331 C 370.87437,433.29476 369.33415,432.86961 368.16516,432.46779 C 367.01434,432.06594 365.95726,431.58184 365.04395,431.03375 C 364.14892,430.46751 363.41703,429.79469 362.85082,429.00924 C 362.30279,428.22389 362.00723,427.83586 362.00723,426.64852 C 362.00723,425.86317 362.20285,425.13122 362.51338,424.45534 C 362.82387,423.7613 363.30804,423.17719 363.94741,422.68389 C 364.58673,422.17256 365.34122,421.71085 366.3093,421.41854 C 367.29568,421.12635 368.44187,420.99686 369.79351,420.99679 C 371.25487,420.99686 372.5892,421.2037 373.75823,421.58725 C 374.92725,421.97088 375.90688,422.43681 376.71063,423.02129 L 377.63855,426.98473 L 378.94507,426.98473 L 378.94507,419.18548 C 377.57511,418.87495 376.56482,418.57938 374.93922,418.34188 C 373.31353,418.10445 371.60191,418.00456 369.79351,418.0045 z"
+ id="path4845" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4857);stroke-width:1.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="rect4847"
+ width="34.000004"
+ height="3.0000002"
+ x="352"
+ y="434" />
+ <rect
+ y="434"
+ x="352"
+ height="3"
+ width="34"
+ id="rect4849"
+ style="opacity:1;fill:url(#linearGradient4860);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <path
+ style="font-size:20.7876358px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4873);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ d="M 288.02744,453.98972 L 288.91888,453.98972 L 289.39889,456.35176 C 289.57258,456.56058 289.81489,456.76068 290.12575,456.95208 C 290.43658,457.13478 290.77944,457.30007 291.1543,457.44799 C 291.53827,457.58718 291.94059,457.70029 292.36116,457.78729 C 292.78172,457.86559 292.31052,457.90474 292.7128,457.90474 C 293.40765,457.90474 294.30529,457.81774 294.81729,457.64373 C 295.32927,457.46102 295.74986,457.21308 296.07901,456.89989 C 296.4173,456.58668 296.66873,456.21691 296.8333,455.79063 C 296.99787,455.3643 297.08014,454.89885 297.08015,454.39426 C 297.08014,453.76786 296.93844,453.25019 296.65505,452.8413 C 296.38072,452.43238 296.01502,452.08874 295.5579,451.81032 C 295.10987,451.52324 294.59788,451.28397 294.02188,451.09257 C 293.44587,450.89251 293.44001,450.69239 292.82745,450.49226 C 292.22399,450.29216 291.6343,450.07031 291.05832,449.8267 C 290.4823,449.58312 289.96572,449.27426 289.50859,448.90015 C 289.0606,448.52607 288.69488,448.06496 288.41144,447.51683 C 288.13716,446.96004 288.00002,446.27709 288.00002,445.46796 C 288.00002,444.78938 288.13716,444.17603 288.41144,443.62789 C 288.68573,443.0711 289.08803,442.60133 289.61831,442.2185 C 290.14856,441.827 290.79773,441.52685 291.56573,441.31802 C 292.34285,441.10924 293.22516,441.00485 294.21258,441.00483 C 295.11772,441.00485 295.97716,441.06138 296.79087,441.1745 C 297.60459,441.28759 298.35429,441.41809 299.04002,441.56596 L 299.04002,444.97159 L 298.14859,444.97159 L 297.66858,443.06675 C 297.26632,442.78837 296.77258,442.55781 296.18746,442.3751 C 295.60229,442.1924 294.94403,442.10105 294.21258,442.10104 C 293.53601,442.10105 292.71549,442.17066 292.22179,442.30985 C 291.73721,442.44905 291.33492,442.64045 291.01493,442.88405 C 290.69493,443.11895 290.45721,443.40172 290.30179,443.73231 C 290.14637,444.05423 290.06866,444.40222 290.06866,444.7763 C 290.06866,445.34183 290.20578,445.81164 290.48009,446.18572 C 290.7635,446.55984 291.12921,446.88174 291.57723,447.15143 C 292.03434,447.41243 292.55094,447.63864 293.12694,447.83004 C 293.71208,448.02144 294.30634,448.22156 294.90978,448.43035 C 295.52235,448.63045 296.35201,448.86103 296.92802,449.12199 C 297.51315,449.37432 298.02972,449.70057 298.47775,450.10075 C 298.93489,450.49226 299.30057,450.97511 299.57487,451.54932 C 299.85827,452.11484 300,452.8152 300.00001,453.65041 C 300,454.45949 299.86744,455.19033 299.60231,455.84281 C 299.34631,456.49532 298.95315,457.0565 298.42289,457.52627 C 297.90173,457.98738 297.24345,458.34408 296.448,458.59639 C 295.66173,458.83998 294.73371,458.9618 293.66404,458.9618 C 293.09714,458.9618 292.53946,458.93569 291.99087,458.88351 C 291.4423,458.83131 290.92572,458.7617 290.44115,458.67469 C 289.95661,458.58768 289.50857,458.48767 289.09715,458.37455 C 288.68573,458.26145 288.32918,458.14833 288.02744,458.03523 L 288.02744,453.98972"
+ id="path4862"
+ sodipodi:nodetypes="cccsssssssssssssssssssssccccssssssssssssssssssssscc" />
+ <path
+ id="path4864"
+ d="M 288.04804,453.98976 L 288.93795,453.98976 L 289.41711,456.35183 C 289.59055,456.56063 289.8324,456.76073 290.14274,456.95212 C 290.45303,457.13484 290.79531,457.30015 291.16951,457.44804 C 291.55284,457.58724 291.95445,457.70035 292.3743,457.78734 C 292.79413,457.86565 293.55793,457.90479 293.95951,457.90479 C 294.65317,457.90479 294.3729,457.81779 294.88403,457.64378 C 295.39514,457.46109 295.81497,457.21313 296.14357,456.89993 C 296.48123,456.58674 296.73224,456.21699 296.89657,455.79068 C 297.06083,455.36436 297.14296,454.89893 297.14298,454.39432 C 297.14296,453.76792 297.00149,453.25024 296.71858,452.84135 C 296.44476,452.43245 296.07967,452.08879 295.62331,451.81039 C 295.17609,451.52329 294.31191,451.28404 293.73691,451.09263 C 293.1619,450.89254 293.45129,450.69243 292.83978,450.49232 C 292.23737,450.29223 291.6487,450.07039 291.0737,449.82677 C 290.49868,449.58316 289.983,449.27431 289.52665,448.9002 C 289.07941,448.5261 288.71434,448.06503 288.4314,447.51689 C 288.15757,446.96008 288.02067,446.27713 288.02067,445.46801 C 288.02067,444.78943 288.15757,444.17607 288.4314,443.62796 C 288.7052,443.07116 289.10681,442.60137 289.63619,442.21853 C 290.16555,441.82705 290.81356,441.52691 291.58024,441.31809 C 292.35604,441.10931 293.23682,441.0049 294.22254,441.00488 C 295.12612,441.0049 295.98406,441.06143 296.79638,441.17454 C 297.60868,441.28764 298.35709,441.41815 299.04164,441.56604 L 299.04164,444.97165 L 298.15176,444.97165 L 297.67257,443.0668 C 297.27098,442.78842 296.7781,442.55786 296.194,442.37514 C 295.60984,442.19247 294.9527,442.10111 294.22254,442.10109 C 293.54713,442.10111 292.7276,442.17071 292.23474,442.30991 C 291.75103,442.44911 291.34943,442.64051 291.02998,442.88411 C 290.71052,443.119 290.47321,443.40177 290.31808,443.73237 C 290.1629,444.05427 290.08533,444.40227 290.08533,444.77637 C 290.08533,445.34189 290.22224,445.81168 290.49605,446.18578 C 290.77898,446.55991 291.14407,446.88179 291.59128,447.15148 C 292.04767,447.41251 292.56333,447.6387 293.13835,447.83009 C 293.72247,448.02152 294.5511,448.22162 295.15349,448.4304 C 295.765,448.6305 296.35828,448.86107 296.93329,449.12207 C 297.51739,449.37438 298.03308,449.70063 298.48033,450.10081 C 298.93666,450.49232 299.30175,450.97519 299.57558,451.5494 C 299.85851,452.11488 299.99999,452.81525 300,453.65046 C 299.99999,454.45956 299.86762,455.19037 299.60294,455.8429 C 299.34737,456.4954 298.95491,457.05655 298.42556,457.52633 C 297.9053,457.98743 297.24815,458.34414 296.4541,458.59645 C 295.66916,458.84004 294.74278,458.96184 293.67489,458.96184 C 293.10901,458.96184 292.55228,458.93576 292.00465,458.88354 C 291.45701,458.83136 290.94137,458.76174 290.45761,458.67475 C 289.97388,458.58773 289.52664,458.48771 289.11593,458.3746 C 288.7052,458.26152 288.34925,458.14839 288.04804,458.03531 L 288.04804,453.98976"
+ style="font-size:20.7876358px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#radialGradient4875);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ sodipodi:nodetypes="cccsssssssssssssssssssssccccssssssssssssssssssssscc" />
+ <path
+ id="path4866"
+ d="M 294.19541,441.00486 C 293.20977,441.00489 292.31593,441.1175 291.54023,441.32627 C 290.77364,441.53512 290.13086,441.81875 289.60156,442.2102 C 289.07224,442.59303 288.65309,443.05964 288.37934,443.61643 C 288.10553,444.16455 288,444.78601 288,445.46464 C 288,446.27375 288.10553,446.95692 288.37934,447.51372 C 288.66224,448.06184 289.02793,448.54586 289.4751,448.91996 C 289.93138,449.29407 290.45957,449.60042 291.03449,449.84405 C 291.60944,450.08767 292.20227,450.28681 292.8046,450.4869 C 293.41603,450.68702 293.99974,450.88945 294.5747,451.08956 C 294.67632,451.12338 294.77211,451.1733 294.86972,451.2101 C 296.23145,451.06175 297.46272,450.67771 298.53639,450.16547 C 298.50797,450.13972 298.48128,450.11013 298.45212,450.08512 C 298.00489,449.68492 297.47677,449.37316 296.89271,449.12084 C 296.31778,448.85984 295.49866,448.63792 294.88721,448.43782 C 294.28491,448.22902 293.70119,448.02653 293.11712,447.83515 C 292.54216,447.64374 292.01405,447.41313 291.55771,447.15212 C 291.11055,446.88242 290.74485,446.56195 290.46196,446.18784 C 290.18817,445.81375 290.04049,445.34712 290.04049,444.78159 C 290.04049,444.4075 290.13823,444.05891 290.29338,443.73698 C 290.4485,443.40639 290.69043,443.12815 291.00985,442.89324 C 291.32927,442.64967 291.70624,442.42977 292.18993,442.29056 C 292.68272,442.15138 293.52007,442.08968 294.19541,442.08967 C 294.92548,442.08968 295.59215,442.18822 296.17623,442.37092 C 296.76031,442.55363 297.24976,442.77554 297.65133,443.05395 L 298.11494,444.98818 L 299,444.98818 L 299,441.56736 C 298.31551,441.41948 297.57851,441.27868 296.76627,441.16559 C 295.95405,441.05246 295.09888,441.0049 294.19541,441.00486 z"
+ style="font-size:20.78763580000000033px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4877);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
+ sodipodi:nodetypes="csssssssssccssssssssssssccccsc" />
+ <rect
+ y="449"
+ x="286"
+ height="1"
+ width="15.999998"
+ id="rect4868"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4881);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4883);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="rect4870"
+ width="16"
+ height="1"
+ x="286"
+ y="449" />
+ </g>
+ <g
+ style="display:inline"
+ inkscape:groupmode="layer"
+ id="g4337"
+ inkscape:label="icon-underline"
+ transform="translate(-243,-141)">
+ <g
+ inkscape:label="plate3"
+ inkscape:groupmode="layer"
+ id="g4339"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ y="709.36218"
+ x="433"
+ height="48"
+ width="48"
+ id="rect4341"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="48x48" />
+ <rect
+ inkscape:label="32x32"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4343"
+ width="32"
+ height="32"
+ x="397"
+ y="725.36218" />
+ <rect
+ inkscape:label="22x22"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4345"
+ width="22"
+ height="22"
+ x="371"
+ y="735.36218" />
+ <rect
+ inkscape:label="16x16"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4347"
+ width="16"
+ height="16"
+ x="351"
+ y="741.36218" />
+ <text
+ id="text4349"
+ y="699.7832"
+ x="352.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ id="tspan4351"
+ y="699.7832"
+ x="352.55261"
+ sodipodi:role="line">format-text-underline</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="352.55261"
+ y="714.7832"
+ id="text4353"
+ inkscape:label="context"><tspan
+ id="tspan4355"
+ sodipodi:role="line"
+ x="352.55261"
+ y="714.7832">actions</tspan></text>
+ </g>
+ <rect
+ transform="translate(243,141)"
+ y="234"
+ x="22"
+ height="1"
+ width="12.000001"
+ id="rect4357"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4719);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <path
+ transform="translate(243,141)"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4701);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ d="M 31.373689,233.0093 L 31.076977,231.39396 L 30.967084,231.39396 C 30.197831,232.61737 28.974394,233.00893 27.296728,233.00893 C 24.432223,233.00893 22.999991,231.54006 23,228.60233 L 23,221.00622 L 25,221.00622 L 25,228.49241 C 25,230.39717 25.864477,231.16083 27.593435,231.16082 C 28.772923,231.16083 29.633733,230.82382 30.175871,230.14982 C 30.717987,229.46845 30.989052,228.35118 30.989069,226.79816 L 30.989069,221.00622 L 32.989069,221.00622 L 32.989069,233.0093 L 31.373689,233.0093"
+ id="path4359"
+ sodipodi:nodetypes="cccsccccssccccc" />
+ <rect
+ transform="translate(243,141)"
+ style="opacity:1;fill:url(#linearGradient4724);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="rect4361"
+ width="12"
+ height="1"
+ x="22"
+ y="234" />
+ <path
+ transform="translate(243,141)"
+ sodipodi:nodetypes="cccsccccssccccc"
+ id="path4363"
+ d="M 31.373689,233.0093 L 31.076977,231.39396 L 30.967084,231.39396 C 30.197831,232.61737 28.974394,233.00893 27.296728,233.00893 C 24.432223,233.00893 22.999991,231.54006 23,228.60233 L 23,221.00622 L 25,221.00622 L 25,228.49241 C 25,230.39717 25.864477,231.16083 27.593435,231.16082 C 28.772923,231.16083 29.633733,230.82382 30.175871,230.14982 C 30.717987,229.46845 30.989052,228.35118 30.989069,226.79816 L 30.989069,221.00622 L 32.989069,221.00622 L 32.989069,233.0093 L 31.373689,233.0093"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:url(#radialGradient4697);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono" />
+ <path
+ transform="translate(243,141)"
+ id="path4365"
+ d="M 23,221 L 23,226.875 C 23.601851,227.17609 24.273856,227.43964 25,227.625 L 25,221 L 23,221 z M 31,221 L 31,226.8125 C 30.999997,227.1211 30.958908,227.38207 30.9375,227.65625 C 31.680732,227.48341 32.379183,227.26152 33,226.96875 L 33,221 L 31,221 z"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:url(#linearGradient4713);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono" />
+ <rect
+ transform="translate(243,141)"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4778);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="rect4367"
+ width="21.999998"
+ height="1.9999999"
+ x="71"
+ y="231.99998" />
+ <path
+ transform="translate(243,141)"
+ sodipodi:nodetypes="cccsccccssccccc"
+ id="path4369"
+ d="M 86.96305,229.00178 L 86.423928,226.09892 L 86.224258,226.09892 C 84.826548,228.29747 83,229 80,229 C 75,229 72,227 72,221 L 72.003804,207.02267 L 76.046598,207.02267 L 76.046598,220.88464 C 76.046598,224.30761 78,226 80,226 C 82,226 83.396057,225.60394 84.5,224.5 C 86,223 85.999975,219.79088 86,217 L 86.00867,207.02267 L 90.000365,207.02267 L 90.000365,229.00178 L 86.96305,229.00178"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4780);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono" />
+ <path
+ transform="translate(243,141)"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:url(#radialGradient4792);fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ d="M 86.96305,229.00178 L 86.423928,226.09892 L 86.224258,226.09892 C 84.826548,228.29747 83,229 80,229 C 75,229 72,227 72,221 L 72.003804,207.02267 L 76.046598,207.02267 L 76.046598,220.88464 C 76.046598,224.30761 78,226 80,226 C 82,226 83.396057,225.60394 84.5,224.5 C 86,223 85.999975,219.79088 86,217 L 86.00867,207.02267 L 90.000365,207.02267 L 90.000365,229.00178 L 86.96305,229.00178"
+ id="path4371"
+ sodipodi:nodetypes="cccsccccssccccc" />
+ <path
+ transform="translate(243,141)"
+ id="path4373"
+ d="M 72,207.03125 L 72,217.03125 C 73.271077,217.32051 74.622586,217.55614 76.03125,217.71875 L 76.03125,207.03125 L 72,207.03125 z M 86,207.03125 L 86,217 C 85.999998,217.22568 86.000795,217.45747 86,217.6875 C 87.396165,217.52513 88.739325,217.31814 90,217.03125 L 90,207.03125 L 86,207.03125 z"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:url(#linearGradient4827);fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono" />
+ <rect
+ transform="translate(243,141)"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4839);stroke-width:2.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="rect4375"
+ width="13.953486"
+ height="1"
+ x="44.023258"
+ y="233" />
+ <path
+ transform="translate(243,141)"
+ sodipodi:nodetypes="cccsccccssccccc"
+ id="path4377"
+ d="M 55.105135,229.96014 L 54.744197,227.99514 L 54.610516,227.99514 C 53.674752,229.48335 52.186493,229.95967 50.14568,229.95967 C 46.661129,229.95967 44.918879,228.17286 44.918891,224.59925 L 44.918891,215.35889 L 47.073204,215.35889 L 47.073204,224.74411 C 47.073204,227.06119 48.403408,227.99014 50.506613,227.99013 C 51.941412,227.99014 53.336803,227.58018 53.996294,226.76029 C 54.655752,225.93145 54.985492,224.57232 54.985515,222.68315 L 54.985515,215.35889 L 57.070179,215.35889 L 57.070179,229.96014 L 55.105135,229.96014"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4841);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono" />
+ <rect
+ transform="translate(243,141)"
+ y="233"
+ x="44"
+ height="1"
+ width="14"
+ id="rect4379"
+ style="opacity:1;fill:url(#linearGradient4843);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <path
+ transform="translate(243,141)"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:url(#radialGradient4845);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ d="M 55.105137,229.96013 L 54.744198,227.99514 L 54.610518,227.99514 C 53.674753,229.48336 52.186492,229.95968 50.145683,229.95968 C 46.661129,229.95968 44.918881,228.17286 44.918891,224.59925 L 44.918891,215.08029 L 47.073205,215.08029 L 47.073205,224.81377 C 47.073205,227.13083 48.403409,228.0598 50.506612,228.05978 C 51.941412,228.0598 53.406458,227.64985 54.065944,226.82994 C 54.725406,226.0011 55.055146,224.64199 55.055165,222.75279 L 55.055165,215.08029 L 57.070178,215.08029 L 57.070178,229.96013 L 55.105137,229.96013"
+ id="path4384"
+ sodipodi:nodetypes="cccsccccssccccc" />
+ <path
+ transform="translate(243,141)"
+ sodipodi:nodetypes="ccccccccccc"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:url(#linearGradient4847);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ d="M 44.918891,215.07272 L 44.918891,222.49801 C 45.651017,222.86428 46.120231,223.18487 47.003555,223.41035 L 47.003555,215.07272 L 44.918891,215.07272 z M 55.068462,215.07272 L 55.068462,222.42198 C 55.06846,222.79739 55.018475,223.11483 54.992435,223.44838 C 55.896545,223.23811 56.328278,222.96821 57.083476,222.61206 L 57.083476,215.07272 L 55.068462,215.07272 z"
+ id="path4386" />
+ <path
+ transform="translate(243,141)"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4702);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono"
+ d="M 134.5,225 L 133.60579,220.8613 L 133.32047,220.8613 C 131.3232,224.08271 128.28692,225 124,225 C 116.8552,225 113,222 113,213 L 113,193 L 119,193 L 119,213 C 119,218.01553 121.64206,220 124.5,220 C 127.35797,220 129.27907,219.63604 130.85656,218.0185 C 133,215.82059 132.99996,211.08935 133,207 L 133,193 L 139,193 L 139,225 L 134.5,225 z"
+ id="path4388"
+ sodipodi:nodetypes="cccsccccssccccc" />
+ <path
+ transform="translate(243,141)"
+ sodipodi:nodetypes="cccsccccssccccc"
+ id="path4390"
+ d="M 134.5,225 L 133.60579,220.8613 L 133.32047,220.8613 C 131.3232,224.08271 128.28692,225 124,225 C 116.8552,225 113,222 113,213 L 113,193 L 119,193 L 119,213 C 119,218.01553 121.64206,220 124.5,220 C 127.35797,220 129.27907,219.63604 130.85656,218.0185 C 133,215.82059 132.99996,211.08935 133,207 L 133,193 L 139,193 L 139,225 L 134.5,225 z"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:url(#radialGradient4877);fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono" />
+ <path
+ transform="translate(243,141)"
+ id="path4392"
+ d="M 113,193 L 113,208.5625 C 114.89898,208.9893 116.91596,209.30607 119,209.5625 L 119,193 L 113,193 z M 133,193 L 133,207 C 132.99999,207.80399 132.98504,208.67071 132.96875,209.53125 C 135.06656,209.28258 137.08617,209.01204 139,208.59375 L 139,193 L 133,193 z"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;fill:url(#linearGradient4879);fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;font-family:Liberation Mono;-inkscape-font-specification:Liberation Mono" />
+ <rect
+ transform="translate(243,141)"
+ y="229.99998"
+ x="112.99998"
+ height="2.9999845"
+ width="27.999998"
+ id="rect4394"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4885);stroke-width:1.99999964;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <rect
+ transform="translate(243,141)"
+ style="opacity:1;fill:url(#linearGradient4887);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="rect4396"
+ width="27.999998"
+ height="3"
+ x="113"
+ y="230" />
+ <rect
+ transform="translate(243,141)"
+ y="232"
+ x="71"
+ height="2"
+ width="21.999998"
+ id="rect4398"
+ style="opacity:1;fill:url(#linearGradient4782);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ </g>
+ <g
+ style="display:inline"
+ inkscape:groupmode="layer"
+ id="g4114"
+ inkscape:label="icon-font-m"
+ transform="translate(-243,-16)">
+ <g
+ inkscape:label="plate11"
+ inkscape:groupmode="layer"
+ id="g4116"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ y="924.36218"
+ x="433"
+ height="48"
+ width="48"
+ id="rect4119"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="48x48" />
+ <rect
+ inkscape:label="32x32"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4121"
+ width="32"
+ height="32"
+ x="397"
+ y="940.36218" />
+ <rect
+ inkscape:label="22x22"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4123"
+ width="22"
+ height="22"
+ x="371"
+ y="950.36218" />
+ <rect
+ inkscape:label="16x16"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4125"
+ width="16"
+ height="16"
+ x="351"
+ y="956.36218" />
+ <text
+ id="text4127"
+ y="914.7832"
+ x="352.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ id="tspan4129"
+ y="914.7832"
+ x="352.55261"
+ sodipodi:role="line">format-font-size-more</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="352.55261"
+ y="929.7832"
+ id="text4131"
+ inkscape:label="context"><tspan
+ id="tspan4133"
+ sodipodi:role="line"
+ x="352.55261"
+ y="929.7832">actions</tspan></text>
+ </g>
+ <g
+ id="g5183">
+ <path
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient4179);stroke-width:1.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 273.99242,588.93573 C 273.80202,588.97805 273.71737,588.97805 273.6116,588.97805 C 272.99804,588.97805 273.04209,588.66063 273.04209,588.11046 L 273.04209,582.09297 C 273.04209,580.12503 271.6034,579.06701 268.87408,579.06701 C 267.2661,579.06701 265.7405,579.17475 265,580 C 264.49223,580.57135 264,581 264,582 L 266,582 C 266,581 267.16033,580.94638 268.81061,580.94638 C 270.39741,580.94638 271.03602,581.28888 271.03602,582.34691 L 271.03602,582.81244 C 271.03602,583.55307 270.84171,583.87048 269.44532,584.03976 C 266.94875,584.35716 266.56791,584.44181 265.89087,584.71691 C 264.60027,585.24592 263.94437,586.24047 263.94437,587.67939 C 263.94437,589.68966 265.34077,590.95929 267.58346,590.95929 C 268.97986,590.95929 270.1012,590.4726 271.3495,589.32993 C 271.47645,590.45144 272.02653,590.95929 273.16903,590.95929 C 273.52872,590.95929 273.42119,590.91698 273.99242,590.76885 L 273.99242,588.93573 M 271.28602,586.98109 C 271.28602,587.57359 271.11675,587.93333 270.58783,588.42002 C 269.86847,589.076 269.00103,589.41457 267.9643,589.41457 C 266.58907,589.41457 265.78509,588.75859 265.78509,587.63708 C 265.78509,586.47324 266.56791,585.88074 268.45092,585.60565 C 270.31278,585.35172 270.69362,585.26709 271.28602,584.99199 L 271.28602,586.98109"
+ id="path4139"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient4181);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 274.03665,588.95786 C 273.84623,589.00017 273.76161,589.00017 273.65581,589.00017 C 273.04225,589.00017 273.04212,588.66068 273.04212,588.11048 L 273.04212,582.09301 C 273.04212,580.12508 271.60342,579.06703 268.8741,579.06703 C 267.26612,579.06703 265.74051,579.17473 265,580 C 264.49223,580.57134 264,581 264,582 L 266,582 C 266,581 267.16035,580.94641 268.81063,580.94641 C 270.39743,580.94641 271.03605,581.28891 271.03605,582.34693 L 271.03605,582.81246 C 271.03605,583.5531 270.84175,583.8705 269.44534,584.03978 C 266.94877,584.35721 266.56793,584.44184 265.89089,584.71693 C 264.60029,585.24594 263.94441,586.2405 263.94441,587.67941 C 263.94441,589.68969 265.3408,590.95933 267.58348,590.95933 C 268.97988,590.95933 270.10123,590.47263 271.34953,589.32995 C 271.47647,590.45146 272.02655,590.95933 273.16906,590.95933 C 273.52875,590.95933 273.4654,590.93909 274.03665,590.79097 L 274.03665,589.45786 M 271.28605,586.98112 C 271.28605,587.57361 271.11679,587.93336 270.58786,588.42005 C 269.86849,589.07601 269.00105,589.41459 267.96432,589.41459 C 266.5891,589.41459 265.78512,588.75862 265.78512,587.6371 C 265.78512,586.47326 266.56793,585.88076 268.45095,585.60567 C 270.31281,585.35175 270.69364,585.26711 271.28605,584.99203 L 271.28605,586.98112"
+ id="path4141"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient4183);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 268.8837,579.0621 C 267.27573,579.0621 265.7405,579.17474 265,580 C 264.49223,580.57134 264,581 264,582 L 266,582 C 266,581 267.16535,580.94273 268.81563,580.94273 C 270.40243,580.94273 271.04991,581.29931 271.04991,582.35734 L 271.04991,582.79896 C 271.04991,583.53959 270.85863,583.88662 269.46222,584.05591 C 266.96566,584.37332 266.56599,584.42628 265.88895,584.70136 C 264.61843,585.22214 263.96927,586.22002 263.94918,587.62291 C 264.54514,587.73133 265.18818,587.7882 265.82088,587.82674 C 265.81458,587.75988 265.78686,587.69348 265.78686,587.62291 C 265.78686,586.45907 266.55828,585.89368 268.44129,585.6186 C 270.30315,585.36465 270.7075,585.28219 271.29991,585.00711 L 271.29991,586.97745 C 271.29991,587.06427 271.27376,587.13728 271.26588,587.21524 C 271.89381,587.02332 272.48055,586.8013 273.03551,586.53582 L 273.03551,582.08557 C 273.03551,580.11762 271.61301,579.0621 268.8837,579.0621 z"
+ id="path4143"
+ sodipodi:nodetypes="csccscccsccsccccccc" />
+ </g>
+ <path
+ sodipodi:nodetypes="csccssccscccssscscccsssccc"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient4187);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 298.79902,587.95051 C 298.54279,588.00718 298.42886,588.00718 298.28651,588.00718 C 297.46077,588.00718 297.00517,587.58216 297.00517,586.84549 L 297.00517,578.1187 C 297.00517,575.48367 295.06895,574.067 291.39579,574.067 C 289.23173,574.067 287.18786,574.44035 286.19128,575.54534 C 285.50791,576.31037 285,577 285,579 L 288,579 C 288,577 289.08939,575.99869 291.31037,575.99869 C 293.44591,575.99869 295,576.58331 295,578 L 295,579 C 295,579.9917 294.04386,580.49875 292.16457,580.72541 C 288.80464,581.15041 288.29211,581.26376 287.38093,581.6321 C 285.64401,582.34044 285.01129,583.67212 285.01129,585.59881 C 285.01129,588.29052 286.64059,589.99052 289.65885,589.99052 C 291.53815,589.99052 293.29727,589.33885 294.97725,587.80885 C 295.14811,589.31052 295.63842,589.99052 297.17601,589.99052 C 297.66009,589.99052 298.03025,589.93387 298.79902,589.73553 L 298.79902,587.95051 M 294.89182,584.6638 C 294.89182,585.45714 294.66401,585.93882 293.95219,586.5905 C 292.98405,587.46884 291.56664,587.92218 290.17139,587.92218 C 288.32058,587.92218 287.23857,587.04383 287.23857,585.54216 C 287.23857,583.9838 288.29211,583.19045 290.82629,582.82211 C 293.33201,582.48211 294.09456,582.36878 294.89182,582.00044 L 294.89182,584.6638"
+ id="path4147" />
+ <path
+ sodipodi:nodetypes="csccssccscccssscscccsssccc"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient4189);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 298.7991,587.95056 C 298.54283,588.00721 298.42894,588.00721 298.28656,588.00721 C 297.46082,588.00721 297.00523,587.58223 297.00523,586.84553 L 297.00523,578.11876 C 297.00523,575.48374 295.069,574.06704 291.39583,574.06704 C 289.23179,574.06704 287.18792,574.44038 286.19132,575.54539 C 285.50796,576.31041 285.05696,577.52664 285,579 L 288,579 C 288,577 289.08943,575.99874 291.31041,575.99874 C 294,575.99874 294.99543,577.04209 294.99543,578.45876 L 294.99543,579.08209 C 294.99543,580.07379 294.04393,580.49878 292.16462,580.72545 C 288.80468,581.15048 288.29215,581.2638 287.38097,581.63214 C 285.64406,582.34047 285.01136,583.67217 285.01136,585.59884 C 285.01136,588.29056 286.64065,589.99059 289.65889,589.99059 C 291.53819,589.99059 293.04732,589.3389 294.72731,587.80888 C 294.89815,589.31056 295.63846,589.99059 297.17607,589.99059 C 297.66015,589.99059 298.0303,589.9339 298.7991,589.73556 L 298.7991,587.95056 M 294.99543,584.66385 C 294.99543,585.45718 294.76764,585.93887 294.05579,586.59054 C 293.08765,587.46885 291.56668,587.92221 290.17143,587.92221 C 288.32064,587.92221 287.23863,587.04388 287.23863,585.54218 C 287.23863,583.98383 288.29215,583.19048 290.82635,582.82214 C 293.33207,582.48216 294.19815,582.36882 294.99543,582.0005 L 294.99543,584.66385"
+ id="path4149" />
+ <path
+ sodipodi:nodetypes="csccscccsccsccccccc"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient4191);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 291.40875,574.06044 C 289.24472,574.06044 287.45895,574.18395 286.46237,575.28896 C 285.779,576.05397 285,577 285,579 L 288,579 C 288,577 289.09616,575.99382 291.31714,575.99382 C 294.00001,575.99382 295.04311,577.05602 295.04311,578.4727 L 295.04311,579.06402 C 295.04311,580.05571 294.06665,580.52037 292.18733,580.74705 C 288.82742,581.17206 288.28953,581.24296 287.37836,581.61129 C 285.66847,582.30861 285.04482,583.64474 285.01778,585.52319 C 285.81984,585.66836 286.43525,585.7445 287.28675,585.79611 C 287.27827,585.70659 287.24096,585.61768 287.24096,585.52319 C 287.24096,583.96483 288.27916,583.20778 290.81335,582.83946 C 293.31907,582.49942 294.24584,582.38901 295.04311,582.02069 L 295.04311,584.65893 C 295.04311,584.77518 295.00791,584.87294 294.99732,584.97732 C 295.84239,584.72035 296.24946,584.42307 296.99633,584.06759 L 296.99633,578.1088 C 296.99633,575.47375 295.0819,574.06044 291.40875,574.06044 z"
+ id="path4151" />
+ <path
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc"
+ id="path4157"
+ d="M 331.53252,586.2532 C 331.1765,586.33161 331.0182,586.33161 330.82041,586.33161 C 329.67309,586.33161 329.04005,585.74351 329.04005,584.72419 L 329.04005,572.64893 C 329.04005,569.00285 326.34977,567.0426 321.24609,567.0426 C 318.23924,567.0426 315.74675,567.90512 314.36205,569.4341 C 313.41254,570.49267 313.0169,571.91884 312.93776,573.9575 L 316.26106,573.9575 C 316.53801,571.44838 318.04146,570.06141 321.12741,570.06141 C 324.09464,570.06141 326.00629,571.15916 326.00629,573.11943 L 326.00629,573.98193 C 326.00629,575.35413 324.92546,575.94221 322.31427,576.25583 C 317.64582,576.84391 316.93369,577.00075 315.66764,577.51042 C 313.25428,578.49056 312.02779,580.3332 312.02779,582.99916 C 312.02779,586.72368 314.63898,589.07596 318.83271,589.07596 C 321.4439,589.07596 323.54074,588.17424 325.875,586.05719 C 326.11239,588.13505 327.14102,589.07596 329.27743,589.07596 C 329.95003,589.07596 330.46435,588.99757 331.53252,588.72313 L 331.53252,586.2532 M 326.00629,581.70538 C 326.00629,582.80313 325.68976,583.46963 324.70073,584.37136 C 323.35555,585.58671 321.48348,586.21399 319.54485,586.21399 C 316.97324,586.21399 315.96984,584.99863 315.96984,582.92078 C 315.96984,580.76446 316.93369,579.66672 320.45481,579.15703 C 323.93638,578.68658 324.89854,578.52977 326.00629,578.02009 L 326.00629,581.70538"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient4197);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ <path
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc"
+ id="path4159"
+ d="M 331.53264,586.25331 C 331.17656,586.3317 331.01831,586.3317 330.82048,586.3317 C 329.67315,586.3317 329.04014,585.74365 329.04014,584.72429 L 329.04014,572.64906 C 329.04014,569.00298 326.34985,567.0427 321.24615,567.0427 C 318.23933,567.0427 315.74684,567.90522 314.36211,569.43422 C 313.4126,570.49277 313.01696,571.91891 312.93782,573.9576 L 316.26117,573.9576 C 316.5381,571.44843 318.04152,570.06151 321.12746,570.06151 C 324.0947,570.06151 326.00638,571.15928 326.00638,573.11952 L 326.00638,573.98201 C 326.00638,575.35423 324.92555,575.94229 322.31435,576.25593 C 317.64588,576.84405 316.93375,577.00084 315.6677,577.51053 C 313.25435,578.49063 312.02788,580.33331 312.02788,582.99924 C 312.02788,586.72377 314.63906,589.07609 318.83277,589.07609 C 321.44396,589.07609 323.54082,588.17436 325.87509,586.05727 C 326.11245,588.13514 327.14108,589.07609 329.27751,589.07609 C 329.95012,589.07609 330.46443,588.99765 331.53264,588.72322 L 331.53264,586.25331 M 326.00638,581.70549 C 326.00638,582.80322 325.68988,583.46974 324.7008,584.37145 C 323.35562,585.58677 321.48354,586.21409 319.54491,586.21409 C 316.97333,586.21409 315.96993,584.99873 315.96993,582.92084 C 315.96993,580.76456 316.93375,579.66679 320.4549,579.15712 C 323.93646,578.68669 324.8986,578.52985 326.00638,578.02022 L 326.00638,581.70549"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient4199);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ <path
+ sodipodi:nodetypes="ccccsccccccsccccccc"
+ id="path4161"
+ d="M 321.26411,567.03357 C 318.25729,567.03357 315.77605,567.89631 314.39135,569.42532 C 313.44184,570.48385 313.00683,571.91657 312.9277,573.95525 L 316.23679,573.95525 C 316.51373,571.44611 318.05088,570.05471 321.13682,570.05471 C 324.10405,570.05471 326.0323,571.17854 326.0323,573.1388 L 326.0323,573.95701 C 326.0323,575.32921 324.95713,575.97216 322.3459,576.28582 C 317.67747,576.8739 316.9301,576.97201 315.66408,577.48166 C 313.28826,578.44654 312.07437,580.29535 312.0368,582.89456 C 313.15123,583.09543 314.85367,583.20079 316.03679,583.2722 C 316.025,583.14833 315.97317,583.02531 315.97317,582.89456 C 315.97317,580.73826 316.91569,579.69072 320.43682,579.18109 C 323.91841,578.71057 324.92453,578.5578 326.0323,578.04815 L 326.0323,581.69869 C 326.0323,581.85954 325.98338,581.99481 325.96866,582.13925 C 327.14286,581.78367 327.99003,581.37233 329.02777,580.88046 L 329.02777,572.63527 C 329.02777,568.98916 326.36776,567.03357 321.26411,567.03357 z"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient4201);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ <path
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient4205);stroke-width:2.25000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 379.85406,583.41253 C 379.28875,583.53649 379.03738,583.53649 378.72332,583.53649 C 376.90153,583.53649 375.89634,582.60676 375.89634,580.99532 L 375.89634,561.90563 C 375.89634,556.14156 371.62452,553.04262 363.52053,553.04262 C 358.74605,553.04262 354.78829,554.40617 352.58957,556.82333 C 351.08187,558.49681 350.20364,560.60621 350.07798,563.82912 L 355.85495,563.82912 C 356.29471,559.86246 358.43199,557.81504 363.33208,557.81504 C 368.04367,557.81504 371.18215,559.55046 371.18215,562.64944 L 371.18215,564.01296 C 371.18215,566.18226 369.3629,567.11195 365.21667,567.60775 C 357.80377,568.53745 356.673,568.78539 354.66268,569.59112 C 350.83057,571.14062 348.88307,574.05364 348.88307,578.26824 C 348.88307,584.1563 353.02929,587.87501 359.6884,587.87501 C 363.83464,587.87501 367.16414,586.44949 370.87065,583.10266 C 371.24759,586.38753 372.88092,587.87501 376.27327,587.87501 C 377.34127,587.87501 378.15794,587.75108 379.85406,587.31723 L 379.85406,583.41253 M 371.18215,576.22291 C 371.18215,577.95833 370.67954,579.012 369.10909,580.43754 C 366.97312,582.35888 364.39748,583.35054 361.31918,583.35054 C 357.2358,583.35054 353.84859,581.42918 353.84859,578.14433 C 353.84859,574.73542 357.173,573 362.76409,572.19424 C 368.29236,571.45051 369.42319,571.20261 371.18215,570.39686 L 371.18215,576.22291"
+ id="path4165" />
+ <path
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient4207);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 379.85424,583.41268 C 379.28882,583.53661 379.03755,583.53661 378.72342,583.53661 C 376.9016,583.53661 375.89646,582.60697 375.89646,580.99547 L 375.89646,561.90581 C 375.89646,556.14175 371.62463,553.04275 363.52062,553.04275 C 358.74617,553.04275 354.78842,554.40631 352.58964,556.82349 C 351.08195,558.49695 350.20372,560.8563 350.07806,564.07926 L 355.8551,564.07926 C 356.29484,560.11252 358.43208,558.06517 363.33215,558.06517 C 368.04374,558.06517 370.93228,559.55063 370.93228,562.64956 L 370.93228,564.01307 C 370.93228,566.1824 369.36303,567.11206 365.21678,567.6079 C 357.80385,568.53765 356.67308,568.78552 354.66275,569.59128 C 350.83067,571.14071 348.88319,574.0538 348.88319,578.26835 C 348.88319,584.15643 353.02941,587.8752 359.68848,587.8752 C 363.83471,587.8752 367.41426,586.44966 371.12078,583.10276 C 371.49767,586.38766 372.881,587.8752 376.27338,587.8752 C 377.3414,587.8752 378.15806,587.75119 379.85424,587.31735 L 379.85424,583.41268 M 370.93228,576.22307 C 370.93228,577.95846 370.42972,579.01216 368.85919,580.43767 C 366.72322,582.35896 364.14756,583.35069 361.06927,583.35069 C 356.98593,583.35069 353.84872,581.42933 353.84872,578.14441 C 353.84872,574.73555 356.67308,573.00009 362.26421,572.19436 C 367.79248,571.45067 369.17326,571.20272 370.93228,570.39705 L 370.93228,576.22307"
+ id="path4167" />
+ <path
+ sodipodi:nodetypes="ccccsccccccsccccccc"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient4209);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 363.54913,553.02833 C 358.77469,553.02833 354.8348,554.39223 352.63608,556.80943 C 351.12838,558.48285 350.18764,560.85261 350.06198,564.07554 L 355.8164,564.07554 C 356.25614,560.10886 358.44694,558.05443 363.34701,558.05443 C 368.05859,558.05443 370.97343,559.58108 370.97343,562.68005 L 370.97343,563.97355 C 370.97343,566.14285 369.41317,567.15928 365.26688,567.65515 C 357.85401,568.58484 356.66728,568.73993 354.65701,569.54564 C 350.88451,571.07102 348.95701,573.99379 348.89735,578.10286 C 350.66692,578.42042 351.98073,578.73086 353.85937,578.84375 C 353.84064,578.64792 353.85386,578.30956 353.85386,578.10286 C 353.85386,574.69398 356.6444,573.03793 362.23551,572.23226 C 367.76382,571.48841 369.21444,571.2469 370.97343,570.44121 L 370.97343,576.21231 C 370.97343,576.46661 370.89576,576.68045 370.87238,576.90879 C 372.73686,576.34666 374.22903,575.69637 375.87682,574.91878 L 375.87682,561.88402 C 375.87682,556.11991 371.65307,553.02833 363.54913,553.02833 z"
+ id="path4169" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4384);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 303,572 L 299,572 L 299,573 L 301,573 L 296,578 L 297,579 L 302,574 L 302,576 L 303,576 L 303,572 z"
+ id="path4380"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path4382"
+ d="M 303,572 L 299,572 L 299,573 L 301,573 L 296,578 L 297,579 L 302,574 L 302,576 L 303,576 L 303,572 z"
+ style="fill:url(#linearGradient4386);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path4320"
+ d="M 278,577 L 274,577 L 274,578 L 276,578 L 272,582 L 273,583 L 277,579 L 277,581 L 278,581 L 278,577 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4332);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4318);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 278,577 L 274,577 L 274,578 L 276,578 L 272,582 L 273,583 L 277,579 L 277,581 L 278,581 L 278,577 z"
+ id="path4227"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient5266);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 339,562 L 331,562 L 331,563.5 L 335,564 L 327,572 L 329,574 L 337,566 L 337.5,570 L 339,570 L 339,562 z"
+ id="path5262"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path5264"
+ d="M 339,562 L 331,562 L 331,563.5 L 335,564 L 327,572 L 329,574 L 337,566 L 337.5,570 L 339,570 L 339,562 z"
+ style="fill:url(#linearGradient5269);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient5279);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 339,562 L 331,562 L 331,563.5 L 335,564 L 327,572 L 328,573 L 339,562 z"
+ id="path5271"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="path5281"
+ sodipodi:cx="96.5"
+ sodipodi:cy="546.5"
+ sodipodi:rx="0.5"
+ sodipodi:ry="0.5"
+ d="m 97,546.5 c 0,0.27614 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.22386 -0.5,-0.5 0,-0.27614 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.22386 0.5,0.5 z"
+ transform="matrix(1.5,0,0,1.5,193.5,-257)" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path5289"
+ d="M 389,548 L 380,548 L 380,549.5 L 385,550 L 373,562 L 375,564 L 387,552 L 387.5,557 L 389,557 L 389,548 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient5297);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient5299);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 389,548 L 380,548 L 380,549.5 L 385,550 L 373,562 L 375,564 L 387,552 L 387.5,557 L 389,557 L 389,548 z"
+ id="path5291"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ id="path5293"
+ d="M 389,548 L 380,548 L 380,549.5 L 385,550 L 373,562 L 374,563 L 389,548 z"
+ style="fill:url(#linearGradient5301);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ transform="matrix(1.5,0,0,1.5,243.5,-271)"
+ d="m 97,546.5 c 0,0.27614 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.22386 -0.5,-0.5 0,-0.27614 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.22386 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="546.5"
+ sodipodi:cx="96.5"
+ id="path5295"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ transform="translate(-243,-16)"
+ inkscape:label="icon-t-super"
+ id="g3697"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g3699"
+ inkscape:groupmode="layer"
+ inkscape:label="plate15">
+ <rect
+ y="924.36218"
+ x="633"
+ height="48"
+ width="48"
+ id="rect3769"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="48x48" />
+ <rect
+ inkscape:label="32x32"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3771"
+ width="32"
+ height="32"
+ x="597"
+ y="940.36218" />
+ <rect
+ inkscape:label="22x22"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3773"
+ width="22"
+ height="22"
+ x="571"
+ y="950.36218" />
+ <rect
+ inkscape:label="16x16"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3775"
+ width="16"
+ height="16"
+ x="551"
+ y="956.36218" />
+ <text
+ id="text3777"
+ y="914.7832"
+ x="552.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ id="tspan3779"
+ y="914.7832"
+ x="552.55261"
+ sodipodi:role="line">format-text-superscript</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="552.55261"
+ y="929.7832"
+ id="text3781"
+ inkscape:label="context"><tspan
+ id="tspan3783"
+ sodipodi:role="line"
+ x="552.55261"
+ y="929.7832">actions</tspan></text>
+ </g>
+ <g
+ id="g3785"
+ transform="translate(200,0)">
+ <path
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient3841);stroke-width:1.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 273.99242,588.93573 C 273.80202,588.97805 273.71737,588.97805 273.6116,588.97805 C 272.99804,588.97805 273.04209,588.66063 273.04209,588.11046 L 273.04209,582.09297 C 273.04209,580.12503 271.6034,579.06701 268.87408,579.06701 C 267.2661,579.06701 265.7405,579.17475 265,580 C 264.49223,580.57135 264,581 264,582 L 266,582 C 266,581 267.16033,580.94638 268.81061,580.94638 C 270.39741,580.94638 271.03602,581.28888 271.03602,582.34691 L 271.03602,582.81244 C 271.03602,583.55307 270.84171,583.87048 269.44532,584.03976 C 266.94875,584.35716 266.56791,584.44181 265.89087,584.71691 C 264.60027,585.24592 263.94437,586.24047 263.94437,587.67939 C 263.94437,589.68966 265.34077,590.95929 267.58346,590.95929 C 268.97986,590.95929 270.1012,590.4726 271.3495,589.32993 C 271.47645,590.45144 272.02653,590.95929 273.16903,590.95929 C 273.52872,590.95929 273.42119,590.91698 273.99242,590.76885 L 273.99242,588.93573 M 271.28602,586.98109 C 271.28602,587.57359 271.11675,587.93333 270.58783,588.42002 C 269.86847,589.076 269.00103,589.41457 267.9643,589.41457 C 266.58907,589.41457 265.78509,588.75859 265.78509,587.63708 C 265.78509,586.47324 266.56791,585.88074 268.45092,585.60565 C 270.31278,585.35172 270.69362,585.26709 271.28602,584.99199 L 271.28602,586.98109"
+ id="path3787"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient3843);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 274.03665,588.95786 C 273.84623,589.00017 273.76161,589.00017 273.65581,589.00017 C 273.04225,589.00017 273.04212,588.66068 273.04212,588.11048 L 273.04212,582.09301 C 273.04212,580.12508 271.60342,579.06703 268.8741,579.06703 C 267.26612,579.06703 265.74051,579.17473 265,580 C 264.49223,580.57134 264,581 264,582 L 266,582 C 266,581 267.16035,580.94641 268.81063,580.94641 C 270.39743,580.94641 271.03605,581.28891 271.03605,582.34693 L 271.03605,582.81246 C 271.03605,583.5531 270.84175,583.8705 269.44534,584.03978 C 266.94877,584.35721 266.56793,584.44184 265.89089,584.71693 C 264.60029,585.24594 263.94441,586.2405 263.94441,587.67941 C 263.94441,589.68969 265.3408,590.95933 267.58348,590.95933 C 268.97988,590.95933 270.10123,590.47263 271.34953,589.32995 C 271.47647,590.45146 272.02655,590.95933 273.16906,590.95933 C 273.52875,590.95933 273.4654,590.93909 274.03665,590.79097 L 274.03665,589.45786 M 271.28605,586.98112 C 271.28605,587.57361 271.11679,587.93336 270.58786,588.42005 C 269.86849,589.07601 269.00105,589.41459 267.96432,589.41459 C 266.5891,589.41459 265.78512,588.75862 265.78512,587.6371 C 265.78512,586.47326 266.56793,585.88076 268.45095,585.60567 C 270.31281,585.35175 270.69364,585.26711 271.28605,584.99203 L 271.28605,586.98112"
+ id="path3789"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient3845);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 268.8837,579.0621 C 267.27573,579.0621 265.7405,579.17474 265,580 C 264.49223,580.57134 264,581 264,582 L 266,582 C 266,581 267.16535,580.94273 268.81563,580.94273 C 270.40243,580.94273 271.04991,581.29931 271.04991,582.35734 L 271.04991,582.79896 C 271.04991,583.53959 270.85863,583.88662 269.46222,584.05591 C 266.96566,584.37332 266.56599,584.42628 265.88895,584.70136 C 264.61843,585.22214 263.96927,586.22002 263.94918,587.62291 C 264.54514,587.73133 265.18818,587.7882 265.82088,587.82674 C 265.81458,587.75988 265.78686,587.69348 265.78686,587.62291 C 265.78686,586.45907 266.55828,585.89368 268.44129,585.6186 C 270.30315,585.36465 270.7075,585.28219 271.29991,585.00711 L 271.29991,586.97745 C 271.29991,587.06427 271.27376,587.13728 271.26588,587.21524 C 271.89381,587.02332 272.48055,586.8013 273.03551,586.53582 L 273.03551,582.08557 C 273.03551,580.11762 271.61301,579.0621 268.8837,579.0621 z"
+ id="path3792"
+ sodipodi:nodetypes="csccscccsccsccccccc" />
+ </g>
+ <path
+ sodipodi:nodetypes="csccssccscccssscscccsssccc"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient3847);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 498.79902,587.95051 C 498.54279,588.00718 498.42886,588.00718 498.28651,588.00718 C 497.46077,588.00718 497.00517,587.58216 497.00517,586.84549 L 497.00517,578.1187 C 497.00517,575.48367 495.06895,574.067 491.39579,574.067 C 489.23173,574.067 487.18786,574.44035 486.19128,575.54534 C 485.50791,576.31037 485,577 485,579 L 488,579 C 488,577 489.08939,575.99869 491.31037,575.99869 C 493.44591,575.99869 495,576.58331 495,578 L 495,579 C 495,579.9917 494.04386,580.49875 492.16457,580.72541 C 488.80464,581.15041 488.29211,581.26376 487.38093,581.6321 C 485.64401,582.34044 485.01129,583.67212 485.01129,585.59881 C 485.01129,588.29052 486.64059,589.99052 489.65885,589.99052 C 491.53815,589.99052 493.29727,589.33885 494.97725,587.80885 C 495.14811,589.31052 495.63842,589.99052 497.17601,589.99052 C 497.66009,589.99052 498.03025,589.93387 498.79902,589.73553 L 498.79902,587.95051 M 494.89182,584.6638 C 494.89182,585.45714 494.66401,585.93882 493.95219,586.5905 C 492.98405,587.46884 491.56664,587.92218 490.17139,587.92218 C 488.32058,587.92218 487.23857,587.04383 487.23857,585.54216 C 487.23857,583.9838 488.29211,583.19045 490.82629,582.82211 C 493.33201,582.48211 494.09456,582.36878 494.89182,582.00044 L 494.89182,584.6638"
+ id="path3794" />
+ <path
+ sodipodi:nodetypes="csccssccscccssscscccsssccc"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient3849);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 498.7991,587.95056 C 498.54283,588.00721 498.42894,588.00721 498.28656,588.00721 C 497.46082,588.00721 497.00523,587.58223 497.00523,586.84553 L 497.00523,578.11876 C 497.00523,575.48374 495.069,574.06704 491.39583,574.06704 C 489.23179,574.06704 487.18792,574.44038 486.19132,575.54539 C 485.50796,576.31041 485.05696,577.52664 485,579 L 488,579 C 488,577 489.08943,575.99874 491.31041,575.99874 C 494,575.99874 494.99543,577.04209 494.99543,578.45876 L 494.99543,579.08209 C 494.99543,580.07379 494.04393,580.49878 492.16462,580.72545 C 488.80468,581.15048 488.29215,581.2638 487.38097,581.63214 C 485.64406,582.34047 485.01136,583.67217 485.01136,585.59884 C 485.01136,588.29056 486.64065,589.99059 489.65889,589.99059 C 491.53819,589.99059 493.04732,589.3389 494.72731,587.80888 C 494.89815,589.31056 495.63846,589.99059 497.17607,589.99059 C 497.66015,589.99059 498.0303,589.9339 498.7991,589.73556 L 498.7991,587.95056 M 494.99543,584.66385 C 494.99543,585.45718 494.76764,585.93887 494.05579,586.59054 C 493.08765,587.46885 491.56668,587.92221 490.17143,587.92221 C 488.32064,587.92221 487.23863,587.04388 487.23863,585.54218 C 487.23863,583.98383 488.29215,583.19048 490.82635,582.82214 C 493.33207,582.48216 494.19815,582.36882 494.99543,582.0005 L 494.99543,584.66385"
+ id="path3796" />
+ <path
+ sodipodi:nodetypes="csccscccsccsccccccc"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient3851);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 491.40875,574.06044 C 489.24472,574.06044 487.45895,574.18395 486.46237,575.28896 C 485.779,576.05397 485,577 485,579 L 488,579 C 488,577 489.09616,575.99382 491.31714,575.99382 C 494.00001,575.99382 495.04311,577.05602 495.04311,578.4727 L 495.04311,579.06402 C 495.04311,580.05571 494.06665,580.52037 492.18733,580.74705 C 488.82742,581.17206 488.28953,581.24296 487.37836,581.61129 C 485.66847,582.30861 485.04482,583.64474 485.01778,585.52319 C 485.81984,585.66836 486.43525,585.7445 487.28675,585.79611 C 487.27827,585.70659 487.24096,585.61768 487.24096,585.52319 C 487.24096,583.96483 488.27916,583.20778 490.81335,582.83946 C 493.31907,582.49942 494.24584,582.38901 495.04311,582.02069 L 495.04311,584.65893 C 495.04311,584.77518 495.00791,584.87294 494.99732,584.97732 C 495.84239,584.72035 496.24946,584.42307 496.99633,584.06759 L 496.99633,578.1088 C 496.99633,575.47375 495.0819,574.06044 491.40875,574.06044 z"
+ id="path3798" />
+ <path
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc"
+ id="path3800"
+ d="M 531.53252,586.2532 C 531.1765,586.33161 531.0182,586.33161 530.82041,586.33161 C 529.67309,586.33161 529.04005,585.74351 529.04005,584.72419 L 529.04005,572.64893 C 529.04005,569.00285 526.34977,567.0426 521.24609,567.0426 C 518.23924,567.0426 515.74675,567.90512 514.36205,569.4341 C 513.41254,570.49267 513.0169,571.91884 512.93776,573.9575 L 516.26106,573.9575 C 516.53801,571.44838 518.04146,570.06141 521.12741,570.06141 C 524.09464,570.06141 526.00629,571.15916 526.00629,573.11943 L 526.00629,573.98193 C 526.00629,575.35413 524.92546,575.94221 522.31427,576.25583 C 517.64582,576.84391 516.93369,577.00075 515.66764,577.51042 C 513.25428,578.49056 512.02779,580.3332 512.02779,582.99916 C 512.02779,586.72368 514.63898,589.07596 518.83271,589.07596 C 521.4439,589.07596 523.54074,588.17424 525.875,586.05719 C 526.11239,588.13505 527.14102,589.07596 529.27743,589.07596 C 529.95003,589.07596 530.46435,588.99757 531.53252,588.72313 L 531.53252,586.2532 M 526.00629,581.70538 C 526.00629,582.80313 525.68976,583.46963 524.70073,584.37136 C 523.35555,585.58671 521.48348,586.21399 519.54485,586.21399 C 516.97324,586.21399 515.96984,584.99863 515.96984,582.92078 C 515.96984,580.76446 516.93369,579.66672 520.45481,579.15703 C 523.93638,578.68658 524.89854,578.52977 526.00629,578.02009 L 526.00629,581.70538"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient3853);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ <path
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc"
+ id="path3802"
+ d="M 531.53264,586.25331 C 531.17656,586.3317 531.01831,586.3317 530.82048,586.3317 C 529.67315,586.3317 529.04014,585.74365 529.04014,584.72429 L 529.04014,572.64906 C 529.04014,569.00298 526.34985,567.0427 521.24615,567.0427 C 518.23933,567.0427 515.74684,567.90522 514.36211,569.43422 C 513.4126,570.49277 513.01696,571.91891 512.93782,573.9576 L 516.26117,573.9576 C 516.5381,571.44843 518.04152,570.06151 521.12746,570.06151 C 524.0947,570.06151 526.00638,571.15928 526.00638,573.11952 L 526.00638,573.98201 C 526.00638,575.35423 524.92555,575.94229 522.31435,576.25593 C 517.64588,576.84405 516.93375,577.00084 515.6677,577.51053 C 513.25435,578.49063 512.02788,580.33331 512.02788,582.99924 C 512.02788,586.72377 514.63906,589.07609 518.83277,589.07609 C 521.44396,589.07609 523.54082,588.17436 525.87509,586.05727 C 526.11245,588.13514 527.14108,589.07609 529.27751,589.07609 C 529.95012,589.07609 530.46443,588.99765 531.53264,588.72322 L 531.53264,586.25331 M 526.00638,581.70549 C 526.00638,582.80322 525.68988,583.46974 524.7008,584.37145 C 523.35562,585.58677 521.48354,586.21409 519.54491,586.21409 C 516.97333,586.21409 515.96993,584.99873 515.96993,582.92084 C 515.96993,580.76456 516.93375,579.66679 520.4549,579.15712 C 523.93646,578.68669 524.8986,578.52985 526.00638,578.02022 L 526.00638,581.70549"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient3855);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ <path
+ sodipodi:nodetypes="ccccsccccccsccccccc"
+ id="path3809"
+ d="M 521.26411,567.03357 C 518.25729,567.03357 515.77605,567.89631 514.39135,569.42532 C 513.44184,570.48385 513.00683,571.91657 512.9277,573.95525 L 516.23679,573.95525 C 516.51373,571.44611 518.05088,570.05471 521.13682,570.05471 C 524.10405,570.05471 526.0323,571.17854 526.0323,573.1388 L 526.0323,573.95701 C 526.0323,575.32921 524.95713,575.97216 522.3459,576.28582 C 517.67747,576.8739 516.9301,576.97201 515.66408,577.48166 C 513.28826,578.44654 512.07437,580.29535 512.0368,582.89456 C 513.15123,583.09543 514.85367,583.20079 516.03679,583.2722 C 516.025,583.14833 515.97317,583.02531 515.97317,582.89456 C 515.97317,580.73826 516.91569,579.69072 520.43682,579.18109 C 523.91841,578.71057 524.92453,578.5578 526.0323,578.04815 L 526.0323,581.69869 C 526.0323,581.85954 525.98338,581.99481 525.96866,582.13925 C 527.14286,581.78367 527.99003,581.37233 529.02777,580.88046 L 529.02777,572.63527 C 529.02777,568.98916 526.36776,567.03357 521.26411,567.03357 z"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient3857);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ <path
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient3859);stroke-width:2.25000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 579.85406,583.41253 C 579.28875,583.53649 579.03738,583.53649 578.72332,583.53649 C 576.90153,583.53649 575.89634,582.60676 575.89634,580.99532 L 575.89634,561.90563 C 575.89634,556.14156 571.62452,553.04262 563.52053,553.04262 C 558.74605,553.04262 554.78829,554.40617 552.58957,556.82333 C 551.08187,558.49681 550.20364,560.60621 550.07798,563.82912 L 555.85495,563.82912 C 556.29471,559.86246 558.43199,557.81504 563.33208,557.81504 C 568.04367,557.81504 571.18215,559.55046 571.18215,562.64944 L 571.18215,564.01296 C 571.18215,566.18226 569.3629,567.11195 565.21667,567.60775 C 557.80377,568.53745 556.673,568.78539 554.66268,569.59112 C 550.83057,571.14062 548.88307,574.05364 548.88307,578.26824 C 548.88307,584.1563 553.02929,587.87501 559.6884,587.87501 C 563.83464,587.87501 567.16414,586.44949 570.87065,583.10266 C 571.24759,586.38753 572.88092,587.87501 576.27327,587.87501 C 577.34127,587.87501 578.15794,587.75108 579.85406,587.31723 L 579.85406,583.41253 M 571.18215,576.22291 C 571.18215,577.95833 570.67954,579.012 569.10909,580.43754 C 566.97312,582.35888 564.39748,583.35054 561.31918,583.35054 C 557.2358,583.35054 553.84859,581.42918 553.84859,578.14433 C 553.84859,574.73542 557.173,573 562.76409,572.19424 C 568.29236,571.45051 569.42319,571.20261 571.18215,570.39686 L 571.18215,576.22291"
+ id="path3811" />
+ <path
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient3861);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 579.85424,583.41268 C 579.28882,583.53661 579.03755,583.53661 578.72342,583.53661 C 576.9016,583.53661 575.89646,582.60697 575.89646,580.99547 L 575.89646,561.90581 C 575.89646,556.14175 571.62463,553.04275 563.52062,553.04275 C 558.74617,553.04275 554.78842,554.40631 552.58964,556.82349 C 551.08195,558.49695 550.20372,560.8563 550.07806,564.07926 L 555.8551,564.07926 C 556.29484,560.11252 558.43208,558.06517 563.33215,558.06517 C 568.04374,558.06517 570.93228,559.55063 570.93228,562.64956 L 570.93228,564.01307 C 570.93228,566.1824 569.36303,567.11206 565.21678,567.6079 C 557.80385,568.53765 556.67308,568.78552 554.66275,569.59128 C 550.83067,571.14071 548.88319,574.0538 548.88319,578.26835 C 548.88319,584.15643 553.02941,587.8752 559.68848,587.8752 C 563.83471,587.8752 567.41426,586.44966 571.12078,583.10276 C 571.49767,586.38766 572.881,587.8752 576.27338,587.8752 C 577.3414,587.8752 578.15806,587.75119 579.85424,587.31735 L 579.85424,583.41268 M 570.93228,576.22307 C 570.93228,577.95846 570.42972,579.01216 568.85919,580.43767 C 566.72322,582.35896 564.14756,583.35069 561.06927,583.35069 C 556.98593,583.35069 553.84872,581.42933 553.84872,578.14441 C 553.84872,574.73555 556.67308,573.00009 562.26421,572.19436 C 567.79248,571.45067 569.17326,571.20272 570.93228,570.39705 L 570.93228,576.22307"
+ id="path3813" />
+ <path
+ sodipodi:nodetypes="ccccsccccccsccccccc"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient3863);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 563.54913,553.02833 C 558.77469,553.02833 554.8348,554.39223 552.63608,556.80943 C 551.12838,558.48285 550.18764,560.85261 550.06198,564.07554 L 555.8164,564.07554 C 556.25614,560.10886 558.44694,558.05443 563.34701,558.05443 C 568.05859,558.05443 570.97343,559.58108 570.97343,562.68005 L 570.97343,563.97355 C 570.97343,566.14285 569.41317,567.15928 565.26688,567.65515 C 557.85401,568.58484 556.66728,568.73993 554.65701,569.54564 C 550.88451,571.07102 548.95701,573.99379 548.89735,578.10286 C 550.66692,578.42042 551.98073,578.73086 553.85937,578.84375 C 553.84064,578.64792 553.85386,578.30956 553.85386,578.10286 C 553.85386,574.69398 556.6444,573.03793 562.23551,572.23226 C 567.76382,571.48841 569.21444,571.2469 570.97343,570.44121 L 570.97343,576.21231 C 570.97343,576.46661 570.89576,576.68045 570.87238,576.90879 C 572.73686,576.34666 574.22903,575.69637 575.87682,574.91878 L 575.87682,561.88402 C 575.87682,556.11991 571.65307,553.02833 563.54913,553.02833 z"
+ id="path3815" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4686"
+ y="582.83167"
+ x="473.06799"
+ style="font-size:41.50268172999999905px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#linearGradient4691);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:10.37567042999999956px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#linearGradient4691);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans;stroke-linecap:round"
+ y="582.83167"
+ x="473.06799"
+ id="tspan4688"
+ sodipodi:role="line">s</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:41.61470032px;font-style:normal;font-weight:normal;line-height:125%;fill:#e6f0ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="473.06067"
+ y="582.86823"
+ id="text3885"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3888"
+ x="473.06067"
+ y="582.86823"
+ style="font-size:10.40367508px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e6f0ff;fill-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans">s</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:41.50268172999999905px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#linearGradient4701);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="498.06799"
+ y="577.83167"
+ id="text4693"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4695"
+ x="498.06799"
+ y="577.83167"
+ style="font-size:10.37567042999999956px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#linearGradient4701);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans;stroke-linecap:round">s</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4697"
+ y="577.86823"
+ x="498.06067"
+ style="font-size:41.61470032px;font-style:normal;font-weight:normal;line-height:125%;fill:#e6f0ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:10.40367508px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e6f0ff;fill-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ y="577.86823"
+ x="498.06067"
+ id="tspan4699"
+ sodipodi:role="line">s</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:57.68485259999999926px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#linearGradient4711);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="532.00323"
+ y="569.93585"
+ id="text4703"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4705"
+ x="532.00323"
+ y="569.93585"
+ style="font-size:14.42121314999999981px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#linearGradient4711);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans;stroke-linecap:round">s</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4707"
+ y="569.98676"
+ x="531.9931"
+ style="font-size:57.84054947px;font-style:normal;font-weight:normal;line-height:125%;fill:#e6f0ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:14.46013737px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e6f0ff;fill-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ y="569.98676"
+ x="531.9931"
+ id="tspan4709"
+ sodipodi:role="line">s</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4713"
+ y="557.90936"
+ x="581.06451"
+ style="font-size:71.95162200999999413px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#linearGradient4721);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:17.98790550000000010px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#linearGradient4721);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans;stroke-linecap:round"
+ y="557.90936"
+ x="581.06451"
+ id="tspan4715"
+ sodipodi:role="line">s</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:72.14582062px;font-style:normal;font-weight:normal;line-height:125%;fill:#e6f0ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="581.05188"
+ y="557.97284"
+ id="text4717"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4719"
+ x="581.05188"
+ y="557.97284"
+ style="font-size:18.03645515px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e6f0ff;fill-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans">s</tspan></text>
+ </g>
+ <g
+ style="display:inline"
+ inkscape:groupmode="layer"
+ id="g4723"
+ inkscape:label="icon-t-sub"
+ transform="translate(-243,-16)">
+ <g
+ inkscape:label="plate16"
+ inkscape:groupmode="layer"
+ id="g4725"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4727"
+ width="48"
+ height="48"
+ x="633"
+ y="1004.3622" />
+ <rect
+ y="1020.3622"
+ x="597"
+ height="32"
+ width="32"
+ id="rect4729"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="32x32" />
+ <rect
+ y="1030.3622"
+ x="571"
+ height="22"
+ width="22"
+ id="rect4731"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="22x22" />
+ <rect
+ y="1036.3622"
+ x="551"
+ height="16"
+ width="16"
+ id="rect4733"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="552.55261"
+ y="994.7832"
+ id="text4735"><tspan
+ sodipodi:role="line"
+ x="552.55261"
+ y="994.7832"
+ id="tspan4737"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-text-subscript</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text4739"
+ y="1009.7832"
+ x="552.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="1009.7832"
+ x="552.55261"
+ sodipodi:role="line"
+ id="tspan4741">actions</tspan></text>
+ </g>
+ <g
+ transform="translate(200,78)"
+ id="g4743">
+ <path
+ sodipodi:nodetypes="csccssccscccssscscccsssccc"
+ id="path4746"
+ d="M 273.99242,588.93573 C 273.80202,588.97805 273.71737,588.97805 273.6116,588.97805 C 272.99804,588.97805 273.04209,588.66063 273.04209,588.11046 L 273.04209,582.09297 C 273.04209,580.12503 271.6034,579.06701 268.87408,579.06701 C 267.2661,579.06701 265.7405,579.17475 265,580 C 264.49223,580.57135 264,581 264,582 L 266,582 C 266,581 267.16033,580.94638 268.81061,580.94638 C 270.39741,580.94638 271.03602,581.28888 271.03602,582.34691 L 271.03602,582.81244 C 271.03602,583.55307 270.84171,583.87048 269.44532,584.03976 C 266.94875,584.35716 266.56791,584.44181 265.89087,584.71691 C 264.60027,585.24592 263.94437,586.24047 263.94437,587.67939 C 263.94437,589.68966 265.34077,590.95929 267.58346,590.95929 C 268.97986,590.95929 270.1012,590.4726 271.3495,589.32993 C 271.47645,590.45144 272.02653,590.95929 273.16903,590.95929 C 273.52872,590.95929 273.42119,590.91698 273.99242,590.76885 L 273.99242,588.93573 M 271.28602,586.98109 C 271.28602,587.57359 271.11675,587.93333 270.58783,588.42002 C 269.86847,589.076 269.00103,589.41457 267.9643,589.41457 C 266.58907,589.41457 265.78509,588.75859 265.78509,587.63708 C 265.78509,586.47324 266.56791,585.88074 268.45092,585.60565 C 270.31278,585.35172 270.69362,585.26709 271.28602,584.99199 L 271.28602,586.98109"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient4832);stroke-width:1.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ <path
+ sodipodi:nodetypes="csccssccscccssscscccsssccc"
+ id="path4750"
+ d="M 274.03665,588.95786 C 273.84623,589.00017 273.76161,589.00017 273.65581,589.00017 C 273.04225,589.00017 273.04212,588.66068 273.04212,588.11048 L 273.04212,582.09301 C 273.04212,580.12508 271.60342,579.06703 268.8741,579.06703 C 267.26612,579.06703 265.74051,579.17473 265,580 C 264.49223,580.57134 264,581 264,582 L 266,582 C 266,581 267.16035,580.94641 268.81063,580.94641 C 270.39743,580.94641 271.03605,581.28891 271.03605,582.34693 L 271.03605,582.81246 C 271.03605,583.5531 270.84175,583.8705 269.44534,584.03978 C 266.94877,584.35721 266.56793,584.44184 265.89089,584.71693 C 264.60029,585.24594 263.94441,586.2405 263.94441,587.67941 C 263.94441,589.68969 265.3408,590.95933 267.58348,590.95933 C 268.97988,590.95933 270.10123,590.47263 271.34953,589.32995 C 271.47647,590.45146 272.02655,590.95933 273.16906,590.95933 C 273.52875,590.95933 273.4654,590.93909 274.03665,590.79097 L 274.03665,589.45786 M 271.28605,586.98112 C 271.28605,587.57361 271.11679,587.93336 270.58786,588.42005 C 269.86849,589.07601 269.00105,589.41459 267.96432,589.41459 C 266.5891,589.41459 265.78512,588.75862 265.78512,587.6371 C 265.78512,586.47326 266.56793,585.88076 268.45095,585.60567 C 270.31281,585.35175 270.69364,585.26711 271.28605,584.99203 L 271.28605,586.98112"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient4834);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ <path
+ sodipodi:nodetypes="csccscccsccsccccccc"
+ id="path4752"
+ d="M 268.8837,579.0621 C 267.27573,579.0621 265.7405,579.17474 265,580 C 264.49223,580.57134 264,581 264,582 L 266,582 C 266,581 267.16535,580.94273 268.81563,580.94273 C 270.40243,580.94273 271.04991,581.29931 271.04991,582.35734 L 271.04991,582.79896 C 271.04991,583.53959 270.85863,583.88662 269.46222,584.05591 C 266.96566,584.37332 266.56599,584.42628 265.88895,584.70136 C 264.61843,585.22214 263.96927,586.22002 263.94918,587.62291 C 264.54514,587.73133 265.18818,587.7882 265.82088,587.82674 C 265.81458,587.75988 265.78686,587.69348 265.78686,587.62291 C 265.78686,586.45907 266.55828,585.89368 268.44129,585.6186 C 270.30315,585.36465 270.7075,585.28219 271.29991,585.00711 L 271.29991,586.97745 C 271.29991,587.06427 271.27376,587.13728 271.26588,587.21524 C 271.89381,587.02332 272.48055,586.8013 273.03551,586.53582 L 273.03551,582.08557 C 273.03551,580.11762 271.61301,579.0621 268.8837,579.0621 z"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient4837);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" />
+ </g>
+ <path
+ id="path4756"
+ d="M 498.79902,665.95051 C 498.54279,666.00718 498.42886,666.00718 498.28651,666.00718 C 497.46077,666.00718 497.00517,665.58216 497.00517,664.84549 L 497.00517,656.1187 C 497.00517,653.48367 495.06895,652.067 491.39579,652.067 C 489.23173,652.067 487.18786,652.44035 486.19128,653.54534 C 485.50791,654.31037 485,655 485,657 L 488,657 C 488,655 489.08939,653.99869 491.31037,653.99869 C 493.44591,653.99869 495,654.58331 495,656 L 495,657 C 495,657.9917 494.04386,658.49875 492.16457,658.72541 C 488.80464,659.15041 488.29211,659.26376 487.38093,659.6321 C 485.64401,660.34044 485.01129,661.67212 485.01129,663.59881 C 485.01129,666.29052 486.64059,667.99052 489.65885,667.99052 C 491.53815,667.99052 493.29727,667.33885 494.97725,665.80885 C 495.14811,667.31052 495.63842,667.99052 497.17601,667.99052 C 497.66009,667.99052 498.03025,667.93387 498.79902,667.73553 L 498.79902,665.95051 M 494.89182,662.6638 C 494.89182,663.45714 494.66401,663.93882 493.95219,664.5905 C 492.98405,665.46884 491.56664,665.92218 490.17139,665.92218 C 488.32058,665.92218 487.23857,665.04383 487.23857,663.54216 C 487.23857,661.9838 488.29211,661.19045 490.82629,660.82211 C 493.33201,660.48211 494.09456,660.36878 494.89182,660.00044 L 494.89182,662.6638"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient4830);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ id="path4758"
+ d="M 498.7991,665.95056 C 498.54283,666.00721 498.42894,666.00721 498.28656,666.00721 C 497.46082,666.00721 497.00523,665.58223 497.00523,664.84553 L 497.00523,656.11876 C 497.00523,653.48374 495.069,652.06704 491.39583,652.06704 C 489.23179,652.06704 487.18792,652.44038 486.19132,653.54539 C 485.50796,654.31041 485.05696,655.52664 485,657 L 488,657 C 488,655 489.08943,653.99874 491.31041,653.99874 C 494,653.99874 494.99543,655.04209 494.99543,656.45876 L 494.99543,657.08209 C 494.99543,658.07379 494.04393,658.49878 492.16462,658.72545 C 488.80468,659.15048 488.29215,659.2638 487.38097,659.63214 C 485.64406,660.34047 485.01136,661.67217 485.01136,663.59884 C 485.01136,666.29056 486.64065,667.99059 489.65889,667.99059 C 491.53819,667.99059 493.04732,667.3389 494.72731,665.80888 C 494.89815,667.31056 495.63846,667.99059 497.17607,667.99059 C 497.66015,667.99059 498.0303,667.9339 498.7991,667.73556 L 498.7991,665.95056 M 494.99543,662.66385 C 494.99543,663.45718 494.76764,663.93887 494.05579,664.59054 C 493.08765,665.46885 491.56668,665.92221 490.17143,665.92221 C 488.32064,665.92221 487.23863,665.04388 487.23863,663.54218 C 487.23863,661.98383 488.29215,661.19048 490.82635,660.82214 C 493.33207,660.48216 494.19815,660.36882 494.99543,660.0005 L 494.99543,662.66385"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient4828);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ id="path4760"
+ d="M 491.40875,652.06044 C 489.24472,652.06044 487.45895,652.18395 486.46237,653.28896 C 485.779,654.05397 485,655 485,657 L 488,657 C 488,655 489.09616,653.99382 491.31714,653.99382 C 494.00001,653.99382 495.04311,655.05602 495.04311,656.4727 L 495.04311,657.06402 C 495.04311,658.05571 494.06665,658.52037 492.18733,658.74705 C 488.82742,659.17206 488.28953,659.24296 487.37836,659.61129 C 485.66847,660.30861 485.04482,661.64474 485.01778,663.52319 C 485.81984,663.66836 486.43525,663.7445 487.28675,663.79611 C 487.27827,663.70659 487.24096,663.61768 487.24096,663.52319 C 487.24096,661.96483 488.27916,661.20778 490.81335,660.83946 C 493.31907,660.49942 494.24584,660.38901 495.04311,660.02069 L 495.04311,662.65893 C 495.04311,662.77518 495.00791,662.87294 494.99732,662.97732 C 495.84239,662.72035 496.24946,662.42307 496.99633,662.06759 L 496.99633,656.1088 C 496.99633,653.47375 495.0819,652.06044 491.40875,652.06044 z"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient4826);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccscccsccsccccccc" />
+ <path
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient4824);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 531.53252,662.2532 C 531.1765,662.33161 531.0182,662.33161 530.82041,662.33161 C 529.67309,662.33161 529.04005,661.74351 529.04005,660.72419 L 529.04005,648.64893 C 529.04005,645.00285 526.34977,643.0426 521.24609,643.0426 C 518.23924,643.0426 515.74675,643.90512 514.36205,645.4341 C 513.41254,646.49267 513.0169,647.91884 512.93776,649.9575 L 516.26106,649.9575 C 516.53801,647.44838 518.04146,646.06141 521.12741,646.06141 C 524.09464,646.06141 526.00629,647.15916 526.00629,649.11943 L 526.00629,649.98193 C 526.00629,651.35413 524.92546,651.94221 522.31427,652.25583 C 517.64582,652.84391 516.93369,653.00075 515.66764,653.51042 C 513.25428,654.49056 512.02779,656.3332 512.02779,658.99916 C 512.02779,662.72368 514.63898,665.07596 518.83271,665.07596 C 521.4439,665.07596 523.54074,664.17424 525.875,662.05719 C 526.11239,664.13505 527.14102,665.07596 529.27743,665.07596 C 529.95003,665.07596 530.46435,664.99757 531.53252,664.72313 L 531.53252,662.2532 M 526.00629,657.70538 C 526.00629,658.80313 525.68976,659.46963 524.70073,660.37136 C 523.35555,661.58671 521.48348,662.21399 519.54485,662.21399 C 516.97324,662.21399 515.96984,660.99863 515.96984,658.92078 C 515.96984,656.76446 516.93369,655.66672 520.45481,655.15703 C 523.93638,654.68658 524.89854,654.52977 526.00629,654.02009 L 526.00629,657.70538"
+ id="path4762"
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient4822);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 531.53264,662.25331 C 531.17656,662.3317 531.01831,662.3317 530.82048,662.3317 C 529.67315,662.3317 529.04014,661.74365 529.04014,660.72429 L 529.04014,648.64906 C 529.04014,645.00298 526.34985,643.0427 521.24615,643.0427 C 518.23933,643.0427 515.74684,643.90522 514.36211,645.43422 C 513.4126,646.49277 513.01696,647.91891 512.93782,649.9576 L 516.26117,649.9576 C 516.5381,647.44843 518.04152,646.06151 521.12746,646.06151 C 524.0947,646.06151 526.00638,647.15928 526.00638,649.11952 L 526.00638,649.98201 C 526.00638,651.35423 524.92555,651.94229 522.31435,652.25593 C 517.64588,652.84405 516.93375,653.00084 515.6677,653.51053 C 513.25435,654.49063 512.02788,656.33331 512.02788,658.99924 C 512.02788,662.72377 514.63906,665.07609 518.83277,665.07609 C 521.44396,665.07609 523.54082,664.17436 525.87509,662.05727 C 526.11245,664.13514 527.14108,665.07609 529.27751,665.07609 C 529.95012,665.07609 530.46443,664.99765 531.53264,664.72322 L 531.53264,662.25331 M 526.00638,657.70549 C 526.00638,658.80322 525.68988,659.46974 524.7008,660.37145 C 523.35562,661.58677 521.48354,662.21409 519.54491,662.21409 C 516.97333,662.21409 515.96993,660.99873 515.96993,658.92084 C 515.96993,656.76456 516.93375,655.66679 520.4549,655.15712 C 523.93646,654.68669 524.8986,654.52985 526.00638,654.02022 L 526.00638,657.70549"
+ id="path4764"
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient4820);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 521.26411,643.03357 C 518.25729,643.03357 515.77605,643.89631 514.39135,645.42532 C 513.44184,646.48385 513.00683,647.91657 512.9277,649.95525 L 516.23679,649.95525 C 516.51373,647.44611 518.05088,646.05471 521.13682,646.05471 C 524.10405,646.05471 526.0323,647.17854 526.0323,649.1388 L 526.0323,649.95701 C 526.0323,651.32921 524.95713,651.97216 522.3459,652.28582 C 517.67747,652.8739 516.9301,652.97201 515.66408,653.48166 C 513.28826,654.44654 512.07437,656.29535 512.0368,658.89456 C 513.15123,659.09543 514.85367,659.20079 516.03679,659.2722 C 516.025,659.14833 515.97317,659.02531 515.97317,658.89456 C 515.97317,656.73826 516.91569,655.69072 520.43682,655.18109 C 523.91841,654.71057 524.92453,654.5578 526.0323,654.04815 L 526.0323,657.69869 C 526.0323,657.85954 525.98338,657.99481 525.96866,658.13925 C 527.14286,657.78367 527.99003,657.37233 529.02777,656.88046 L 529.02777,648.63527 C 529.02777,644.98916 526.36776,643.03357 521.26411,643.03357 z"
+ id="path4766"
+ sodipodi:nodetypes="ccccsccccccsccccccc" />
+ <path
+ id="path4768"
+ d="M 579.85406,658.41253 C 579.28875,658.53649 579.03738,658.53649 578.72332,658.53649 C 576.90153,658.53649 575.89634,657.60676 575.89634,655.99532 L 575.89634,636.90563 C 575.89634,631.14156 571.62452,628.04262 563.52053,628.04262 C 558.74605,628.04262 554.78829,629.40617 552.58957,631.82333 C 551.08187,633.49681 550.20364,635.60621 550.07798,638.82912 L 555.85495,638.82912 C 556.29471,634.86246 558.43199,632.81504 563.33208,632.81504 C 568.04367,632.81504 571.18215,634.55046 571.18215,637.64944 L 571.18215,639.01296 C 571.18215,641.18226 569.3629,642.11195 565.21667,642.60775 C 557.80377,643.53745 556.673,643.78539 554.66268,644.59112 C 550.83057,646.14062 548.88307,649.05364 548.88307,653.26824 C 548.88307,659.1563 553.02929,662.87501 559.6884,662.87501 C 563.83464,662.87501 567.16414,661.44949 570.87065,658.10266 C 571.24759,661.38753 572.88092,662.87501 576.27327,662.87501 C 577.34127,662.87501 578.15794,662.75108 579.85406,662.31723 L 579.85406,658.41253 M 571.18215,651.22291 C 571.18215,652.95833 570.67954,654.012 569.10909,655.43754 C 566.97312,657.35888 564.39748,658.35054 561.31918,658.35054 C 557.2358,658.35054 553.84859,656.42918 553.84859,653.14433 C 553.84859,649.73542 557.173,648 562.76409,647.19424 C 568.29236,646.45051 569.42319,646.20261 571.18215,645.39686 L 571.18215,651.22291"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient4818);stroke-width:2.25000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc" />
+ <path
+ id="path4770"
+ d="M 579.85424,658.41268 C 579.28882,658.53661 579.03755,658.53661 578.72342,658.53661 C 576.9016,658.53661 575.89646,657.60697 575.89646,655.99547 L 575.89646,636.90581 C 575.89646,631.14175 571.62463,628.04275 563.52062,628.04275 C 558.74617,628.04275 554.78842,629.40631 552.58964,631.82349 C 551.08195,633.49695 550.20372,635.8563 550.07806,639.07926 L 555.8551,639.07926 C 556.29484,635.11252 558.43208,633.06517 563.33215,633.06517 C 568.04374,633.06517 570.93228,634.55063 570.93228,637.64956 L 570.93228,639.01307 C 570.93228,641.1824 569.36303,642.11206 565.21678,642.6079 C 557.80385,643.53765 556.67308,643.78552 554.66275,644.59128 C 550.83067,646.14071 548.88319,649.0538 548.88319,653.26835 C 548.88319,659.15643 553.02941,662.8752 559.68848,662.8752 C 563.83471,662.8752 567.41426,661.44966 571.12078,658.10276 C 571.49767,661.38766 572.881,662.8752 576.27338,662.8752 C 577.3414,662.8752 578.15806,662.75119 579.85424,662.31735 L 579.85424,658.41268 M 570.93228,651.22307 C 570.93228,652.95846 570.42972,654.01216 568.85919,655.43767 C 566.72322,657.35896 564.14756,658.35069 561.06927,658.35069 C 556.98593,658.35069 553.84872,656.42933 553.84872,653.14441 C 553.84872,649.73555 556.67308,648.00009 562.26421,647.19436 C 567.79248,646.45067 569.17326,646.20272 570.93228,645.39705 L 570.93228,651.22307"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient4816);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc" />
+ <path
+ id="path4772"
+ d="M 563.54913,628.02833 C 558.77469,628.02833 554.8348,629.39223 552.63608,631.80943 C 551.12838,633.48285 550.18764,635.85261 550.06198,639.07554 L 555.8164,639.07554 C 556.25614,635.10886 558.44694,633.05443 563.34701,633.05443 C 568.05859,633.05443 570.97343,634.58108 570.97343,637.68005 L 570.97343,638.97355 C 570.97343,641.14285 569.41317,642.15928 565.26688,642.65515 C 557.85401,643.58484 556.66728,643.73993 554.65701,644.54564 C 550.88451,646.07102 548.95701,648.99379 548.89735,653.10286 C 550.66692,653.42042 551.98073,653.73086 553.85937,653.84375 C 553.84064,653.64792 553.85386,653.30956 553.85386,653.10286 C 553.85386,649.69398 556.6444,648.03793 562.23551,647.23226 C 567.76382,646.48841 569.21444,646.2469 570.97343,645.44121 L 570.97343,651.21231 C 570.97343,651.46661 570.89576,651.68045 570.87238,651.90879 C 572.73686,651.34666 574.22903,650.69637 575.87682,649.91878 L 575.87682,636.88402 C 575.87682,631.11991 571.65307,628.02833 563.54913,628.02833 z"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient4814);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="ccccsccccccsccccccc" />
+ <text
+ xml:space="preserve"
+ style="font-size:41.50268172999999905px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#linearGradient4812);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="473.06799"
+ y="670.83167"
+ id="text4774"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4776"
+ x="473.06799"
+ y="670.83167"
+ style="font-size:10.37567042999999956px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#linearGradient4812);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans;stroke-linecap:round">s</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4778"
+ y="670.86823"
+ x="473.06067"
+ style="font-size:41.61470032px;font-style:normal;font-weight:normal;line-height:125%;fill:#e6f0ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:10.40367508px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e6f0ff;fill-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ y="670.86823"
+ x="473.06067"
+ id="tspan4780"
+ sodipodi:role="line">s</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4782"
+ y="670.83167"
+ x="498.06799"
+ style="font-size:41.50268172999999905px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#linearGradient4810);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:10.37567042999999956px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#linearGradient4810);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans;stroke-linecap:round"
+ y="670.83167"
+ x="498.06799"
+ id="tspan4784"
+ sodipodi:role="line">s</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:41.61470032px;font-style:normal;font-weight:normal;line-height:125%;fill:#e6f0ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="498.06067"
+ y="670.86823"
+ id="text4786"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4788"
+ x="498.06067"
+ y="670.86823"
+ style="font-size:10.40367508px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e6f0ff;fill-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans">s</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4790"
+ y="669.93585"
+ x="532.00323"
+ style="font-size:57.68485259999999926px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#linearGradient4808);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:14.42121314999999981px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#linearGradient4808);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans;stroke-linecap:round"
+ y="669.93585"
+ x="532.00323"
+ id="tspan4792"
+ sodipodi:role="line">s</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:57.84054947px;font-style:normal;font-weight:normal;line-height:125%;fill:#e6f0ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="531.9931"
+ y="669.98676"
+ id="text4794"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4796"
+ x="531.9931"
+ y="669.98676"
+ style="font-size:14.46013737px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e6f0ff;fill-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans">s</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:71.95162200999999413px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#linearGradient4806);stroke-width:2.00000023999999987;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="581.06451"
+ y="668.90936"
+ id="text4798"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4800"
+ x="581.06451"
+ y="668.90936"
+ style="font-size:17.98790550000000010px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#linearGradient4806);stroke-width:2.00000023999999987;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans;stroke-linecap:round">s</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4802"
+ y="668.97284"
+ x="581.05188"
+ style="font-size:72.14582062px;font-style:normal;font-weight:normal;line-height:125%;fill:#e6f0ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18.03645515px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#e6f0ff;fill-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+ y="668.97284"
+ x="581.05188"
+ id="tspan4804"
+ sodipodi:role="line">s</tspan></text>
+ </g>
+ <g
+ transform="translate(-243,-16)"
+ inkscape:label="icon-font-l"
+ id="g4714"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g4716"
+ inkscape:groupmode="layer"
+ inkscape:label="plate12">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4718"
+ width="48"
+ height="48"
+ x="433"
+ y="1014.3622" />
+ <rect
+ y="1030.3622"
+ x="397"
+ height="32"
+ width="32"
+ id="rect4720"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="32x32" />
+ <rect
+ y="1040.3622"
+ x="371"
+ height="22"
+ width="22"
+ id="rect4722"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="22x22" />
+ <rect
+ y="1046.3622"
+ x="351"
+ height="16"
+ width="16"
+ id="rect4724"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="352.55261"
+ y="1004.7832"
+ id="text4726"><tspan
+ sodipodi:role="line"
+ x="352.55261"
+ y="1004.7832"
+ id="tspan4728"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-font-size-less</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text4730"
+ y="1019.7832"
+ x="352.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="1019.7832"
+ x="352.55261"
+ sodipodi:role="line"
+ id="tspan4732">actions</tspan></text>
+ </g>
+ <path
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient5157);stroke-width:1.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 273.99242,678.93573 C 273.80202,678.97805 273.71737,678.97805 273.6116,678.97805 C 272.99804,678.97805 273.04209,678.66063 273.04209,678.11046 L 273.04209,672.09297 C 273.04209,670.12503 271.6034,669.06701 268.87408,669.06701 C 267.2661,669.06701 265.7405,669.17475 265,670 C 264.49223,670.57135 264,671 264,672 L 266,672 C 266,671 267.16033,670.94638 268.81061,670.94638 C 270.39741,670.94638 271.03602,671.28888 271.03602,672.34691 L 271.03602,672.81244 C 271.03602,673.55307 270.84171,673.87048 269.44532,674.03976 C 266.94875,674.35716 266.56791,674.44181 265.89087,674.71691 C 264.60027,675.24592 263.94437,676.24047 263.94437,677.67939 C 263.94437,679.68966 265.34077,680.95929 267.58346,680.95929 C 268.97986,680.95929 270.1012,680.4726 271.3495,679.32993 C 271.47645,680.45144 272.02653,680.95929 273.16903,680.95929 C 273.52872,680.95929 273.42119,680.91698 273.99242,680.76885 L 273.99242,678.93573 M 271.28602,676.98109 C 271.28602,677.57359 271.11675,677.93333 270.58783,678.42002 C 269.86847,679.076 269.00103,679.41457 267.9643,679.41457 C 266.58907,679.41457 265.78509,678.75859 265.78509,677.63708 C 265.78509,676.47324 266.56791,675.88074 268.45092,675.60565 C 270.31278,675.35172 270.69362,675.26709 271.28602,674.99199 L 271.28602,676.98109"
+ id="path4734"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient5155);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 274.03665,678.95786 C 273.84623,679.00017 273.76161,679.00017 273.65581,679.00017 C 273.04225,679.00017 273.04212,678.66068 273.04212,678.11048 L 273.04212,672.09301 C 273.04212,670.12508 271.60342,669.06703 268.8741,669.06703 C 267.26612,669.06703 265.74051,669.17473 265,670 C 264.49223,670.57134 264,671 264,672 L 266,672 C 266,671 267.16035,670.94641 268.81063,670.94641 C 270.39743,670.94641 271.03605,671.28891 271.03605,672.34693 L 271.03605,672.81246 C 271.03605,673.5531 270.84175,673.8705 269.44534,674.03978 C 266.94877,674.35721 266.56793,674.44184 265.89089,674.71693 C 264.60029,675.24594 263.94441,676.2405 263.94441,677.67941 C 263.94441,679.68969 265.3408,680.95933 267.58348,680.95933 C 268.97988,680.95933 270.10123,680.47263 271.34953,679.32995 C 271.47647,680.45146 272.02655,680.95933 273.16906,680.95933 C 273.52875,680.95933 273.4654,680.93909 274.03665,680.79097 L 274.03665,679.45786 M 271.28605,676.98112 C 271.28605,677.57361 271.11679,677.93336 270.58786,678.42005 C 269.86849,679.07601 269.00105,679.41459 267.96432,679.41459 C 266.5891,679.41459 265.78512,678.75862 265.78512,677.6371 C 265.78512,676.47326 266.56793,675.88076 268.45095,675.60567 C 270.31281,675.35175 270.69364,675.26711 271.28605,674.99203 L 271.28605,676.98112"
+ id="path4736"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient5153);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 268.8837,669.0621 C 267.27573,669.0621 265.7405,669.17474 265,670 C 264.49223,670.57134 264,671 264,672 L 266,672 C 266,671 267.16535,670.94273 268.81563,670.94273 C 270.40243,670.94273 271.04991,671.29931 271.04991,672.35734 L 271.04991,672.79896 C 271.04991,673.53959 270.85863,673.88662 269.46222,674.05591 C 266.96566,674.37332 266.56599,674.42628 265.88895,674.70136 C 264.61843,675.22214 263.96927,676.22002 263.94918,677.62291 C 264.54514,677.73133 265.18818,677.7882 265.82088,677.82674 C 265.81458,677.75988 265.78686,677.69348 265.78686,677.62291 C 265.78686,676.45907 266.55828,675.89368 268.44129,675.6186 C 270.30315,675.36465 270.7075,675.28219 271.29991,675.00711 L 271.29991,676.97745 C 271.29991,677.06427 271.27376,677.13728 271.26588,677.21524 C 271.89381,677.02332 272.48055,676.8013 273.03551,676.53582 L 273.03551,672.08557 C 273.03551,670.11762 271.61301,669.0621 268.8837,669.0621 z"
+ id="path4739"
+ sodipodi:nodetypes="csccscccsccsccccccc" />
+ <path
+ id="path4741"
+ d="M 298.79902,677.95051 C 298.54279,678.00718 298.42886,678.00718 298.28651,678.00718 C 297.46077,678.00718 297.00517,677.58216 297.00517,676.84549 L 297.00517,668.1187 C 297.00517,665.48367 295.06895,664.067 291.39579,664.067 C 289.23173,664.067 287.18786,664.44035 286.19128,665.54534 C 285.50791,666.31037 285,667 285,669 L 288,669 C 288,667 289.08939,665.99869 291.31037,665.99869 C 293.44591,665.99869 295,666.58331 295,668 L 295,669 C 295,669.9917 294.04386,670.49875 292.16457,670.72541 C 288.80464,671.15041 288.29211,671.26376 287.38093,671.6321 C 285.64401,672.34044 285.01129,673.67212 285.01129,675.59881 C 285.01129,678.29052 286.64059,679.99052 289.65885,679.99052 C 291.53815,679.99052 293.29727,679.33885 294.97725,677.80885 C 295.14811,679.31052 295.63842,679.99052 297.17601,679.99052 C 297.66009,679.99052 298.03025,679.93387 298.79902,679.73553 L 298.79902,677.95051 M 294.89182,674.6638 C 294.89182,675.45714 294.66401,675.93882 293.95219,676.5905 C 292.98405,677.46884 291.56664,677.92218 290.17139,677.92218 C 288.32058,677.92218 287.23857,677.04383 287.23857,675.54216 C 287.23857,673.9838 288.29211,673.19045 290.82629,672.82211 C 293.33201,672.48211 294.09456,672.36878 294.89182,672.00044 L 294.89182,674.6638"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient5151);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ id="path4743"
+ d="M 298.7991,677.95056 C 298.54283,678.00721 298.42894,678.00721 298.28656,678.00721 C 297.46082,678.00721 297.00523,677.58223 297.00523,676.84553 L 297.00523,668.11876 C 297.00523,665.48374 295.069,664.06704 291.39583,664.06704 C 289.23179,664.06704 287.18792,664.44038 286.19132,665.54539 C 285.50796,666.31041 285.05696,667.52664 285,669 L 288,669 C 288,667 289.08943,665.99874 291.31041,665.99874 C 294,665.99874 294.99543,667.04209 294.99543,668.45876 L 294.99543,669.08209 C 294.99543,670.07379 294.04393,670.49878 292.16462,670.72545 C 288.80468,671.15048 288.29215,671.2638 287.38097,671.63214 C 285.64406,672.34047 285.01136,673.67217 285.01136,675.59884 C 285.01136,678.29056 286.64065,679.99059 289.65889,679.99059 C 291.53819,679.99059 293.04732,679.3389 294.72731,677.80888 C 294.89815,679.31056 295.63846,679.99059 297.17607,679.99059 C 297.66015,679.99059 298.0303,679.9339 298.7991,679.73556 L 298.7991,677.95056 M 294.99543,674.66385 C 294.99543,675.45718 294.76764,675.93887 294.05579,676.59054 C 293.08765,677.46885 291.56668,677.92221 290.17143,677.92221 C 288.32064,677.92221 287.23863,677.04388 287.23863,675.54218 C 287.23863,673.98383 288.29215,673.19048 290.82635,672.82214 C 293.33207,672.48216 294.19815,672.36882 294.99543,672.0005 L 294.99543,674.66385"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient5149);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccssccscccssscscccsssccc" />
+ <path
+ id="path4745"
+ d="M 291.40875,664.06044 C 289.24472,664.06044 287.45895,664.18395 286.46237,665.28896 C 285.779,666.05397 285,667 285,669 L 288,669 C 288,667 289.09616,665.99382 291.31714,665.99382 C 294.00001,665.99382 295.04311,667.05602 295.04311,668.4727 L 295.04311,669.06402 C 295.04311,670.05571 294.06665,670.52037 292.18733,670.74705 C 288.82742,671.17206 288.28953,671.24296 287.37836,671.61129 C 285.66847,672.30861 285.04482,673.64474 285.01778,675.52319 C 285.81984,675.66836 286.43525,675.7445 287.28675,675.79611 C 287.27827,675.70659 287.24096,675.61768 287.24096,675.52319 C 287.24096,673.96483 288.27916,673.20778 290.81335,672.83946 C 293.31907,672.49942 294.24584,672.38901 295.04311,672.02069 L 295.04311,674.65893 C 295.04311,674.77518 295.00791,674.87294 294.99732,674.97732 C 295.84239,674.72035 296.24946,674.42307 296.99633,674.06759 L 296.99633,668.1088 C 296.99633,665.47375 295.0819,664.06044 291.40875,664.06044 z"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient5147);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccscccsccsccccccc" />
+ <path
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient5145);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 331.53252,676.2532 C 331.1765,676.33161 331.0182,676.33161 330.82041,676.33161 C 329.67309,676.33161 329.04005,675.74351 329.04005,674.72419 L 329.04005,662.64893 C 329.04005,659.00285 326.34977,657.0426 321.24609,657.0426 C 318.23924,657.0426 315.74675,657.90512 314.36205,659.4341 C 313.41254,660.49267 313.0169,661.91884 312.93776,663.9575 L 316.26106,663.9575 C 316.53801,661.44838 318.04146,660.06141 321.12741,660.06141 C 324.09464,660.06141 326.00629,661.15916 326.00629,663.11943 L 326.00629,663.98193 C 326.00629,665.35413 324.92546,665.94221 322.31427,666.25583 C 317.64582,666.84391 316.93369,667.00075 315.66764,667.51042 C 313.25428,668.49056 312.02779,670.3332 312.02779,672.99916 C 312.02779,676.72368 314.63898,679.07596 318.83271,679.07596 C 321.4439,679.07596 323.54074,678.17424 325.875,676.05719 C 326.11239,678.13505 327.14102,679.07596 329.27743,679.07596 C 329.95003,679.07596 330.46435,678.99757 331.53252,678.72313 L 331.53252,676.2532 M 326.00629,671.70538 C 326.00629,672.80313 325.68976,673.46963 324.70073,674.37136 C 323.35555,675.58671 321.48348,676.21399 319.54485,676.21399 C 316.97324,676.21399 315.96984,674.99863 315.96984,672.92078 C 315.96984,670.76446 316.93369,669.66672 320.45481,669.15703 C 323.93638,668.68658 324.89854,668.52977 326.00629,668.02009 L 326.00629,671.70538"
+ id="path4747"
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient5143);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 331.53264,676.25331 C 331.17656,676.3317 331.01831,676.3317 330.82048,676.3317 C 329.67315,676.3317 329.04014,675.74365 329.04014,674.72429 L 329.04014,662.64906 C 329.04014,659.00298 326.34985,657.0427 321.24615,657.0427 C 318.23933,657.0427 315.74684,657.90522 314.36211,659.43422 C 313.4126,660.49277 313.01696,661.91891 312.93782,663.9576 L 316.26117,663.9576 C 316.5381,661.44843 318.04152,660.06151 321.12746,660.06151 C 324.0947,660.06151 326.00638,661.15928 326.00638,663.11952 L 326.00638,663.98201 C 326.00638,665.35423 324.92555,665.94229 322.31435,666.25593 C 317.64588,666.84405 316.93375,667.00084 315.6677,667.51053 C 313.25435,668.49063 312.02788,670.33331 312.02788,672.99924 C 312.02788,676.72377 314.63906,679.07609 318.83277,679.07609 C 321.44396,679.07609 323.54082,678.17436 325.87509,676.05727 C 326.11245,678.13514 327.14108,679.07609 329.27751,679.07609 C 329.95012,679.07609 330.46443,678.99765 331.53264,678.72322 L 331.53264,676.25331 M 326.00638,671.70549 C 326.00638,672.80322 325.68988,673.46974 324.7008,674.37145 C 323.35562,675.58677 321.48354,676.21409 319.54491,676.21409 C 316.97333,676.21409 315.96993,674.99873 315.96993,672.92084 C 315.96993,670.76456 316.93375,669.66679 320.4549,669.15712 C 323.93646,668.68669 324.8986,668.52985 326.00638,668.02022 L 326.00638,671.70549"
+ id="path4749"
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc" />
+ <path
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient5141);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ d="M 321.26411,657.03357 C 318.25729,657.03357 315.77605,657.89631 314.39135,659.42532 C 313.44184,660.48385 313.00683,661.91657 312.9277,663.95525 L 316.23679,663.95525 C 316.51373,661.44611 318.05088,660.05471 321.13682,660.05471 C 324.10405,660.05471 326.0323,661.17854 326.0323,663.1388 L 326.0323,663.95701 C 326.0323,665.32921 324.95713,665.97216 322.3459,666.28582 C 317.67747,666.8739 316.9301,666.97201 315.66408,667.48166 C 313.28826,668.44654 312.07437,670.29535 312.0368,672.89456 C 313.15123,673.09543 314.85367,673.20079 316.03679,673.2722 C 316.025,673.14833 315.97317,673.02531 315.97317,672.89456 C 315.97317,670.73826 316.91569,669.69072 320.43682,669.18109 C 323.91841,668.71057 324.92453,668.5578 326.0323,668.04815 L 326.0323,671.69869 C 326.0323,671.85954 325.98338,671.99481 325.96866,672.13925 C 327.14286,671.78367 327.99003,671.37233 329.02777,670.88046 L 329.02777,662.63527 C 329.02777,658.98916 326.36776,657.03357 321.26411,657.03357 z"
+ id="path4751"
+ sodipodi:nodetypes="ccccsccccccsccccccc" />
+ <path
+ id="path4753"
+ d="M 379.85406,673.41253 C 379.28875,673.53649 379.03738,673.53649 378.72332,673.53649 C 376.90153,673.53649 375.89634,672.60676 375.89634,670.99532 L 375.89634,651.90563 C 375.89634,646.14156 371.62452,643.04262 363.52053,643.04262 C 358.74605,643.04262 354.78829,644.40617 352.58957,646.82333 C 351.08187,648.49681 350.20364,650.60621 350.07798,653.82912 L 355.85495,653.82912 C 356.29471,649.86246 358.43199,647.81504 363.33208,647.81504 C 368.04367,647.81504 371.18215,649.55046 371.18215,652.64944 L 371.18215,654.01296 C 371.18215,656.18226 369.3629,657.11195 365.21667,657.60775 C 357.80377,658.53745 356.673,658.78539 354.66268,659.59112 C 350.83057,661.14062 348.88307,664.05364 348.88307,668.26824 C 348.88307,674.1563 353.02929,677.87501 359.6884,677.87501 C 363.83464,677.87501 367.16414,676.44949 370.87065,673.10266 C 371.24759,676.38753 372.88092,677.87501 376.27327,677.87501 C 377.34127,677.87501 378.15794,677.75108 379.85406,677.31723 L 379.85406,673.41253 M 371.18215,666.22291 C 371.18215,667.95833 370.67954,669.012 369.10909,670.43754 C 366.97312,672.35888 364.39748,673.35054 361.31918,673.35054 C 357.2358,673.35054 353.84859,671.42918 353.84859,668.14433 C 353.84859,664.73542 357.173,663 362.76409,662.19424 C 368.29236,661.45051 369.42319,661.20261 371.18215,660.39686 L 371.18215,666.22291"
+ style="font-size:19.44691658px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:none;fill-opacity:1;stroke:url(#linearGradient5139);stroke-width:2.25000024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc" />
+ <path
+ id="path4755"
+ d="M 379.85424,673.41268 C 379.28882,673.53661 379.03755,673.53661 378.72342,673.53661 C 376.9016,673.53661 375.89646,672.60697 375.89646,670.99547 L 375.89646,651.90581 C 375.89646,646.14175 371.62463,643.04275 363.52062,643.04275 C 358.74617,643.04275 354.78842,644.40631 352.58964,646.82349 C 351.08195,648.49695 350.20372,650.8563 350.07806,654.07926 L 355.8551,654.07926 C 356.29484,650.11252 358.43208,648.06517 363.33215,648.06517 C 368.04374,648.06517 370.93228,649.55063 370.93228,652.64956 L 370.93228,654.01307 C 370.93228,656.1824 369.36303,657.11206 365.21678,657.6079 C 357.80385,658.53765 356.67308,658.78552 354.66275,659.59128 C 350.83067,661.14071 348.88319,664.0538 348.88319,668.26835 C 348.88319,674.15643 353.02941,677.8752 359.68848,677.8752 C 363.83471,677.8752 367.41426,676.44966 371.12078,673.10276 C 371.49767,676.38766 372.881,677.8752 376.27338,677.8752 C 377.3414,677.8752 378.15806,677.75119 379.85424,677.31735 L 379.85424,673.41268 M 370.93228,666.22307 C 370.93228,667.95846 370.42972,669.01216 368.85919,670.43767 C 366.72322,672.35896 364.14756,673.35069 361.06927,673.35069 C 356.98593,673.35069 353.84872,671.42933 353.84872,668.14441 C 353.84872,664.73555 356.67308,663.00009 362.26421,662.19436 C 367.79248,661.45067 369.17326,661.20272 370.93228,660.39705 L 370.93228,666.22307"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#radialGradient5137);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="csccscccsccccsscsccccssccc" />
+ <path
+ id="path4757"
+ d="M 363.54913,643.02833 C 358.77469,643.02833 354.8348,644.39223 352.63608,646.80943 C 351.12838,648.48285 350.18764,650.85261 350.06198,654.07554 L 355.8164,654.07554 C 356.25614,650.10886 358.44694,648.05443 363.34701,648.05443 C 368.05859,648.05443 370.97343,649.58108 370.97343,652.68005 L 370.97343,653.97355 C 370.97343,656.14285 369.41317,657.15928 365.26688,657.65515 C 357.85401,658.58484 356.66728,658.73993 354.65701,659.54564 C 350.88451,661.07102 348.95701,663.99379 348.89735,668.10286 C 350.66692,668.42042 351.98073,668.73086 353.85937,668.84375 C 353.84064,668.64792 353.85386,668.30956 353.85386,668.10286 C 353.85386,664.69398 356.6444,663.03793 362.23551,662.23226 C 367.76382,661.48841 369.21444,661.2469 370.97343,660.44121 L 370.97343,666.21231 C 370.97343,666.46661 370.89576,666.68045 370.87238,666.90879 C 372.73686,666.34666 374.22903,665.69637 375.87682,664.91878 L 375.87682,651.88402 C 375.87682,646.11991 371.65307,643.02833 363.54913,643.02833 z"
+ style="font-size:19.44691849px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient5135);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L"
+ sodipodi:nodetypes="ccccsccccccsccccccc" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient5133);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 272.00002,673 L 276.00002,672.99999 L 276,671.99998 L 274,672 L 278.00001,668 L 277,666.99999 L 273.00001,670.99999 L 273.00003,668.99999 L 272.00002,669.00001 L 272.00002,673 z"
+ id="path4759"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path4761"
+ d="M 272.00002,673 L 276.00002,672.99999 L 276,671.99998 L 274,672 L 278.00001,668 L 277,666.99999 L 273.00001,670.99999 L 273.00003,668.99999 L 272.00002,669.00001 L 272.00002,673 z"
+ style="fill:url(#linearGradient5131);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path4809"
+ d="M 296,669 L 300,669 L 300,668 L 298,668 L 303,663 L 302,662 L 297,667 L 297,665 L 296,665 L 296,669 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient5129);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient5127);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 296,669 L 300,669 L 300,668 L 298,668 L 303,663 L 302,662 L 297,667 L 297,665 L 296,665 L 296,669 z"
+ id="path4811"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path5303"
+ d="M 328,662.99998 L 328.00001,654.99999 L 329.50001,654.99998 L 330,658.99998 L 338.00001,650.99999 L 340.00002,652.99999 L 332.00001,660.99999 L 336.00001,661.49999 L 336.00001,663 L 328,662.99998 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient5389);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <path
+ style="fill:url(#linearGradient5387);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ d="M 328,662.99998 L 328.00001,654.99999 L 329.50001,654.99998 L 330,658.99998 L 338.00001,650.99999 L 340.00002,652.99999 L 332.00001,660.99999 L 336.00001,661.49999 L 336.00001,663 L 328,662.99998 z"
+ id="path5305"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ id="path5307"
+ d="M 328,662.99998 L 328.00001,654.99999 L 329.50001,654.99998 L 330,658.99998 L 338.00001,650.99999 L 338.99999,651.99999 L 328,662.99998 z"
+ style="fill:url(#linearGradient5385);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+ <path
+ transform="matrix(-4.1450216e-8,1.5,1.5,4.1450216e-8,-490.99999,517.49999)"
+ d="m 97,546.5 c 0,0.27614 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.22386 -0.5,-0.5 0,-0.27614 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.22386 0.5,0.5 z"
+ sodipodi:ry="0.5"
+ sodipodi:rx="0.5"
+ sodipodi:cy="546.5"
+ sodipodi:cx="96.5"
+ id="path5309"
+ style="opacity:1;fill:#ffbfbf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient5399);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ d="M 374,652.99998 L 374.00001,643.99999 L 375.50001,643.99998 L 376,648.99998 L 389.00001,635.99999 L 391.00002,637.99999 L 378.00001,650.99999 L 383.00001,651.49999 L 383.00001,653 L 374,652.99998 z"
+ id="path5391"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ id="path5393"
+ d="M 374,652.99998 L 374.00001,643.99999 L 375.50001,643.99998 L 376,648.99998 L 389.00001,635.99999 L 391.00002,637.99999 L 378.00001,650.99999 L 383.00001,651.49999 L 383.00001,653 L 374,652.99998 z"
+ style="fill:url(#linearGradient5401);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+ <path
+ style="fill:url(#linearGradient5403);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ d="M 374,652.99998 L 374.00001,643.99999 L 375.50001,643.99998 L 376,648.99998 L 389.00001,635.99999 L 389.99999,636.99999 L 374,652.99998 z"
+ id="path5395"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffbfbf;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ id="path5397"
+ sodipodi:cx="96.5"
+ sodipodi:cy="546.5"
+ sodipodi:rx="0.5"
+ sodipodi:ry="0.5"
+ d="m 97,546.5 c 0,0.27614 -0.223858,0.5 -0.5,0.5 -0.276142,0 -0.5,-0.22386 -0.5,-0.5 0,-0.27614 0.223858,-0.5 0.5,-0.5 0.276142,0 0.5,0.22386 0.5,0.5 z"
+ transform="matrix(-4.1450216e-8,1.5,1.5,4.1450216e-8,-444.99999,507.49999)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="icon-italic"
+ transform="translate(-243,-141)"
+ style="display:inline">
+ <g
+ inkscape:label="plate2"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ inkscape:label="48x48"
+ y="629.36218"
+ x="433"
+ height="48"
+ width="48"
+ id="rect3345"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3347"
+ width="32"
+ height="32"
+ x="397"
+ y="645.36218"
+ inkscape:label="32x32" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3349"
+ width="22"
+ height="22"
+ x="371"
+ y="655.36218"
+ inkscape:label="22x22"
+ inkscape:export-filename="/home/dmiller/format-text-italic.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3351"
+ width="16"
+ height="16"
+ x="351"
+ y="661.36218"
+ inkscape:label="16x16" />
+ <text
+ id="text3353"
+ y="619.7832"
+ x="352.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ id="tspan3355"
+ y="619.7832"
+ x="352.55261"
+ sodipodi:role="line">format-text-italic</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="352.55261"
+ y="634.7832"
+ id="text3357"
+ inkscape:label="context"><tspan
+ id="tspan3359"
+ sodipodi:role="line"
+ x="352.55261"
+ y="634.7832">actions</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="cssssscccccssccsssccscc"
+ id="path4714"
+ d="M 271.95374,284.08644 C 271.35699,284.08646 271.09118,283.79586 271.15632,283.21467 C 271.19411,282.87739 271.30997,282.60756 271.5039,282.40517 C 271.70359,282.19762 271.94874,282.09383 272.23933,282.09382 C 272.83607,282.09383 273.10159,282.38701 273.03588,282.97338 C 272.99516,283.33662 272.87324,283.61425 272.67011,283.80624 C 272.47274,283.99305 272.23395,284.08646 271.95374,284.08644 M 269.00271,287.04281 L 269.01044,286.01462 L 272.19995,286.01462 L 270.31624,291.86482 C 270.036,292.73255 269.82138,293.45056 269.76847,293.92279 C 269.69965,294.5367 269.86595,294.84365 270.26735,294.84365 C 270.61562,294.84365 271.06702,294.68722 271.62155,294.37436 L 271.88962,294.90563 C 270.97069,295.62578 270.11278,295.98586 269.31589,295.98586 C 268.86726,295.98586 268.52243,295.82353 268.28138,295.49887 C 268.04033,295.17421 267.94758,294.76396 268.00316,294.26811 C 268.06402,293.72505 268.35433,292.72665 268.77803,291.36897 L 269.82343,288.28242 C 269.88659,288.08763 269.92511,287.92825 269.939,287.80428 C 269.99589,287.29664 269.97964,287.04282 269.24177,287.04281 L 269.00271,287.04281"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4718);stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans" />
+ <path
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4695);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ d="M 271.95374,284.08644 C 271.35699,284.08646 271.09118,283.79586 271.15632,283.21467 C 271.19411,282.87739 271.30997,282.60756 271.5039,282.40517 C 271.70359,282.19762 271.94874,282.09383 272.23933,282.09382 C 272.83607,282.09383 273.10159,282.38701 273.03588,282.97338 C 272.99516,283.33662 272.87324,283.61425 272.67011,283.80624 C 272.47274,283.99305 272.23395,284.08646 271.95374,284.08644 M 269.00815,286.99427 L 269.01044,286.01462 L 272.19995,286.01462 L 270.31624,291.86482 C 270.036,292.73255 269.82138,293.45056 269.76847,293.92279 C 269.69965,294.5367 269.86595,294.84365 270.26735,294.84365 C 270.61562,294.84365 271.06702,294.68722 271.62155,294.37436 L 271.88962,294.90563 C 270.97069,295.62578 270.11278,295.98586 269.31589,295.98586 C 268.86726,295.98586 268.52243,295.82353 268.28138,295.49887 C 268.04033,295.17421 267.94758,294.76396 268.00316,294.26811 C 268.06402,293.72505 268.35433,292.72665 268.77803,291.36897 L 269.82887,288.23388 C 269.89203,288.03909 269.93055,287.87971 269.94444,287.75574 C 270.00133,287.2481 269.98508,286.99428 269.24721,286.99427 L 269.00815,286.99427"
+ id="text3920"
+ sodipodi:nodetypes="cssssscccccssccsssccscc" />
+ <path
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4712);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ d="M 268.99972,286.00723 L 269.01035,287.00665 L 269.26035,287.00665 C 269.99822,287.00666 269.9907,287.24902 269.93381,287.75665 C 269.91992,287.88062 269.88193,288.03061 269.81878,288.2254 L 269.21364,290 L 270.93239,290 L 272.18968,286.00723 L 268.99972,286.00723 z"
+ id="path4697"
+ sodipodi:nodetypes="cccsccccc" />
+ <path
+ sodipodi:nodetypes="csssssc"
+ id="path4720"
+ d="M 271.95374,284.08644 C 271.35699,284.08646 271.09118,283.79586 271.15632,283.21467 C 271.19411,282.87739 271.30997,282.60756 271.5039,282.40517 C 271.70359,282.19762 271.94874,282.09383 272.23933,282.09382 C 272.83607,282.09383 273.10159,282.38701 273.03588,282.97338 C 272.99516,283.33662 272.87324,283.61425 272.67011,283.80624 C 272.47274,283.99305 272.23395,284.08646 271.95374,284.08644"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:#f8f8f8;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" />
+ <path
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4730);stroke-width:1.99999952;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ d="M 295.2643,279.02193 C 294.36881,279.02196 293.96995,278.58588 294.06768,277.71373 C 294.12441,277.20758 294.29824,276.80269 294.58928,276.49895 C 294.88895,276.18747 295.25681,276.03173 295.69289,276.03172 C 296.58839,276.03173 296.98682,276.47172 296.88821,277.35166 C 296.82709,277.89673 296.64416,278.31332 296.33936,278.60146 C 296.04317,278.88177 295.68484,279.02196 295.2643,279.02193 M 291.97036,283.34194 L 291.98041,282.00515 L 295.70518,282.00515 L 293.25611,289.61119 C 292.89174,290.73936 292.61272,291.67286 292.54391,292.28685 C 292.45446,293.08502 292.67065,293.48406 293.19253,293.48406 C 293.64532,293.48406 294.23221,293.28069 294.95318,292.87393 L 295.30171,293.56465 C 294.10698,294.50093 292.99157,294.96911 291.95552,294.96911 C 291.37224,294.96911 290.92391,294.75804 290.61051,294.33596 C 290.29708,293.91386 290.1765,293.38048 290.24878,292.73581 C 290.32792,292.02976 290.70533,290.73168 291.25622,288.96654 L 292.61537,284.9536 C 292.6975,284.70033 292.74758,284.49313 292.76565,284.33197 C 292.83961,283.67196 292.8711,283.34194 292.28115,283.34194 L 291.97036,283.34194"
+ id="path4722"
+ sodipodi:nodetypes="cssssscccccssccsssccscc"
+ inkscape:export-filename="/home/pinheiro/pics/oxygen-icons/22x22/actions/format-text-italic.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ sodipodi:nodetypes="cssssscccccssccsssccscc"
+ id="path4724"
+ d="M 295.38509,278.8529 C 294.60919,278.85294 294.26365,278.47512 294.34833,277.71949 C 294.39745,277.28099 294.5481,276.93016 294.80024,276.66702 C 295.05986,276.39719 295.37859,276.26223 295.75638,276.26222 C 296.53226,276.26223 296.87743,276.64342 296.792,277.40576 C 296.73905,277.87803 296.58053,278.239 296.31646,278.48861 C 296.05983,278.73148 295.74939,278.85294 295.38509,278.8529 M 292.00556,283.00251 L 292.0015,282.00515 L 295.70519,282.00515 L 293.25612,289.61123 C 292.89176,290.73939 292.61271,291.67289 292.54393,292.28685 C 292.45446,293.08501 292.67068,293.48407 293.19255,293.48407 C 293.64536,293.48407 294.23223,293.28071 294.95318,292.87396 L 295.30171,293.56466 C 294.10696,294.50097 292.99159,294.96912 291.95552,294.96912 C 291.37225,294.96912 290.92393,294.75807 290.6105,294.33598 C 290.29712,293.91385 290.17653,293.38051 290.24882,292.7358 C 290.32795,292.02978 290.70538,290.73172 291.25624,288.96654 L 292.70686,284.61417 C 292.78899,284.36095 292.83906,284.15374 292.85712,283.99254 C 292.93109,283.33255 292.86116,283.00251 292.31637,283.00251 L 292.00556,283.00251"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4732);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ inkscape:export-filename="/home/pinheiro/pics/oxygen-icons/22x22/actions/format-text-italic.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ sodipodi:nodetypes="cccsccccc"
+ id="path4726"
+ d="M 291.99461,281.99559 L 292.01143,283.00604 L 292.33647,283.00604 C 292.86675,283.01309 292.93433,283.35635 292.86036,284.01634 C 292.84233,284.17751 292.79292,284.37254 292.71082,284.62579 L 291.87334,286.98375 L 294.10793,286.98375 L 295.69183,281.99559 L 291.99461,281.99559 z"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4734);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ inkscape:export-filename="/home/pinheiro/pics/oxygen-icons/22x22/actions/format-text-italic.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:#f8f8f8;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ d="M 295.28791,279.07217 C 294.36226,279.07222 293.95003,278.62148 294.05105,277.72001 C 294.10965,277.19688 294.28938,276.77834 294.59018,276.46442 C 294.89991,276.14251 295.28015,275.9815 295.73085,275.98149 C 296.65648,275.9815 297.06827,276.43626 296.96635,277.34573 C 296.90318,277.90915 296.71407,278.33979 296.39903,278.63757 C 296.09287,278.92732 295.72252,279.07222 295.28791,279.07217"
+ id="path4728"
+ sodipodi:nodetypes="csssssc"
+ inkscape:export-filename="/home/pinheiro/pics/oxygen-icons/22x22/actions/format-text-italic.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4787);stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ d="M 327.3062,270.94526 C 326.33137,270.94529 325.89713,270.5204 326.00356,269.67063 C 326.06528,269.1775 326.25454,268.78297 326.57136,268.48705 C 326.89756,268.18358 327.29804,268.03185 327.77273,268.03182 C 328.74757,268.03185 329.18131,268.4605 329.07398,269.31783 C 329.00747,269.84895 328.80828,270.25486 328.47646,270.53558 C 328.15402,270.80872 327.76395,270.94529 327.3062,270.94526 M 321.12999,276.96991 L 321.14649,275.00754 L 327.94772,275.00754 L 323.93093,286.17292 C 323.33337,287.82901 322.87571,289.19936 322.76289,290.10065 C 322.61614,291.27232 322.97075,291.85815 323.8267,291.85815 C 324.56933,291.85815 325.53188,291.55959 326.71434,290.96248 L 327.28598,291.97644 C 325.32648,293.35086 323.4971,294.03809 321.79782,294.03809 C 320.84118,294.03809 320.10587,293.72828 319.59187,293.10867 C 319.07785,292.48903 318.88007,291.70605 318.9986,290.75971 C 319.12837,289.72324 319.74741,287.81775 320.65091,285.22657 L 322.8801,279.33575 C 323.01475,278.96399 323.0969,278.65979 323.12653,278.42319 C 323.24785,277.45435 323.21319,276.96993 321.63977,276.96991 L 321.12999,276.96991"
+ id="path4779"
+ sodipodi:nodetypes="cssssscccccssccsssccscc" />
+ <path
+ sodipodi:nodetypes="cssssscccccssccsssccscc"
+ id="path4781"
+ d="M 327.52682,270.67519 C 326.69089,270.67521 326.31853,270.31086 326.40978,269.5822 C 326.46273,269.15931 326.62502,268.821 326.89667,268.56724 C 327.1764,268.30704 327.5198,268.17691 327.92688,268.17689 C 328.76279,268.17691 329.13474,268.54448 329.04268,269.27966 C 328.98565,269.73508 328.81487,270.08317 328.53031,270.32388 C 328.25384,270.55811 327.91935,270.67521 327.52682,270.67519 M 321.14159,276.87725 L 321.14648,275.00756 L 327.94769,275.00756 L 323.93092,286.17292 C 323.33332,287.82901 322.87571,289.19937 322.76286,290.10064 C 322.6161,291.27232 322.97074,291.85815 323.82665,291.85815 C 324.5693,291.85815 325.53186,291.5596 326.7143,290.96248 L 327.28596,291.97644 C 325.32645,293.35087 323.49708,294.0381 321.7978,294.0381 C 320.84115,294.0381 320.10586,293.7283 319.59184,293.10866 C 319.07783,292.48904 318.88007,291.70606 318.99858,290.75971 C 319.12836,289.72325 319.7474,287.81775 320.65088,285.22657 L 322.89169,279.24313 C 323.02635,278.87133 323.10848,278.56716 323.13811,278.33057 C 323.25942,277.36172 323.22477,276.87728 321.65134,276.87725 L 321.14159,276.87725"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4789);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" />
+ <path
+ sodipodi:nodetypes="cccsccccc"
+ id="path4783"
+ d="M 321.1236,274.99345 L 321.14627,276.9009 L 321.67936,276.9009 C 323.25277,276.90091 323.23676,277.36348 323.11544,278.3323 C 323.08581,278.5689 323.00482,278.85517 322.87015,279.22692 L 321.57977,282.61383 L 325.24478,282.61383 L 327.92577,274.99345 L 321.1236,274.99345 z"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4791);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" />
+ <path
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:#f8f8f8;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ d="M 327.30618,270.94525 C 326.33135,270.94529 325.89711,270.52039 326.00353,269.67064 C 326.06527,269.1775 326.25453,268.78297 326.57132,268.48704 C 326.89754,268.1836 327.29799,268.03184 327.77273,268.03183 C 328.74753,268.03184 329.18128,268.4605 329.07393,269.31783 C 329.00742,269.84893 328.80827,270.25486 328.47642,270.53557 C 328.15401,270.80873 327.76394,270.94529 327.30618,270.94525"
+ id="path4785"
+ sodipodi:nodetypes="csssssc" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-0.50943732"
+ inkscape:original="M 327.9375 268.1875 C 327.53042 268.18752 327.18598 268.30231 326.90625 268.5625 C 326.6346 268.81626 326.45919 269.17085 326.40625 269.59375 C 326.315 270.32241 326.69532 270.68751 327.53125 270.6875 C 327.92378 270.68752 328.25479 270.54673 328.53125 270.3125 C 328.81581 270.07179 328.97421 269.73667 329.03125 269.28125 C 329.12331 268.54607 328.77341 268.18753 327.9375 268.1875 z M 321.15625 275 L 321.15625 276.875 L 321.65625 276.875 C 323.22968 276.87503 323.2463 277.3749 323.125 278.34375 C 323.09537 278.58034 323.04091 278.8782 322.90625 279.25 L 320.65625 285.21875 C 319.75277 287.80993 319.12979 289.71355 319 290.75 C 318.88149 291.69635 319.07975 292.47412 319.59375 293.09375 C 320.10777 293.71339 320.85586 294.03126 321.8125 294.03125 C 323.51178 294.03125 325.32175 293.34318 327.28125 291.96875 L 326.71875 290.96875 C 325.53631 291.56587 324.55514 291.84375 323.8125 291.84375 C 322.95659 291.84375 322.60325 291.26542 322.75 290.09375 C 322.86285 289.19248 323.33991 287.8436 323.9375 286.1875 L 327.9375 275 L 321.15625 275 z "
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;opacity:0.35;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ id="path4795"
+ d="M 327.9375,268.6875 C 327.62617,268.68752 327.43174,268.76846 327.25,268.9375 C 327.0714,269.10433 326.94632,269.33615 326.90625,269.65625 C 326.87277,269.92358 326.91654,270.0119 326.96875,270.0625 C 327.02096,270.1131 327.18745,270.1875 327.53125,270.1875 C 327.80195,270.18751 327.98724,270.10717 328.1875,269.9375 C 328.36523,269.78716 328.48483,269.58935 328.53125,269.21875 C 328.56612,268.94025 328.51165,268.85566 328.46875,268.8125 C 328.42585,268.76934 328.28262,268.68751 327.9375,268.6875 z M 321.65625,275.5 L 321.65625,276.375 C 322.07658,276.37501 322.42669,276.38678 322.71875,276.46875 C 323.01081,276.55072 323.26436,276.70803 323.4375,276.9375 C 323.78379,277.39645 323.68735,277.90826 323.625,278.40625 C 323.59236,278.6669 323.52435,279.02514 323.375,279.4375 L 321.125,285.40625 C 320.22309,287.99293 319.61437,289.89917 319.5,290.8125 C 319.39447,291.65519 319.57865,292.27331 320,292.78125 C 320.41361,293.27984 320.96871,293.53126 321.8125,293.53125 C 323.25766,293.53125 324.85828,292.92064 326.59375,291.78125 L 326.5,291.625 C 325.47566,292.09338 324.56865,292.34375 323.8125,292.34375 C 323.2698,292.34375 322.74063,292.1346 322.46875,291.6875 C 322.19687,291.2404 322.16907,290.67737 322.25,290.03125 C 322.37705,289.01653 322.87056,287.65775 323.46875,286 L 327.21875,275.5 L 321.65625,275.5 z" />
+ <path
+ sodipodi:nodetypes="cssssscccccssccsssccscc"
+ id="path4797"
+ d="M 373.14869,257.97928 C 371.55606,257.97933 370.84665,257.28515 371.02055,255.89687 C 371.12135,255.09121 371.43056,254.44668 371.94816,253.96319 C 372.48108,253.4674 373.13535,253.21955 373.91088,253.21947 C 375.50352,253.21955 376.21211,253.91981 376.0368,255.32045 C 375.92812,256.18819 375.60268,256.85133 375.06058,257.30994 C 374.5338,257.75621 373.89651,257.97933 373.14869,257.97928 M 364.07187,267.06835 L 364.09704,264.07649 L 374.46625,264.07649 L 368.34221,281.09936 C 367.43117,283.62422 366.73342,285.71347 366.56139,287.0876 C 366.33769,288.87394 366.87833,289.76706 368.18333,289.76706 C 369.31552,289.76706 370.78303,289.31191 372.58583,288.40153 L 373.45735,289.94743 C 370.4699,292.04288 367.6808,293.09065 365.09008,293.09065 C 363.63157,293.09065 362.5105,292.61829 361.72685,291.67363 C 360.94315,290.72895 360.64164,289.53521 360.82234,288.0924 C 361.02019,286.51219 361.96401,283.60707 363.34147,279.65651 L 366.74014,270.67535 C 366.94538,270.10851 367.07067,269.64474 367.11583,269.284 C 367.3008,267.80691 367.24793,267.06838 364.84908,267.06835 L 364.07187,267.06835"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:none;fill-opacity:1;stroke:url(#radialGradient4807);stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans" />
+ <path
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4809);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ d="M 373.82458,257.47137 C 372.55014,257.47142 371.98242,256.91593 372.12153,255.80501 C 372.20223,255.16027 372.44969,254.64449 372.86386,254.25761 C 373.29034,253.8609 373.81387,253.66249 374.43451,253.66247 C 375.70897,253.66249 376.27603,254.22292 376.13565,255.34376 C 376.04874,256.0381 375.78836,256.56879 375.3545,256.93579 C 374.933,257.2929 374.42303,257.47142 373.82458,257.47137 M 364.08963,266.9271 L 364.09707,264.07657 L 374.46624,264.07657 L 368.34224,281.09939 C 367.43113,283.62427 366.73346,285.71351 366.5614,287.08759 C 366.33766,288.87398 366.87833,289.76715 368.18328,289.76715 C 369.31553,289.76715 370.78304,289.31196 372.58582,288.40155 L 373.45737,289.94748 C 370.46987,292.04292 367.68079,293.09069 365.09006,293.09069 C 363.63156,293.09069 362.51053,292.61837 361.72685,291.67366 C 360.94318,290.729 360.64167,289.53525 360.82239,288.09245 C 361.0202,286.51225 361.96401,283.60709 363.34148,279.65656 L 366.75784,270.53414 C 366.96313,269.96729 367.08833,269.50354 367.13352,269.14284 C 367.31849,267.66572 367.26564,266.92716 364.86677,266.9271 L 364.08963,266.9271"
+ id="path4799"
+ sodipodi:nodetypes="cssssscccccssccsssccscc" />
+ <path
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:url(#linearGradient4811);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ d="M 364.06222,264.05507 L 364.09671,266.96314 L 364.9095,266.96314 C 367.30834,266.96317 367.28392,267.66843 367.09894,269.14549 C 367.05379,269.50619 366.93031,269.94263 366.72497,270.50944 L 364.75765,275.67313 L 370.34536,275.67313 L 374.43282,264.05507 L 364.06222,264.05507 z"
+ id="path4801"
+ sodipodi:nodetypes="cccsccccc" />
+ <path
+ sodipodi:nodetypes="csssssc"
+ id="path4803"
+ d="M 373.0973,257.95512 C 371.4648,257.95518 370.73759,257.24363 370.9158,255.82058 C 371.0192,254.99474 371.33619,254.33406 371.86665,253.83846 C 372.41294,253.3303 373.08359,253.07615 373.87864,253.07614 C 375.51104,253.07615 376.23744,253.79404 376.05767,255.22974 C 375.94632,256.11915 375.6128,256.79896 375.05706,257.26906 C 374.51712,257.72649 373.86391,257.95518 373.0973,257.95512"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;fill:#f8f8f8;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" />
+ <path
+ d="M 327.9375,268.53125 C 327.59425,268.53127 327.33941,268.61306 327.125,268.8125 C 326.91538,269.00832 326.79436,269.27062 326.75,269.625 C 326.71247,269.92468 326.7462,270.06171 326.84375,270.15625 C 326.9413,270.25079 327.16272,270.34375 327.53125,270.34375 C 327.84257,270.34377 328.08683,270.2537 328.3125,270.0625 C 328.52585,269.88203 328.63754,269.64888 328.6875,269.25 C 328.72609,268.94179 328.68252,268.7768 328.59375,268.6875 C 328.50498,268.5982 328.30691,268.53126 327.9375,268.53125 z M 321.5,275.34375 L 321.5,276.53125 L 321.65625,276.53125 C 322.06759,276.53126 322.38791,276.58094 322.65625,276.65625 C 322.92459,276.73156 323.16613,276.83727 323.3125,277.03125 C 323.60523,277.41922 323.53053,277.88154 323.46875,278.375 C 323.43711,278.62763 323.3632,278.97616 323.21875,279.375 L 320.96875,285.34375 C 320.06632,287.93193 319.46326,289.82686 319.34375,290.78125 C 319.23389,291.65851 319.3915,292.32981 319.84375,292.875 C 320.29084,293.41396 320.93108,293.68751 321.8125,293.6875 C 323.34858,293.6875 325.02182,293.07319 326.84375,291.84375 L 326.59375,291.40625 C 325.5137,291.91842 324.57001,292.1875 323.8125,292.1875 C 323.30806,292.1875 322.86523,291.98881 322.625,291.59375 C 322.38477,291.19869 322.32784,290.68852 322.40625,290.0625 C 322.52857,289.08561 323.02701,287.7197 323.625,286.0625 L 327.46875,275.34375 L 321.5,275.34375 z"
+ id="path4805"
+ style="font-size:72.53502655px;font-style:normal;font-weight:normal;line-height:125%;opacity:0.35;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.65590608px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ inkscape:original="M 327.9375 268.1875 C 327.53042 268.18752 327.18598 268.30231 326.90625 268.5625 C 326.6346 268.81626 326.45919 269.17085 326.40625 269.59375 C 326.315 270.32241 326.69532 270.68751 327.53125 270.6875 C 327.92378 270.68752 328.25479 270.54673 328.53125 270.3125 C 328.81581 270.07179 328.97421 269.73667 329.03125 269.28125 C 329.12331 268.54607 328.77341 268.18753 327.9375 268.1875 z M 321.15625 275 L 321.15625 276.875 L 321.65625 276.875 C 323.22968 276.87503 323.2463 277.3749 323.125 278.34375 C 323.09537 278.58034 323.04091 278.8782 322.90625 279.25 L 320.65625 285.21875 C 319.75277 287.80993 319.12979 289.71355 319 290.75 C 318.88149 291.69635 319.07975 292.47412 319.59375 293.09375 C 320.10777 293.71339 320.85586 294.03126 321.8125 294.03125 C 323.51178 294.03125 325.32175 293.34318 327.28125 291.96875 L 326.71875 290.96875 C 325.53631 291.56587 324.55514 291.84375 323.8125 291.84375 C 322.95659 291.84375 322.60325 291.26542 322.75 290.09375 C 322.86285 289.19248 323.33991 287.8436 323.9375 286.1875 L 327.9375 275 L 321.15625 275 z "
+ inkscape:radius="-0.33956638"
+ sodipodi:type="inkscape:offset"
+ transform="matrix(1.5246086,0,0,1.5246086,-125.52563,-155.20234)" />
+ <rect
+ style="opacity:0;fill:#414141;fill-opacity:1;stroke:none;stroke-width:0.19348501;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4008"
+ width="22"
+ height="22"
+ x="282"
+ y="274"
+ inkscape:export-filename="/home/pinheiro/pics/oxygen-icons/22x22/actions/format-text-italic.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0;fill:#414141;fill-opacity:1;stroke:none;stroke-width:0.19499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4780"
+ width="16"
+ height="16"
+ x="263"
+ y="281"
+ inkscape:export-filename="/home/pinheiro/pics/oxygen-icons/16x16/actions/format-text-italic.png"
+ inkscape:export-xdpi="360"
+ inkscape:export-ydpi="360" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="icon-bold"
+ style="display:inline"
+ transform="translate(16,3.9999974)">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g3363"
+ inkscape:groupmode="layer"
+ inkscape:label="plate">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect2389"
+ width="48"
+ height="48"
+ x="174"
+ y="404.36218" />
+ <rect
+ y="420.36218"
+ x="138"
+ height="32"
+ width="32"
+ id="rect2391"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="32x32" />
+ <rect
+ y="430.36218"
+ x="112"
+ height="22"
+ width="22"
+ id="rect2395"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="22x22" />
+ <rect
+ y="436.36218"
+ x="92"
+ height="16"
+ width="16"
+ id="rect2397"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="93.552612"
+ y="394.7832"
+ id="icon-name"><tspan
+ sodipodi:role="line"
+ x="93.552612"
+ y="394.7832"
+ id="tspan3173"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-text-bold</tspan></text>
+ <text
+ inkscape:label="context"
+ id="context"
+ y="409.7832"
+ x="93.552612"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="409.7832"
+ x="93.552612"
+ sodipodi:role="line"
+ id="tspan3183">actions</tspan></text>
+ </g>
+ <g
+ id="g4916"
+ inkscape:label="Layer 1"
+ transform="translate(-674,-333.29075)">
+ <g
+ transform="translate(1371,461.29075)"
+ id="g6052"
+ style="display:inline">
+ <path
+ sodipodi:nodetypes="cccccccccccccccscccccc"
+ id="use5644"
+ d="M -691,-70.999997 L -691,-69.999997 L -690,-69.999997 C -689.448,-69.999997 -689,-69.551997 -689,-68.999997 L -689,-58.999997 C -689,-58.447997 -689.448,-57.999997 -690,-57.999997 L -691,-57.999997 L -691,-56.999997 L -685,-56.999997 C -681,-56.999997 -679,-56.999997 -679,-60.999997 C -679,-62.999997 -681,-63.999997 -682,-64.499997 C -681,-64.999997 -680,-64.999997 -680,-67.499997 C -680,-69.999997 -682,-70.999997 -685,-70.999997 L -691,-70.999997 z M -686,-69.999997 C -683,-69.999997 -683,-68.999997 -683,-67.499997 C -683,-65.999997 -683,-64.999997 -686,-64.999997 L -686,-69.999997 z M -686,-63.968747 C -683,-63.999997 -682,-62.999997 -682,-60.999997 C -682,-58.999997 -682,-57.999997 -686,-57.999997 L -686,-63.968747 z"
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#radialGradient6080);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ <path
+ sodipodi:nodetypes="cccccccccccccccscccccc"
+ id="use5646"
+ d="M -691,-70.999997 L -691,-69.999997 L -690,-69.999997 C -689.448,-69.999997 -689,-69.551997 -689,-68.999997 L -689,-58.999997 C -689,-58.447997 -689.448,-57.999997 -690,-57.999997 L -691,-57.999997 L -691,-56.999997 L -685,-56.999997 C -681,-56.999997 -679,-56.999997 -679,-60.999997 C -679,-62.999997 -681,-63.999997 -682,-64.499997 C -681,-64.999997 -680,-64.999997 -680,-67.499997 C -680,-69.999997 -682,-70.999997 -685,-70.999997 L -691,-70.999997 z M -686,-69.999997 C -683,-69.999997 -683,-68.999997 -683,-67.499997 C -683,-65.999997 -683,-64.999997 -686,-64.999997 L -686,-69.999997 z M -686,-63.968747 C -683,-63.999997 -682,-62.999997 -682,-60.999997 C -682,-58.999997 -682,-57.999997 -686,-57.999997 L -686,-63.968747 z"
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#radialGradient6082);fill-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ <path
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.35;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -684,-70.999997 L -684,-69.999997 L -683,-69.999997 C -682.448,-69.999997 -682,-69.551997 -682,-68.999997 L -682,-58.999997 C -682,-58.447997 -682.448,-57.999997 -683,-57.999997 L -684,-57.999997 L -684,-56.999997 L -678,-56.999997 C -674,-56.999997 -672,-56.999997 -672,-60.999997 C -672,-62.999997 -674,-63.999997 -675,-64.499997 C -674,-64.999997 -673,-64.999997 -673,-67.499997 C -673,-69.999997 -675,-70.999997 -678,-70.999997 L -684,-70.999997 z M -679,-69.999997 C -676,-69.999997 -676,-68.999997 -676,-67.499997 C -676,-65.999997 -676,-64.999997 -679,-64.999997 L -679,-69.999997 z M -679,-63.968747 C -676,-63.999997 -675,-62.999997 -675,-60.999997 C -675,-58.999997 -675,-57.999997 -679,-57.999997 L -679,-63.968747 z"
+ id="path5783"
+ sodipodi:nodetypes="cccccccccccccccscccccc"
+ clip-path="url(#clipPath5787)"
+ transform="translate(-7,0)" />
+ <path
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient6084);fill-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -675,-67 L -675,-66 L -674,-66 C -673.448,-66 -673,-65.552 -673,-65 L -673,-58.25 C -672.19955,-58.088468 -671.36971,-58 -670.5,-58 C -670.33067,-58 -670.16716,-58.024792 -670,-58.03125 L -670,-59.96875 C -668.03375,-59.989231 -666.93577,-59.544207 -666.40625,-58.6875 C -665.71625,-58.931245 -665.08559,-59.239884 -664.5,-59.59375 C -665.03519,-59.995438 -665.59375,-60.296875 -666,-60.5 C -665,-61 -664,-61 -664,-63.5 C -664,-66 -666,-67 -669,-67 L -675,-67 z M -670,-66 C -667,-66 -667,-65 -667,-63.5 C -667,-62 -667,-61 -670,-61 L -670,-66 z"
+ transform="translate(-16,-3.9999974)"
+ id="path5948" />
+ </g>
+ <g
+ transform="translate(1374,461.29075)"
+ id="g6030"
+ style="display:inline">
+ <path
+ sodipodi:nodetypes="ccccccccccccccczcccccc"
+ id="path5936"
+ transform="translate(-16,-3.9999974)"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-56.5 C -654,-55.672 -654.672,-55 -655.5,-55 L -657,-55 L -657,-54 L -650,-54 C -643,-54 -641,-55 -641,-59 C -641,-62 -643.30127,-62.693081 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z M -650,-63 C -647,-63 -645,-62 -645,-59.5 C -645,-56 -647.37068,-56 -650,-56 L -650,-63 z"
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#radialGradient6074);stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ <path
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#radialGradient6076);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-56.5 C -654,-55.672 -654.672,-55 -655.5,-55 L -657,-55 L -657,-54 L -650,-54 C -643,-54 -641,-55 -641,-59 C -641,-62 -643.30127,-62.693081 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z M -650,-63 C -647,-63 -645,-62 -645,-59.5 C -645,-56 -647.37068,-56 -650,-56 L -650,-63 z"
+ transform="translate(-16,-3.9999974)"
+ id="text5923"
+ sodipodi:nodetypes="ccccccccccccccczcccccc" />
+ <path
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.35;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-56.5 C -654,-55.672 -654.672,-55 -655.5,-55 L -657,-55 L -657,-54 L -650,-54 C -643,-54 -641,-55 -641,-59 C -641,-62 -643.30127,-62.693081 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z M -650,-63 C -647,-63 -645,-62 -645,-59.5 C -645,-56 -647.37068,-56 -650,-56 L -650,-63 z"
+ transform="translate(-16,-3.9999974)"
+ id="path5940"
+ sodipodi:nodetypes="ccccccccccccccczcccccc"
+ clip-path="url(#clipPath5944)" />
+ <path
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient6078);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-60.1875 C -653.19589,-60.066708 -652.35183,-60 -651.5,-60 C -650.99296,-60 -650.49129,-60.05009 -650,-60.09375 L -650,-63 C -647.8079,-63 -646.17162,-62.450408 -645.4375,-61.1875 C -644.57051,-61.545487 -643.78741,-61.973632 -643.0625,-62.46875 C -643.80308,-62.884942 -644.65203,-63.188802 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z"
+ transform="translate(-16,-3.9999974)"
+ id="path5957" />
+ </g>
+ <g
+ transform="matrix(2,0,0,2,2114,515.29075)"
+ id="g6036"
+ style="display:inline">
+ <path
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#radialGradient6046);stroke-width:1.125;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-56.5 C -654,-55.672 -654.672,-55 -655.5,-55 L -657,-55 L -657,-54 L -650,-54 C -643,-54 -641,-55 -641,-59 C -641,-62 -643.30127,-62.693081 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z M -650,-63 C -647,-63 -645,-62 -645,-59.5 C -645,-56 -647.37068,-56 -650,-56 L -650,-63 z"
+ transform="translate(-16,-3.9999974)"
+ id="path6038"
+ sodipodi:nodetypes="ccccccccccccccczcccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccccccccczcccccc"
+ id="path6040"
+ transform="translate(-16,-3.9999974)"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-56.5 C -654,-55.672 -654.672,-55 -655.5,-55 L -657,-55 L -657,-54 L -650,-54 C -643,-54 -641,-55 -641,-59 C -641,-62 -643.30127,-62.693081 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z M -650,-63 C -647,-63 -645,-62 -645,-59.5 C -645,-56 -647.37068,-56 -650,-56 L -650,-63 z"
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#radialGradient6048);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ <path
+ clip-path="url(#clipPath5944)"
+ sodipodi:nodetypes="ccccccccccccccczcccccc"
+ id="path6042"
+ transform="translate(-16,-3.9999974)"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-56.5 C -654,-55.672 -654.672,-55 -655.5,-55 L -657,-55 L -657,-54 L -650,-54 C -643,-54 -641,-55 -641,-59 C -641,-62 -643.30127,-62.693081 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z M -650,-63 C -647,-63 -645,-62 -645,-59.5 C -645,-56 -647.37068,-56 -650,-56 L -650,-63 z"
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.35;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ <path
+ id="path6044"
+ transform="translate(-16,-3.9999974)"
+ d="M -657,-72 L -657,-71 L -655.5,-71 C -654.672,-71 -654,-70.328 -654,-69.5 L -654,-60.1875 C -653.19589,-60.066708 -652.35183,-60 -651.5,-60 C -650.99296,-60 -650.49129,-60.05009 -650,-60.09375 L -650,-63 C -647.8079,-63 -646.17162,-62.450408 -645.4375,-61.1875 C -644.57051,-61.545487 -643.78741,-61.973632 -643.0625,-62.46875 C -643.80308,-62.884942 -644.65203,-63.188802 -645.5,-63.5 C -644,-63.5 -642,-65 -642,-67.5 C -642,-71 -646,-72 -650,-72 L -657,-72 z M -650,-70 C -648,-70 -645.99918,-69.999926 -646,-67 C -646.00082,-64.000074 -648,-64 -650,-64 L -650,-70 z"
+ style="font-size:25.21478081px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient6050);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ </g>
+ <g
+ transform="matrix(2,0,0,2,2110,517.29075)"
+ id="g6058"
+ style="display:inline">
+ <path
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:url(#radialGradient6068);stroke-width:1.125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -691,-70.999997 L -691,-69.999997 L -690,-69.999997 C -689.448,-69.999997 -689,-69.551997 -689,-68.999997 L -689,-58.999997 C -689,-58.447997 -689.448,-57.999997 -690,-57.999997 L -691,-57.999997 L -691,-56.999997 L -685,-56.999997 C -681,-56.999997 -679,-56.999997 -679,-60.999997 C -679,-62.999997 -681,-63.999997 -682,-64.499997 C -681,-64.999997 -680,-64.999997 -680,-67.499997 C -680,-69.999997 -682,-70.999997 -685,-70.999997 L -691,-70.999997 z M -686,-69.999997 C -683,-69.999997 -683,-68.999997 -683,-67.499997 C -683,-65.999997 -683,-64.999997 -686,-64.999997 L -686,-69.999997 z M -686,-63.968747 C -683,-63.999997 -682,-62.999997 -682,-60.999997 C -682,-58.999997 -682,-57.999997 -686,-57.999997 L -686,-63.968747 z"
+ id="path6060"
+ sodipodi:nodetypes="cccccccccccccccscccccc" />
+ <path
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#radialGradient6070);fill-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold"
+ d="M -691,-70.999997 L -691,-69.999997 L -690,-69.999997 C -689.448,-69.999997 -689,-69.551997 -689,-68.999997 L -689,-58.999997 C -689,-58.447997 -689.448,-57.999997 -690,-57.999997 L -691,-57.999997 L -691,-56.999997 L -685,-56.999997 C -681,-56.999997 -679,-56.999997 -679,-60.999997 C -679,-62.999997 -681,-63.999997 -682,-64.499997 C -681,-64.999997 -680,-64.999997 -680,-67.499997 C -680,-69.999997 -682,-70.999997 -685,-70.999997 L -691,-70.999997 z M -686,-69.999997 C -683,-69.999997 -683,-68.999997 -683,-67.499997 C -683,-65.999997 -683,-64.999997 -686,-64.999997 L -686,-69.999997 z M -686,-63.968747 C -683,-63.999997 -682,-62.999997 -682,-60.999997 C -682,-58.999997 -682,-57.999997 -686,-57.999997 L -686,-63.968747 z"
+ id="path6062"
+ sodipodi:nodetypes="cccccccccccccccscccccc" />
+ <path
+ transform="translate(-7,0)"
+ clip-path="url(#clipPath5787)"
+ sodipodi:nodetypes="cccccccccccccccscccccc"
+ id="path6064"
+ d="M -684,-70.999997 L -684,-69.999997 L -683,-69.999997 C -682.448,-69.999997 -682,-69.551997 -682,-68.999997 L -682,-58.999997 C -682,-58.447997 -682.448,-57.999997 -683,-57.999997 L -684,-57.999997 L -684,-56.999997 L -678,-56.999997 C -674,-56.999997 -672,-56.999997 -672,-60.999997 C -672,-62.999997 -674,-63.999997 -675,-64.499997 C -674,-64.999997 -673,-64.999997 -673,-67.499997 C -673,-69.999997 -675,-70.999997 -678,-70.999997 L -684,-70.999997 z M -679,-69.999997 C -676,-69.999997 -676,-68.999997 -676,-67.499997 C -676,-65.999997 -676,-64.999997 -679,-64.999997 L -679,-69.999997 z M -679,-63.968747 C -676,-63.999997 -675,-62.999997 -675,-60.999997 C -675,-58.999997 -675,-57.999997 -679,-57.999997 L -679,-63.968747 z"
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.35;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ <path
+ id="path6066"
+ transform="translate(-16,-3.9999974)"
+ d="M -675,-67 L -675,-66 L -674,-66 C -673.448,-66 -673,-65.552 -673,-65 L -673,-58.25 C -672.19955,-58.088468 -671.36971,-58 -670.5,-58 C -670.33067,-58 -670.16716,-58.024792 -670,-58.03125 L -670,-59.96875 C -668.03375,-59.989231 -666.93577,-59.544207 -666.40625,-58.6875 C -665.71625,-58.931245 -665.08559,-59.239884 -664.5,-59.59375 C -665.03519,-59.995438 -665.59375,-60.296875 -666,-60.5 C -665,-61 -664,-61 -664,-63.5 C -664,-66 -666,-67 -669,-67 L -675,-67 z M -670,-66 C -667,-66 -667,-65 -667,-63.5 C -667,-62 -667,-61 -670,-61 L -670,-66 z"
+ style="font-size:19.59617805px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient6072);fill-opacity:1;font-family:Droid Serif;-inkscape-font-specification:Droid Serif Bold" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="translate(16,3.9999974)"
+ style="display:inline"
+ inkscape:label="text-dir-ltr"
+ id="g3814"
+ inkscape:groupmode="layer">
+ <g
+ inkscape:label="plate17"
+ inkscape:groupmode="layer"
+ id="g3816"
+ transform="translate(-88,-380.36218)"
+ style="display:none">
+ <rect
+ y="608.36218"
+ x="570"
+ height="48"
+ width="48"
+ id="rect3819"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="48x48" />
+ <rect
+ inkscape:label="32x32"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3821"
+ width="32"
+ height="32"
+ x="534"
+ y="624.36218" />
+ <rect
+ inkscape:label="22x22"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3823"
+ width="22"
+ height="22"
+ x="508"
+ y="634.36218" />
+ <rect
+ inkscape:label="16x16"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3825"
+ width="16"
+ height="16"
+ x="488"
+ y="640.36218" />
+ <text
+ id="text3827"
+ y="598.7832"
+ x="489.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ inkscape:label="icon-name"><tspan
+ style="font-weight:bold;fill:#555555;fill-opacity:1"
+ id="tspan3829"
+ y="598.7832"
+ x="489.55261"
+ sodipodi:role="line">format-text-direction-ltr</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="489.55261"
+ y="613.7832"
+ id="text3831"
+ inkscape:label="context"><tspan
+ id="tspan3833"
+ sodipodi:role="line"
+ x="489.55261"
+ y="613.7832">actions</tspan></text>
+ </g>
+ <path
+ style="opacity:1;fill:#e6f0ff;fill-opacity:1;stroke:url(#radialGradient4684);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 401,263 L 401,264 L 403,264 L 403,272 L 401,272 L 401,273 L 407,273 L 407,272 L 405,272 L 405,264 L 407,264 L 407,263 L 401,263 z"
+ id="rect3902" />
+ <path
+ id="path3910"
+ d="M 401,263 L 401,264 L 403,264 L 403,272 L 401,272 L 401,273 L 407,273 L 407,272 L 405,272 L 405,264 L 407,264 L 407,263 L 401,263 z"
+ style="opacity:1;fill:url(#radialGradient4682);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4689);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 401,263 L 401,264 L 403,264 L 403,268 L 405,268 L 405,264 L 407,264 L 407,263 L 401,263 z"
+ id="path4686"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ transform="translate(-16,-3.9999974)"
+ id="path4693"
+ d="M 424,271 L 424,273 L 428,273 L 428,275 L 431,272 L 428,269 L 428,271 L 424,271 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4699);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4697);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 408,267 L 408,269 L 412,269 L 412,271 L 415,268 L 412,265 L 412,267 L 408,267 z"
+ id="path4691"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ transform="translate(-16,-3.9999974)"
+ id="path4701"
+ d="M 424,271 L 424,272 L 431,272 L 428,269 L 428,271 L 424,271 z"
+ style="fill:url(#linearGradient4703);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path4705"
+ d="M 422,259 L 422,260 L 424,260 L 424,270 L 422,270 L 422,271 L 428,271 L 428,270 L 426,270 L 426,260 L 428,260 L 428,259 L 422,259 z"
+ style="opacity:1;fill:#e6f0ff;fill-opacity:1;stroke:url(#radialGradient4717);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="opacity:1;fill:url(#radialGradient4719);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 422,259 L 422,260 L 424,260 L 424,270 L 422,270 L 422,271 L 428,271 L 428,270 L 426,270 L 426,260 L 428,260 L 428,259 L 422,259 z"
+ id="path4707"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path4709"
+ d="M 422,259 L 422,260 L 424,260 L 424,265 L 426,265 L 426,260 L 428,260 L 428,259 L 422,259 z"
+ style="opacity:1;fill:url(#linearGradient4723);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4725);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 430,264 L 430,266 L 436,266 L 436,268 L 439,265 L 436,262 L 436,264 L 430,264 z"
+ id="path4711"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4713"
+ d="M 430,264 L 430,266 L 436,266 L 436,268 L 439,265 L 436,262 L 436,264 L 430,264 z"
+ style="fill:url(#linearGradient4727);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4729);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 430,264 L 430,265 L 439,265 L 436,262 L 436,264 L 430,264 z"
+ id="path4715"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ style="opacity:1;fill:#e6f0ff;fill-opacity:1;stroke:url(#radialGradient4746);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 447,250 L 447,252 L 450,252 L 450,268 L 447,268 L 447,270 L 456,270 L 456,268 L 453,268 L 453,252 L 456,252 L 456,250 L 447,250 z"
+ id="path4731" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ id="path4733"
+ d="M 447,250 L 447,252 L 450,252 L 450,268 L 447,268 L 447,270 L 456,270 L 456,268 L 453,268 L 453,252 L 456,252 L 456,250 L 447,250 z"
+ style="opacity:1;fill:url(#radialGradient4748);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4750);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 447,250 L 447,252 L 450,252 L 450,260 L 453,260 L 453,252 L 456,252 L 456,250 L 447,250 z"
+ id="path4735"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4737"
+ d="M 457,258 L 457,263 L 470,263 L 470,267 L 476.5,260.5 L 470,254 L 470,258 L 457,258 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4752);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4754);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 457,258 L 457,263 L 470,263 L 470,267 L 476.5,260.5 L 470,254 L 470,258 L 457,258 z"
+ id="path4740"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path4744"
+ d="M 457,258 L 457,260 L 476,260 L 470,254 L 470,258 L 457,258 z"
+ style="fill:url(#linearGradient4756);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path4763"
+ d="M 487,240 L 487,242 L 491,242 L 491,262 L 487,262 L 487,264 L 498,264 L 498,262 L 494,262 L 494,242 L 498,242 L 498,240 L 487,240 z"
+ style="opacity:1;fill:#e6f0ff;fill-opacity:1;stroke:url(#radialGradient4775);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="opacity:1;fill:url(#radialGradient4777);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 487,240 L 487,242 L 491,242 L 491,262 L 487,262 L 487,264 L 498,264 L 498,262 L 494,262 L 494,242 L 498,242 L 498,240 L 487,240 z"
+ id="path4765"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path4767"
+ d="M 487,240 L 487,242 L 491,242 L 491,252 L 494,252 L 494,242 L 498,242 L 498,240 L 487,240 z"
+ style="opacity:1;fill:url(#linearGradient4779);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4781);stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 501,249 L 501,256 L 518,256 L 517.99331,260.98675 L 526.48008,252.49994 L 517.99331,244.01314 L 518,249 L 501,249 z"
+ id="path4769"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4771"
+ d="M 501,249 L 501,256 L 518,256 L 517.9934,260.98679 L 526.48019,252.5 L 517.9934,244.01322 L 518,249 L 501,249 z"
+ style="fill:url(#linearGradient4783);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4785);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 501,249 L 501,252 L 526,252 L 517.9934,244.01322 L 518,249 L 501,249 z"
+ id="path4773"
+ sodipodi:nodetypes="cccccc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="g4787"
+ inkscape:label="text-dir-rtl"
+ style="display:inline"
+ transform="translate(16,3.9999974)">
+ <g
+ style="display:none"
+ transform="translate(-88,-380.36218)"
+ id="g4789"
+ inkscape:groupmode="layer"
+ inkscape:label="plate18">
+ <rect
+ inkscape:label="48x48"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4791"
+ width="48"
+ height="48"
+ x="-618"
+ y="688.36218"
+ transform="scale(-1,1)" />
+ <rect
+ y="704.36218"
+ x="534"
+ height="32"
+ width="32"
+ id="rect4793"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="32x32" />
+ <rect
+ y="714.36218"
+ x="508"
+ height="22"
+ width="22"
+ id="rect4795"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="22x22" />
+ <rect
+ y="720.36218"
+ x="488"
+ height="16"
+ width="16"
+ id="rect4797"
+ style="fill:#dddddd;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="16x16" />
+ <text
+ inkscape:label="icon-name"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#555555;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="489.55261"
+ y="678.7832"
+ id="text4799"><tspan
+ sodipodi:role="line"
+ x="489.55261"
+ y="678.7832"
+ id="tspan4801"
+ style="font-weight:bold;fill:#555555;fill-opacity:1">format-text-direction-rtl</tspan></text>
+ <text
+ inkscape:label="context"
+ id="text4803"
+ y="693.7832"
+ x="489.55261"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:#888888;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="693.7832"
+ x="489.55261"
+ sodipodi:role="line"
+ id="tspan4805">actions</tspan></text>
+ </g>
+ <path
+ id="path4807"
+ d="M 409,343 L 409,344 L 411,344 L 411,352 L 409,352 L 409,353 L 415,353 L 415,352 L 413,352 L 413,344 L 415,344 L 415,343 L 409,343 z"
+ style="opacity:1;fill:#e6f0ff;fill-opacity:1;stroke:url(#radialGradient4902);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:url(#radialGradient4900);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 409,343 L 409,344 L 411,344 L 411,352 L 409,352 L 409,353 L 415,353 L 415,352 L 413,352 L 413,344 L 415,344 L 415,343 L 409,343 z"
+ id="path4810" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path4812"
+ d="M 409,343 L 409,344 L 411,344 L 411,348 L 413,348 L 413,344 L 415,344 L 415,343 L 409,343 z"
+ style="opacity:1;fill:url(#linearGradient4898);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4896);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 408,347 L 408,349 L 404,349 L 404,351 L 401,348 L 404,345 L 404,347 L 408,347 z"
+ id="path4814"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4816"
+ d="M 408,347 L 408,349 L 404,349 L 404,351 L 401,348 L 404,345 L 404,347 L 408,347 z"
+ style="fill:url(#linearGradient4894);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4892);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 408,347 L 408,348 L 401,348 L 404,345 L 404,347 L 408,347 z"
+ id="path4818"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ style="opacity:1;fill:#e6f0ff;fill-opacity:1;stroke:url(#radialGradient4890);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 434,339 L 434,340 L 436,340 L 436,350 L 434,350 L 434,351 L 440,351 L 440,350 L 438,350 L 438,340 L 440,340 L 440,339 L 434,339 z"
+ id="path4820" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ id="path4822"
+ d="M 434,339 L 434,340 L 436,340 L 436,350 L 434,350 L 434,351 L 440,351 L 440,350 L 438,350 L 438,340 L 440,340 L 440,339 L 434,339 z"
+ style="opacity:1;fill:url(#radialGradient4888);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4886);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 434,339 L 434,340 L 436,340 L 436,345 L 438,345 L 438,340 L 440,340 L 440,339 L 434,339 z"
+ id="path4824"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4826"
+ d="M 432,344 L 432,346 L 426,346 L 426,348 L 423,345 L 426,342 L 426,344 L 432,344 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4884);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4882);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 432,344 L 432,346 L 426,346 L 426,348 L 423,345 L 426,342 L 426,344 L 432,344 z"
+ id="path4828"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path4830"
+ d="M 432,344 L 432,345 L 423,345 L 426,342 L 426,344 L 432,344 z"
+ style="fill:url(#linearGradient4880);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ id="path4832"
+ d="M 468,330 L 468,332 L 471,332 L 471,348 L 468,348 L 468,350 L 477,350 L 477,348 L 474,348 L 474,332 L 477,332 L 477,330 L 468,330 z"
+ style="opacity:1;fill:#e6f0ff;fill-opacity:1;stroke:url(#radialGradient4878);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="opacity:1;fill:url(#radialGradient4876);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 468,330 L 468,332 L 471,332 L 471,348 L 468,348 L 468,350 L 477,350 L 477,348 L 474,348 L 474,332 L 477,332 L 477,330 L 468,330 z"
+ id="path4834"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path4836"
+ d="M 468,330 L 468,332 L 471,332 L 471,340 L 474,340 L 474,332 L 477,332 L 477,330 L 468,330 z"
+ style="opacity:1;fill:url(#linearGradient4874);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4872);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 467,338 L 467,343 L 454,343 L 454,347 L 447.5,340.5 L 454,334 L 454,338 L 467,338 z"
+ id="path4838"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4840"
+ d="M 467,338 L 467,343 L 454,343 L 454,347 L 447.5,340.5 L 454,334 L 454,338 L 467,338 z"
+ style="fill:url(#linearGradient4870);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4868);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 467,338 L 467,340 L 448,340 L 454,334 L 454,338 L 467,338 z"
+ id="path4842"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ style="opacity:1;fill:#e6f0ff;fill-opacity:1;stroke:url(#radialGradient4866);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 525,320 L 525,322 L 521,322 L 521,342 L 525,342 L 525,344 L 514,344 L 514,342 L 518,342 L 518,322 L 514,322 L 514,320 L 525,320 z"
+ id="path4844" />
+ <path
+ sodipodi:nodetypes="ccccccccccccc"
+ id="path4846"
+ d="M 525,320 L 525,322 L 521,322 L 521,342 L 525,342 L 525,344 L 514,344 L 514,342 L 518,342 L 518,322 L 514,322 L 514,320 L 525,320 z"
+ style="opacity:1;fill:url(#radialGradient4864);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4862);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 525,320 L 525,322 L 521,322 L 521,332 L 518,332 L 518,322 L 514,322 L 514,320 L 525,320 z"
+ id="path4848"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4850"
+ d="M 511,329 L 511,336 L 494,336 L 494.00669,340.98675 L 485.51992,332.49994 L 494.00669,324.01314 L 494,329 L 511,329 z"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4860);stroke-width:1.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:url(#linearGradient4858);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 511,329 L 511,336 L 494,336 L 494.0066,340.98679 L 485.51981,332.5 L 494.0066,324.01322 L 494,329 L 511,329 z"
+ id="path4852"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="path4854"
+ d="M 511,329 L 511,332 L 486,332 L 494.0066,324.01322 L 494,329 L 511,329 z"
+ style="fill:url(#linearGradient4856);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="notes"
+ style="display:inline"
+ transform="translate(16,4)">
+ <text
+ xml:space="preserve"
+ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+ x="-316"
+ y="78"
+ id="text3825"><tspan
+ sodipodi:role="line"
+ x="-316"
+ y="78"
+ id="tspan3895"
+ style="font-size:11px" /><tspan
+ sodipodi:role="line"
+ x="-316"
+ y="91.75"
+ style="font-size:11px"
+ id="tspan4910">REDO: Italic &amp; Underline</tspan><tspan
+ sodipodi:role="line"
+ x="-316"
+ y="105.5"
+ style="font-size:11px"
+ id="tspan4912">format-text-strikethrough.png</tspan></text>
+ </g>
+</svg>
diff --git a/resources/moveDown.png b/resources/moveDown.png
new file mode 100644
index 0000000..82a312c
--- /dev/null
+++ b/resources/moveDown.png
Binary files differ
diff --git a/resources/moveUp.png b/resources/moveUp.png
new file mode 100644
index 0000000..7f7ba72
--- /dev/null
+++ b/resources/moveUp.png
Binary files differ
diff --git a/resources/none-128x128.png b/resources/none-128x128.png
new file mode 100644
index 0000000..c2b4551
--- /dev/null
+++ b/resources/none-128x128.png
Binary files differ
diff --git a/resources/options.png b/resources/options.png
new file mode 100644
index 0000000..23ec531
--- /dev/null
+++ b/resources/options.png
Binary files differ
diff --git a/resources/qt.conf b/resources/qt.conf
new file mode 100644
index 0000000..7b3ff10
--- /dev/null
+++ b/resources/qt.conf
@@ -0,0 +1,2 @@
+[Paths]
+Plugins = qt-plugins/
diff --git a/resources/resources-windows-qt-plugin.qrc b/resources/resources-windows-qt-plugin.qrc
new file mode 100644
index 0000000..6677f1f
--- /dev/null
+++ b/resources/resources-windows-qt-plugin.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/qt/etc/">
+ <file>qt.conf</file>
+ </qresource>
+</RCC>
diff --git a/resources/resources-windows.rc b/resources/resources-windows.rc
new file mode 100644
index 0000000..2a471d0
--- /dev/null
+++ b/resources/resources-windows.rc
@@ -0,0 +1,36 @@
+#include <windows.h>
+#include "../Variable.h"
+
+1 VERSIONINFO
+FILEVERSION ULTRACOPIER_WINDOWS_VERSION
+PRODUCTVERSION ULTRACOPIER_WINDOWS_VERSION
+FILEFLAGSMASK 0x3fL
+FILETYPE VFT_APP
+{
+ BLOCK "StringFileInfo"
+ {
+ BLOCK "040904E4"
+ {
+ VALUE "CompanyName", "ultracopier.first-world.info"
+ VALUE "FileVersion", ULTRACOPIER_VERSION
+ VALUE "FileDescription", "Ultracopier under GPL3"
+ VALUE "InternalName", "ultracopier.exe"
+ VALUE "LegalCopyright", "GPL3"
+ VALUE "LegalTrademarks", "Ultracopier under GPL3"
+ VALUE "OriginalFilename", "ultracopier.exe"
+ VALUE "ProductName", "Ultracopier"
+ VALUE "ProductVersion", ULTRACOPIER_VERSION
+ }
+ }
+ BLOCK "VarFileInfo"
+ {
+ VALUE "Translation", 0x0409, 1252
+ }
+}
+
+#ifdef ULTRACOPIER_PLUGIN_ALL_IN_ONE
+IDI_ICON1 ICON DISCARDABLE "ultracopier-all-in-one.ico"
+#else
+IDI_ICON1 ICON DISCARDABLE "ultracopier.ico"
+#endif
+
diff --git a/resources/supercopier-128x128.png b/resources/supercopier-128x128.png
new file mode 100644
index 0000000..0bc611d
--- /dev/null
+++ b/resources/supercopier-128x128.png
Binary files differ
diff --git a/resources/supercopier-16x16.png b/resources/supercopier-16x16.png
new file mode 100644
index 0000000..9c597af
--- /dev/null
+++ b/resources/supercopier-16x16.png
Binary files differ
diff --git a/resources/supercopier-all-in-one.ico b/resources/supercopier-all-in-one.ico
new file mode 100644
index 0000000..3714a0e
--- /dev/null
+++ b/resources/supercopier-all-in-one.ico
Binary files differ
diff --git a/resources/supercopier.icns b/resources/supercopier.icns
new file mode 100644
index 0000000..184a5b9
--- /dev/null
+++ b/resources/supercopier.icns
Binary files differ
diff --git a/resources/supercopier.ico b/resources/supercopier.ico
new file mode 100644
index 0000000..de56a7c
--- /dev/null
+++ b/resources/supercopier.ico
Binary files differ
diff --git a/resources/systray_Caught_Unix.png b/resources/systray_Caught_Unix.png
new file mode 100644
index 0000000..6f5d1cf
--- /dev/null
+++ b/resources/systray_Caught_Unix.png
Binary files differ
diff --git a/resources/systray_Caught_Windows.png b/resources/systray_Caught_Windows.png
new file mode 100644
index 0000000..5464856
--- /dev/null
+++ b/resources/systray_Caught_Windows.png
Binary files differ
diff --git a/resources/systray_Semiuncaught_Unix.png b/resources/systray_Semiuncaught_Unix.png
new file mode 100644
index 0000000..3961215
--- /dev/null
+++ b/resources/systray_Semiuncaught_Unix.png
Binary files differ
diff --git a/resources/systray_Semiuncaught_Windows.png b/resources/systray_Semiuncaught_Windows.png
new file mode 100644
index 0000000..45d6315
--- /dev/null
+++ b/resources/systray_Semiuncaught_Windows.png
Binary files differ
diff --git a/resources/systray_Uncaught_Unix.png b/resources/systray_Uncaught_Unix.png
new file mode 100644
index 0000000..ac4299a
--- /dev/null
+++ b/resources/systray_Uncaught_Unix.png
Binary files differ
diff --git a/resources/systray_Uncaught_Windows.png b/resources/systray_Uncaught_Windows.png
new file mode 100644
index 0000000..6e6bae7
--- /dev/null
+++ b/resources/systray_Uncaught_Windows.png
Binary files differ
diff --git a/resources/ultracopier-128x128.png b/resources/ultracopier-128x128.png
new file mode 100644
index 0000000..c4547d2
--- /dev/null
+++ b/resources/ultracopier-128x128.png
Binary files differ
diff --git a/resources/ultracopier-16x16.png b/resources/ultracopier-16x16.png
new file mode 100644
index 0000000..326362b
--- /dev/null
+++ b/resources/ultracopier-16x16.png
Binary files differ
diff --git a/resources/ultracopier-all-in-one.ico b/resources/ultracopier-all-in-one.ico
new file mode 100644
index 0000000..d281659
--- /dev/null
+++ b/resources/ultracopier-all-in-one.ico
Binary files differ
diff --git a/resources/ultracopier-resources.qrc b/resources/ultracopier-resources.qrc
new file mode 100644
index 0000000..b57de67
--- /dev/null
+++ b/resources/ultracopier-resources.qrc
@@ -0,0 +1,15 @@
+<RCC>
+ <qresource prefix="/">
+ <file>ultracopier-128x128.png</file>
+ <file>ultracopier-16x16.png</file>
+ <file>moveUp.png</file>
+ <file>moveDown.png</file>
+ <file>bug-128x128.png</file>
+ <file>none-128x128.png</file>
+ <file>Languages/en/flag.png</file>
+ <file>Languages/en/informations.xml</file>
+ <file>Languages/en/translation.qm</file>
+ <file>options.png</file>
+ <file>warning.png</file>
+ </qresource>
+</RCC>
diff --git a/resources/ultracopier-resources_unix.qrc b/resources/ultracopier-resources_unix.qrc
new file mode 100644
index 0000000..1be76bf
--- /dev/null
+++ b/resources/ultracopier-resources_unix.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>systray_Caught_Unix.png</file>
+ <file>systray_Semiuncaught_Unix.png</file>
+ <file>systray_Uncaught_Unix.png</file>
+ </qresource>
+</RCC>
diff --git a/resources/ultracopier-resources_windows.qrc b/resources/ultracopier-resources_windows.qrc
new file mode 100644
index 0000000..a504744
--- /dev/null
+++ b/resources/ultracopier-resources_windows.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>systray_Caught_Windows.png</file>
+ <file>systray_Semiuncaught_Windows.png</file>
+ <file>systray_Uncaught_Windows.png</file>
+ </qresource>
+</RCC>
diff --git a/resources/ultracopier.desktop b/resources/ultracopier.desktop
new file mode 100644
index 0000000..bc68cb4
--- /dev/null
+++ b/resources/ultracopier.desktop
@@ -0,0 +1,20 @@
+[Desktop Entry]
+Categories=Qt;Utility;
+Comment[en_US]=Copy/Move files with lot of options
+Comment=Copy/Move files with lot of options
+Exec=ultracopier %u
+GenericName[en_US]=Advanced copier
+GenericName=Advanced copier
+Icon=ultracopier.png
+MimeType=
+Name[en_US]=Ultracopier
+Name=Ultracopier
+Path=
+StartupNotify=true
+Terminal=false
+TerminalOptions=
+Type=Application
+X-DBUS-ServiceName=
+X-DBUS-StartupType=
+X-KDE-SubstituteUID=false
+X-KDE-Username=
diff --git a/resources/ultracopier.icns b/resources/ultracopier.icns
new file mode 100644
index 0000000..9ccd011
--- /dev/null
+++ b/resources/ultracopier.icns
Binary files differ
diff --git a/resources/ultracopier.ico b/resources/ultracopier.ico
new file mode 100644
index 0000000..1a6972a
--- /dev/null
+++ b/resources/ultracopier.ico
Binary files differ
diff --git a/resources/warning.png b/resources/warning.png
new file mode 100644
index 0000000..9c9580f
--- /dev/null
+++ b/resources/warning.png
Binary files differ
diff --git a/tools/doc/Doxyfile b/tools/doc/Doxyfile
new file mode 100644
index 0000000..a7b5793
--- /dev/null
+++ b/tools/doc/Doxyfile
@@ -0,0 +1,1790 @@
+# Doxyfile 1.7.5.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should
+# identify the project. Note that if you do not use Doxywizard you need
+# to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME = Utracopier
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = _PROJECT_NUMBER_
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = "Tools to do advanced file copy"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO = /root/ultracopier/doc/ultracopier-logo.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = TEMP_PATH/doc/tmp
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = YES
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
+# unions with only public data fields will be shown inline in the documentation
+# of the scope in which they are defined (i.e. file, namespace, or group
+# documentation), provided this scope is documented. If set to NO (the default),
+# structs, classes, and unions are shown on a separate page (for HTML and Man
+# pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page. This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files
+# containing the references data. This must be a list of .bib files. The
+# .bib extension is automatically appended if omitted. Using this command
+# requires the bibtex tool to be installed. See also
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
+# of the bibliography can be controlled using LATEX_BIB_STYLE.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ULTRACOPIERSOURCESPATH \
+ULTRACOPIERSOURCESPATH
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.d \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.py \
+ *.f90 \
+ *.f \
+ *.for \
+ *.vhd \
+ *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+# Note that relative paths are relative to directory from which doxygen is run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = xz_* xz.h
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code. Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is adviced to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER = footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the
+# mathjax.org site, so you can quickly see the result without installing
+# MathJax, but it is strongly recommended to install a local copy of MathJax
+# before deployment.
+
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS = 0
+
+# By default doxygen will use the Helvetica font for all dot files that
+# doxygen generates. When you want a differently looking font you can specify
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find
+# the font, which can be done by putting it in a standard location or by setting
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the Helvetica font.
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+# set the path where dot can find it.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used. If you choose svg you need to set
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible in IE 9+ (other browsers do not have this requirement).
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+# Note that this requires a modern browser other than Internet Explorer.
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible. Older versions of IE do not have SVG support.
+
+INTERACTIVE_SVG = NO
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
diff --git a/tools/doc/Doxyfile-plugin-template b/tools/doc/Doxyfile-plugin-template
new file mode 100644
index 0000000..99fcccd
--- /dev/null
+++ b/tools/doc/Doxyfile-plugin-template
@@ -0,0 +1,1789 @@
+# Doxyfile 1.7.5.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should
+# identify the project. Note that if you do not use Doxywizard you need
+# to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME = "_ULTRACOPIER_PLUGIN_NAME_"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = _PROJECT_NUMBER_
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = "_PROJECT_BRIEF_"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO = /root/ultracopier/doc/ultracopier-logo.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = TEMP_PATH/doc/tmp
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = YES
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
+# unions with only public data fields will be shown inline in the documentation
+# of the scope in which they are defined (i.e. file, namespace, or group
+# documentation), provided this scope is documented. If set to NO (the default),
+# structs, classes, and unions are shown on a separate page (for HTML and Man
+# pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page. This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files
+# containing the references data. This must be a list of .bib files. The
+# .bib extension is automatically appended if omitted. Using this command
+# requires the bibtex tool to be installed. See also
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
+# of the bibliography can be controlled using LATEX_BIB_STYLE.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ./
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.d \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.py \
+ *.f90 \
+ *.f \
+ *.for \
+ *.vhd \
+ *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+# Note that relative paths are relative to directory from which doxygen is run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = interface/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code. Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is adviced to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER = footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the
+# mathjax.org site, so you can quickly see the result without installing
+# MathJax, but it is strongly recommended to install a local copy of MathJax
+# before deployment.
+
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS = 0
+
+# By default doxygen will use the Helvetica font for all dot files that
+# doxygen generates. When you want a differently looking font you can specify
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find
+# the font, which can be done by putting it in a standard location or by setting
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the Helvetica font.
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+# set the path where dot can find it.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used. If you choose svg you need to set
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible in IE 9+ (other browsers do not have this requirement).
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+# Note that this requires a modern browser other than Internet Explorer.
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible. Older versions of IE do not have SVG support.
+
+INTERACTIVE_SVG = NO
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
diff --git a/tools/doc/footer.html b/tools/doc/footer.html
new file mode 100644
index 0000000..88105a5
--- /dev/null
+++ b/tools/doc/footer.html
@@ -0,0 +1,2 @@
+<hr class="footer"/>
+
diff --git a/tools/doc/ultracopier-logo.png b/tools/doc/ultracopier-logo.png
new file mode 100644
index 0000000..31dcdea
--- /dev/null
+++ b/tools/doc/ultracopier-logo.png
Binary files differ
diff --git a/tools/scripts/UltraCP b/tools/scripts/UltraCP
new file mode 100644
index 0000000..7dc6885
--- /dev/null
+++ b/tools/scripts/UltraCP
@@ -0,0 +1,28 @@
+#!/bin/bash
+"""
+Type: Nautilus Script
+Title: UltraCP
+Version: 1.0
+Info: copie des fichiers ou répertoires sélectionnés avec UltraCopier.
+ copy selected files and directories with UltraCopier.
+Author: © Copyright (C) 2013, Airelle - http://rlwpx.free.fr/WPFF/nautilus.htm
+License: GNU General Public License, version 3 or later - http://www.gnu.org/licenses/gpl.html
+Usage : copier ce fichier dans le répertoire des scripts Nautilus de votre dossier personnel
+ (~/.gnome2/nautilus-scripts/) et vérifier que le script est exécutable (x).
+ Ultracopier doit être installé (http://ultracopier.first-world.info/)
+ copy this file to the directory of Nautilus-scripts of your home
+ (~/.gnome2/nautilus-scripts/) and be sure that the script is executable (x).
+ Ultracopier must be installed (http://ultracopier.first-world.info/)
+"""
+
+IFS='
+'
+
+vers=`zenity --file-selection --directory --title="Vers..." --filename="/home/media/" --text="Choisir le dossier de destination"`
+
+for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ;
+do
+ ultracopier cp "${file}" ${vers}
+done
+
+# EOF
diff --git a/tools/scripts/UltraMV b/tools/scripts/UltraMV
new file mode 100644
index 0000000..37ced70
--- /dev/null
+++ b/tools/scripts/UltraMV
@@ -0,0 +1,28 @@
+#!/bin/bash
+"""
+Type: Nautilus Script
+Title: UltraMV
+Version: 1.0
+Info: déplace des fichiers ou répertoires sélectionnés avec UltraCopier.
+ move selected files and directories with UltraCopier.
+Author: © Copyright (C) 2013, Airelle - http://rlwpx.free.fr/WPFF/nautilus.htm
+License: GNU General Public License, version 3 or later - http://www.gnu.org/licenses/gpl.html
+Usage : copier ce fichier dans le répertoire des scripts Nautilus de votre dossier personnel
+ (~/.gnome2/nautilus-scripts/) et vérifier que le script est exécutable (x).
+ Ultracopier doit être installé (http://ultracopier.first-world.info/)
+ copy this file to the directory of Nautilus-scripts of your home
+ (~/.gnome2/nautilus-scripts/) and be sure that the script is executable (x).
+ Ultracopier must be installed (http://ultracopier.first-world.info/)
+"""
+
+IFS='
+'
+
+vers=`zenity --file-selection --directory --title="Vers..." --filename="/home/media/" --text="Choisir le dossier de destination"`
+
+for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ;
+do
+ ultracopier mv "${file}" ${vers}
+done
+
+# EOF
diff --git a/tools/to-pack/1-pre-send.sh b/tools/to-pack/1-pre-send.sh
new file mode 100755
index 0000000..960edf2
--- /dev/null
+++ b/tools/to-pack/1-pre-send.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+export TEMP_PATH="/home/ultracopier-temp/"
+export WINEBASEPATH="/home/wine/"
+export ULTRACOPIERSOURCESPATH="/root/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+rm -Rf ${TEMP_PATH} > /dev/null 2>&1
+rm -Rf ${ULTRACOPIERSOURCESPATH}/plugins-alternative/CopyEngine/Ultracopier/ > /dev/null 2>&1
+mkdir -p ${TEMP_PATH}
+cd ../
+find ./ -name "Thumbs.db" -exec rm {} \; >> /dev/null 2>&1
+find ./ -name ".directory" -exec rm {} \; >> /dev/null 2>&1
+
+cd ${BASE_PWD}
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIERSOURCESPATH}/Variable.h | grep -F "1.4" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "Update the translation..."
+source sub-script/translation.sh
+cd ${BASE_PWD}
+echo "Update the translation... done"
+
+echo "Assemble source version..."
+source sub-script/assemble-source-version.sh
+cd ${BASE_PWD}
+echo "Assemble source version... done"
+
+#echo "Assemble doc version..."
+#source sub-script/doc.sh
+#cd ${BASE_PWD}
+#echo "Assemble doc version... done"
+
+
+
diff --git a/tools/to-pack/1-update-translation.sh b/tools/to-pack/1-update-translation.sh
new file mode 100755
index 0000000..daf8263
--- /dev/null
+++ b/tools/to-pack/1-update-translation.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+export TEMP_PATH="/mnt/world/ultracopier-temp/"
+export ULTRACOPIER_SOURCE="/home/user/Desktop/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+cd ${BASE_PWD}
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIER_SOURCE}/Variable.h | grep -F "1.2" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "Update translation..."
+source sub-script/translation-local.sh
+cd ${BASE_PWD}
+echo "Update translation... done"
+
+
+
diff --git a/tools/to-pack/2-compil-wine32.sh b/tools/to-pack/2-compil-wine32.sh
new file mode 100755
index 0000000..dad795b
--- /dev/null
+++ b/tools/to-pack/2-compil-wine32.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+export TEMP_PATH="/home/ultracopier-temp/"
+export WINEBASEPATH="/home/wine/"
+export PATH=/home/mxe/usr/bin:$PATH
+export ULTRACOPIERSOURCESPATH="/root/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+cd ${BASE_PWD}
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIERSOURCESPATH}/Variable.h | grep -F "1." | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "Compil windows version..."
+source sub-script/compil-windows32.sh
+cd ${BASE_PWD}
+echo "Compil windows version... done"
+
+
+
diff --git a/tools/to-pack/2-compil-wine64.sh b/tools/to-pack/2-compil-wine64.sh
new file mode 100755
index 0000000..536f343
--- /dev/null
+++ b/tools/to-pack/2-compil-wine64.sh
@@ -0,0 +1,38 @@
+
+#!/bin/bash
+export TEMP_PATH="/home/ultracopier-temp/"
+export WINEBASEPATH="/home/wine/"
+export ULTRACOPIERSOURCESPATH="/root/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+cd ${BASE_PWD}
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIERSOURCESPATH}/Variable.h | grep -F "1.4" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "Compil windows version..."
+source sub-script/compil-windows64.sh
+cd ${BASE_PWD}
+echo "Compil windows version... done"
+
+
+
diff --git a/tools/to-pack/2-send-sources.sh b/tools/to-pack/2-send-sources.sh
new file mode 100755
index 0000000..1daced1
--- /dev/null
+++ b/tools/to-pack/2-send-sources.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+cd ../../
+find ./ -name "Thumbs.db" -exec rm {} \; >> /dev/null 2>&1
+find ./ -name ".directory" -exec rm {} \; >> /dev/null 2>&1
+
+echo "Send sources..."
+/usr/bin/rsync -avrtz --compress-level=9 --rsh='ssh -p54973' --delete --partial --progress /home/user/Desktop/ultracopier/sources/ root@ssh.first-world.info:/root/ultracopier/sources/ --exclude='*build*' --exclude='*Qt_5*' --exclude='*qt5*' --exclude='*.pro.user' --exclude='*.qm'
+echo "Send sources... done"
+
+
+
diff --git a/tools/to-pack/3-compil-mac.sh b/tools/to-pack/3-compil-mac.sh
new file mode 100755
index 0000000..21fa8bf
--- /dev/null
+++ b/tools/to-pack/3-compil-mac.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+export TEMP_PATH="/mnt/world/ultracopier-temp/"
+export ULTRACOPIER_SOURCE="/home/user/Desktop/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+cd ${BASE_PWD}
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIER_SOURCE}/Variable.h | grep -F "1.2" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "Assemble mac version..."
+source sub-script/mac.sh
+cd ${BASE_PWD}
+echo "Assemble mac version... done"
+
+
+
diff --git a/tools/to-pack/4-clean-all.sh b/tools/to-pack/4-clean-all.sh
new file mode 100755
index 0000000..40770b6
--- /dev/null
+++ b/tools/to-pack/4-clean-all.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+export TEMP_PATH="/home/ultracopier-temp/"
+export WINEBASEPATH="/home/wine/"
+export ULTRACOPIERSOURCESPATH="/root/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIERSOURCESPATH}/Variable.h | grep -F "1.4" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "Clean the temp folder..."
+source sub-script/clean-all.sh
+cd ${BASE_PWD}
+echo "Clean the temp folder... done"
+
+
diff --git a/tools/to-pack/4-upload.sh b/tools/to-pack/4-upload.sh
new file mode 100755
index 0000000..d908ddd
--- /dev/null
+++ b/tools/to-pack/4-upload.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+export TEMP_PATH="/mnt/world/ultracopier-temp/"
+export ULTRACOPIER_SOURCE="/home/user/Desktop/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+cd ${BASE_PWD}
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIER_SOURCE}/Variable.h | grep -F "1.2" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "Upload version..."
+source sub-script/upload-local.sh
+cd ${BASE_PWD}
+echo "Upload version... done"
+
+
+
+
diff --git a/tools/to-pack/5-upload.sh b/tools/to-pack/5-upload.sh
new file mode 100755
index 0000000..0cf5021
--- /dev/null
+++ b/tools/to-pack/5-upload.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+export TEMP_PATH="/home/ultracopier-temp/"
+export WINEBASEPATH="/home/wine/"
+export ULTRACOPIERSOURCESPATH="/root/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIERSOURCESPATH}/Variable.h | grep -F "1.4" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "upload..."
+source sub-script/upload.sh
+cd ${BASE_PWD}
+echo "upload... done"
+
+
diff --git a/tools/to-pack/6-sendmail.sh b/tools/to-pack/6-sendmail.sh
new file mode 100755
index 0000000..0dc32c8
--- /dev/null
+++ b/tools/to-pack/6-sendmail.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+export TEMP_PATH="/home/ultracopier-temp/"
+export WINEBASEPATH="/home/wine/"
+export ULTRACOPIERSOURCESPATH="/root/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIERSOURCESPATH}/Variable.h | grep -F "1.4" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "upload..."
+source sub-script/sendmail.sh
+cd ${BASE_PWD}
+echo "upload... done"
+
+
diff --git a/tools/to-pack/data/windows/install-static.nsi b/tools/to-pack/data/windows/install-static.nsi
new file mode 100755
index 0000000..0bfc57d
--- /dev/null
+++ b/tools/to-pack/data/windows/install-static.nsi
@@ -0,0 +1,162 @@
+!include Library.nsh
+!define LIBRARY_X64
+!define LIBRARY_SHELL_EXTENSION
+!define LIBRARY_COM
+
+; HM NIS Edit Wizard helper defines
+!define PRODUCT_NAME "Ultracopier"
+!define PRODUCT_VERSION "X.X.X.X"
+!define PRODUCT_PUBLISHER "Ultracopier"
+!define PRODUCT_WEB_SITE "http://ultracopier.first-world.info/"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\ultracopier.exe"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+
+RequestExecutionLevel admin
+
+SetCompressor /FINAL /SOLID lzma
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
+!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+; !insertmacro MUI_PAGE_LICENSE "COPYING.txt"
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!define MUI_FINISHPAGE_RUN "$INSTDIR\ultracopier.exe"
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+!insertmacro MUI_LANGUAGE "English"
+
+; Reserve files
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "setup.exe"
+InstallDir "$PROGRAMFILES\Ultracopier"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+
+Section "SectionPrincipale" SEC01
+ SetOutPath "$INSTDIR"
+ SetOverwrite on
+ File "ultracopier.exe"
+ CreateDirectory "$SMPROGRAMS\Ultracopier"
+ CreateShortCut "$SMPROGRAMS\Ultracopier\Ultracopier.lnk" "$INSTDIR\ultracopier.exe"
+ File /r /x *.nsi /x setup.exe *
+ !insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED catchcopy32.dll $INSTDIR\catchcopy32.dll $INSTDIR
+ !insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED catchcopy64.dll $INSTDIR\catchcopy64.dll $INSTDIR
+SectionEnd
+
+Section -AdditionalIcons
+ CreateShortCut "$SMPROGRAMS\Ultracopier\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\ultracopier.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\ultracopier.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+SectionEnd
+
+
+Function un.onUninstFailed
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "To remove $(^Name) from the computer, close the application and remove manualy the folder"
+FunctionEnd
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) have been uninstall from the computer."
+FunctionEnd
+
+Function un.onInit
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely uninstall $(^Name) and all of its components?" IDYES +2
+ Abort
+FunctionEnd
+
+Function .onInit
+
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+ StrCmp $R0 "" done
+
+ MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
+ "${PRODUCT_NAME} is already installed. $\n$\nClick `OK` to remove the \
+ previous version or `Cancel` to cancel this upgrade." \
+ IDOK uninst
+ Abort
+
+;Run the uninstaller
+uninst:
+ ClearErrors
+ ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file
+
+ IfErrors no_remove_uninstaller done
+ ;You can either use Delete /REBOOTOK in the uninstaller or add some code
+ ;here to remove the uninstaller. Use a registry key to check
+ ;whether the user has chosen to uninstall. If you are using an uninstaller
+ ;components page, make sure all sections are uninstalled.
+ no_remove_uninstaller:
+
+done:
+
+FunctionEnd
+
+Section Uninstall
+ IfFileExists "$INSTDIR\ultracopier.exe" CloseProgram
+ Abort "The original application $INSTDIR\ultracopier.exe is not found"
+ Goto NotLaunched
+ CloseProgram:
+ ExecWait '"$INSTDIR\ultracopier.exe" quit' $0
+ IntCmp $0 0 NotLaunched
+ DetailPrint "Waiting Close..."
+ CloseLoop:
+ Sleep 200
+ ExecWait '"$INSTDIR\ultracopier.exe" quit' $0
+ IntCmp $0 0 NotLaunched
+ Goto CloseLoop
+
+ NotLaunched:
+
+ ExecWait 'regsvr32 /s /u "$INSTDIR\catchcopy32.dll"'
+ ExecWait 'regsvr32 /s /u "$INSTDIR\catchcopy64.dll"'
+
+; DeleteRegKey HKCU "Software\Ultracopier"
+; DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "ultracopier"
+ Delete "$SMPROGRAMS\Ultracopier\Uninstall.lnk"
+ Delete "$SMPROGRAMS\Ultracopier\Ultracopier.lnk"
+
+ Delete /REBOOTOK $SMPROGRAMS\catchcopy32.dll
+ Delete /REBOOTOK $SMPROGRAMS\catchcopy64.dll
+ Delete /REBOOTOK $INSTDIR\catchcopy32.dll
+ Delete /REBOOTOK $INSTDIR\catchcopy64.dll
+ RMDir /REBOOTOK /r "$SMPROGRAMS\Ultracopier"
+ RMDir /REBOOTOK /r "$INSTDIR"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+ SetAutoClose true
+SectionEnd
diff --git a/tools/to-pack/data/windows/install.nsi b/tools/to-pack/data/windows/install.nsi
new file mode 100755
index 0000000..376f762
--- /dev/null
+++ b/tools/to-pack/data/windows/install.nsi
@@ -0,0 +1,162 @@
+!include Library.nsh
+!define LIBRARY_X64
+!define LIBRARY_SHELL_EXTENSION
+!define LIBRARY_COM
+
+; HM NIS Edit Wizard helper defines
+!define PRODUCT_NAME "Ultracopier"
+!define PRODUCT_VERSION "X.X.X.X"
+!define PRODUCT_PUBLISHER "Ultracopier"
+!define PRODUCT_WEB_SITE "http://ultracopier.first-world.info/"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\ultracopier.exe"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+
+RequestExecutionLevel admin
+
+SetCompressor /FINAL /SOLID lzma
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
+!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
+
+; Welcome page
+!insertmacro MUI_PAGE_WELCOME
+; License page
+; !insertmacro MUI_PAGE_LICENSE "COPYING.txt"
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!define MUI_FINISHPAGE_RUN "$INSTDIR\ultracopier.exe"
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+!insertmacro MUI_LANGUAGE "English"
+
+; Reserve files
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+; MUI end ------
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "setup.exe"
+InstallDir "$PROGRAMFILES\Ultracopier"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails show
+ShowUnInstDetails show
+
+Section "SectionPrincipale" SEC01
+ SetOutPath "$INSTDIR"
+ SetOverwrite on
+ File "ultracopier.exe"
+ CreateDirectory "$SMPROGRAMS\Ultracopier"
+ CreateShortCut "$SMPROGRAMS\Ultracopier\Ultracopier.lnk" "$INSTDIR\ultracopier.exe"
+ File /r /x *.nsi /x setup.exe *
+ !insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED PluginLoader\catchcopy-v0002\catchcopy32.dll $INSTDIR\PluginLoader\catchcopy-v0002\catchcopy32.dll $INSTDIR
+ !insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED PluginLoader\catchcopy-v0002\catchcopy64.dll $INSTDIR\PluginLoader\catchcopy-v0002\catchcopy64.dll $INSTDIR
+SectionEnd
+
+Section -AdditionalIcons
+ CreateShortCut "$SMPROGRAMS\Ultracopier\Uninstall.lnk" "$INSTDIR\uninst.exe"
+SectionEnd
+
+Section -Post
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\ultracopier.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\ultracopier.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+SectionEnd
+
+
+Function un.onUninstFailed
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "To remove $(^Name) from the computer, close the application and remove manualy the folder"
+FunctionEnd
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) have been uninstall from the computer."
+FunctionEnd
+
+Function un.onInit
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely uninstall $(^Name) and all of its components?" IDYES +2
+ Abort
+FunctionEnd
+
+Function .onInit
+
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+ StrCmp $R0 "" done
+
+ MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
+ "${PRODUCT_NAME} is already installed. $\n$\nClick `OK` to remove the \
+ previous version or `Cancel` to cancel this upgrade." \
+ IDOK uninst
+ Abort
+
+;Run the uninstaller
+uninst:
+ ClearErrors
+ ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file
+
+ IfErrors no_remove_uninstaller done
+ ;You can either use Delete /REBOOTOK in the uninstaller or add some code
+ ;here to remove the uninstaller. Use a registry key to check
+ ;whether the user has chosen to uninstall. If you are using an uninstaller
+ ;components page, make sure all sections are uninstalled.
+ no_remove_uninstaller:
+
+done:
+
+FunctionEnd
+
+Section Uninstall
+ IfFileExists "$INSTDIR\ultracopier.exe" CloseProgram
+ Abort "The original application $INSTDIR\ultracopier.exe is not found"
+ Goto NotLaunched
+ CloseProgram:
+ ExecWait '"$INSTDIR\ultracopier.exe" quit' $0
+ IntCmp $0 0 NotLaunched
+ DetailPrint "Waiting Close..."
+ CloseLoop:
+ Sleep 200
+ ExecWait '"$INSTDIR\ultracopier.exe" quit' $0
+ IntCmp $0 0 NotLaunched
+ Goto CloseLoop
+
+ NotLaunched:
+
+ ExecWait 'regsvr32 /s /u "$INSTDIR\PluginLoader\catchcopy-v0002\catchcopy32.dll"'
+ ExecWait 'regsvr32 /s /u "$INSTDIR\PluginLoader\catchcopy-v0002\catchcopy64.dll"'
+
+; DeleteRegKey HKCU "Software\Ultracopier"
+ DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "ultracopier"
+ Delete "$SMPROGRAMS\Ultracopier\Uninstall.lnk"
+ Delete "$SMPROGRAMS\Ultracopier\Ultracopier.lnk"
+
+ Delete /REBOOTOK $SMPROGRAMS\PluginLoader\catchcopy-v0002\catchcopy32.dll
+ Delete /REBOOTOK $SMPROGRAMS\PluginLoader\catchcopy-v0002\catchcopy64.dll
+ Delete /REBOOTOK $INSTDIR\PluginLoader\catchcopy-v0002\catchcopy32.dll
+ Delete /REBOOTOK $INSTDIR\PluginLoader\catchcopy-v0002\catchcopy64.dll
+ RMDir /REBOOTOK /r "$SMPROGRAMS\Ultracopier"
+ RMDir /REBOOTOK /r "$INSTDIR"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+ SetAutoClose true
+SectionEnd
diff --git a/tools/to-pack/data/windows/resources-windows-ultracopier-plugins.rc b/tools/to-pack/data/windows/resources-windows-ultracopier-plugins.rc
new file mode 100644
index 0000000..6a9c2fa
--- /dev/null
+++ b/tools/to-pack/data/windows/resources-windows-ultracopier-plugins.rc
@@ -0,0 +1,27 @@
+#include <windows.h>
+
+1 VERSIONINFO
+FILEVERSION ULTRACOPIER_PLUGIN_WINDOWS_VERSION
+PRODUCTVERSION ULTRACOPIER_PLUGIN_WINDOWS_VERSION
+{
+ BLOCK "StringFileInfo"
+ {
+ BLOCK "040904E4"
+ {
+ VALUE "CompanyName", "ultracopier.first-world.info"
+ VALUE "FileVersion", "ULTRACOPIER_PLUGIN_VERSION"
+ VALUE "FileDescription", "ULTRACOPIER_PLUGIN_NAME for Ultracopier under GPL3"
+ VALUE "InternalName", "ULTRACOPIER_PLUGIN_FILENAME"
+ VALUE "LegalCopyright", "GPL3"
+ VALUE "LegalTrademarks", "ULTRACOPIER_PLUGIN_NAME for Ultracopier under GPL3"
+ VALUE "OriginalFilename", "ULTRACOPIER_PLUGIN_FILENAME"
+ VALUE "ProductName", "ULTRACOPIER_PLUGIN_NAME for Ultracopier"
+ VALUE "ProductVersion", "ULTRACOPIER_PLUGIN_VERSION"
+ }
+ }
+ BLOCK "VarFileInfo"
+ {
+ VALUE "Translation", 0x0409, 1252
+ }
+}
+
diff --git a/tools/to-pack/data/windows/ultracopier.ico b/tools/to-pack/data/windows/ultracopier.ico
new file mode 100755
index 0000000..1a6972a
--- /dev/null
+++ b/tools/to-pack/data/windows/ultracopier.ico
Binary files differ
diff --git a/tools/to-pack/grouped.sh b/tools/to-pack/grouped.sh
new file mode 100755
index 0000000..36936d9
--- /dev/null
+++ b/tools/to-pack/grouped.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+export ULTRACOPIERSOURCESPATH="/root/ultracopier/sources/"
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIERSOURCESPATH}/Variable.h | grep -F "1.4" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+
+./1-pre-send.sh
+./2-compil-wine32.sh
+#./2-compil-wine64.sh
+./4-clean-all.sh
+#mv /home/ultracopier-temp/ultracopier-*.* /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/
+#mv /home/ultracopier-temp/supercopier-*.* /home/first-world.info/files-rw/supercopier/${ULTRACOPIER_VERSION}/
+#rsync -avrt /home/ultracopier-temp/plugins/ /home/first-world.info/files-rw/ultracopier/plugins/
+#rm -Rf /home/ultracopier-temp/plugins/
diff --git a/tools/to-pack/old-3-compil-linux.sh b/tools/to-pack/old-3-compil-linux.sh
new file mode 100755
index 0000000..8796fc4
--- /dev/null
+++ b/tools/to-pack/old-3-compil-linux.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+export TEMP_PATH="/mnt/world/ultracopier-temp/"
+export ULTRACOPIER_SOURCE="/home/user/Desktop/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+cd ${BASE_PWD}
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIER_SOURCE}/Variable.h | grep -F "1.2" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+echo "Assemble linux version..."
+source sub-script/linux.sh
+cd ${BASE_PWD}
+echo "Assemble linux version... done"
+
+
+
diff --git a/tools/to-pack/sub-script/assemble-source-version.sh b/tools/to-pack/sub-script/assemble-source-version.sh
new file mode 100755
index 0000000..f00516e
--- /dev/null
+++ b/tools/to-pack/sub-script/assemble-source-version.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+cd ${TEMP_PATH}/
+
+FINAL_ARCHIVE="ultracopier-src-${ULTRACOPIER_VERSION}.tar.xz"
+if [ ! -e ${FINAL_ARCHIVE} ]; then
+ rm -Rf ${TEMP_PATH}/ultracopier-src/
+ cp -aRf ${ULTRACOPIERSOURCESPATH}/ ${TEMP_PATH}/ultracopier-src/
+ find ${TEMP_PATH}/ultracopier-src/ -name "*.pro.user" -exec rm {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -name "*-build-desktop" -type d -exec rm -Rf {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -name "*-build-desktop*" -type d -exec rm -Rf {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -name "*Qt_in_*" -type d -exec rm -Rf {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -name "informations.xml" -exec sed -i "s/linux-x86_64-pc/windows-x86/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_DEBUG/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLE/\/\/#define ULTRACOPIER_VERSION_PORTABLE/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -iname "*.qm" -exec rm {} \; > /dev/null 2>&1
+
+ tar cJf ${FINAL_ARCHIVE} ultracopier-src/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar
+ if [ ! -e ${FINAL_ARCHIVE} ]; then
+ echo "${FINAL_ARCHIVE} not exists!";
+ exit;
+ fi
+fi
+
+if [ -d ${TEMP_PATH}/ultracopier-src/plugins/ ]
+then
+ cd ${TEMP_PATH}/ultracopier-src/plugins/
+ find ${TEMP_PATH}/ultracopier-src/plugins/ -iname "*.qm" -exec rm {} \;
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/ultracopier-src/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -d ${plugins_name} ] && [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ echo "do source package for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ find ${TEMP_PATH}/ultracopier-src/ -iname "*.h" -exec sed -i "s/..\/..\/..\/interface\//interface\//g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -iname "*.pro" -exec sed -i "s/..\/..\/..\/interface\//interface\//g" {} \; > /dev/null 2>&1
+ rsync -art ${TEMP_PATH}/ultracopier-src/interface/ ${plugins_name}/interface/ > /dev/null 2>&1
+ FILE="StructEnumDefinition.h"
+ if [ -e ${plugins_name}/${FILE} ]
+ then
+ rm -f ${plugins_name}/${FILE}
+ cp ${TEMP_PATH}/ultracopier-src/${FILE} ${plugins_name}/${FILE}
+ fi
+ FILE="CompilerInfo.h"
+ if [ -e ${plugins_name}/${FILE} ]
+ then
+ rm -f ${plugins_name}/${FILE}
+ cp ${TEMP_PATH}/ultracopier-src/${FILE} ${plugins_name}/${FILE}
+ fi
+ FILE="PlatformMacro.h"
+ if [ -e ${plugins_name}/${FILE} ]
+ then
+ rm -f ${plugins_name}/${FILE}
+ cp ${TEMP_PATH}/ultracopier-src/${FILE} ${plugins_name}/${FILE}
+ fi
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-src.tar.xz
+ fi
+ done
+ cd ${TEMP_PATH}/ultracopier-src/plugins/
+ fi
+ done
+ cd ${TEMP_PATH}/ultracopier-src/plugins-alternative/
+ find ${TEMP_PATH}/ultracopier-src/plugins-alternative/ -iname "*.qm" -exec rm {} \;
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/ultracopier-src/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -d ${plugins_name} ] && [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ echo "do source package for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ find ${TEMP_PATH}/ultracopier-src/ -iname "*.h" -exec sed -i "s/..\/..\/..\/interface\//interface\//g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/ultracopier-src/ -iname "*.pro" -exec sed -i "s/..\/..\/..\/interface\//interface\//g" {} \; > /dev/null 2>&1
+ rsync -art ${TEMP_PATH}/ultracopier-src/interface/ ${plugins_name}/interface/ > /dev/null 2>&1
+ FILE="StructEnumDefinition.h"
+ if [ -e ${plugins_name}/${FILE} ]
+ then
+ rm -f ${plugins_name}/${FILE}
+ cp ${TEMP_PATH}/ultracopier-src/${FILE} ${plugins_name}/${FILE}
+ fi
+ FILE="CompilerInfo.h"
+ if [ -e ${plugins_name}/${FILE} ]
+ then
+ rm -f ${plugins_name}/${FILE}
+ cp ${TEMP_PATH}/ultracopier-src/${FILE} ${plugins_name}/${FILE}
+ fi
+ FILE="PlatformMacro.h"
+ if [ -e ${plugins_name}/${FILE} ]
+ then
+ rm -f ${plugins_name}/${FILE}
+ cp ${TEMP_PATH}/ultracopier-src/${FILE} ${plugins_name}/${FILE}
+ fi
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-src.tar.xz
+ fi
+ done
+ cd ${TEMP_PATH}/ultracopier-src/plugins-alternative/
+ fi
+ done
+ cd ${TEMP_PATH}/ultracopier-src/plugins/Languages/
+ for plugins_name in `ls -1`
+ do
+ if [ -d ${plugins_name} ]
+ then
+ mkdir -p ${TEMP_PATH}/plugins/Languages/${plugins_name}/
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 > ${TEMP_PATH}/plugins/Languages/${plugins_name}/Languages-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-src.tar.xz
+ fi
+ done
+fi
diff --git a/tools/to-pack/sub-script/assemble-windows-version-32.sh b/tools/to-pack/sub-script/assemble-windows-version-32.sh
new file mode 100644
index 0000000..20f8899
--- /dev/null
+++ b/tools/to-pack/sub-script/assemble-windows-version-32.sh
@@ -0,0 +1,153 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+cd ${TEMP_PATH}/
+
+ARCHITECTURE="x86"
+
+COMPIL_DEBUGREAL=1
+COMPIL_NORMAL=1
+COMPIL_PLUGIN=1
+COMPIL_ULTIMATE=1
+
+source ${BASE_PWD}/sub-script/assemble.sh
+
+if [ ${COMPIL_DEBUGREAL} -eq 1 ]
+then
+ assemble "ultracopier-debug-real" "${ARCHITECTURE}" 1 1 0 0 0
+fi
+
+if [ ${COMPIL_NORMAL} -eq 1 ]
+then
+ assemble "ultracopier-debug" "${ARCHITECTURE}" 1 0 0 0 0
+ assemble "ultracopier-debug-portable" "${ARCHITECTURE}" 1 0 1 0 0
+ assemble "ultracopier-portable" "${ARCHITECTURE}" 0 0 1 0 0
+ assemble "ultracopier-portableapps" "${ARCHITECTURE}" 0 0 1 0 0
+ assemble "ultracopier" "${ARCHITECTURE}" 0 0 0 0 0
+
+ assemble "ultracopier-debug-static" "${ARCHITECTURE}" 1 0 0 0 1
+ assemble "ultracopier-debug-portable-static" "${ARCHITECTURE}" 1 0 1 0 1
+ assemble "ultracopier-portable-static" "${ARCHITECTURE}" 0 0 1 0 1
+ assemble "ultracopier-static" "${ARCHITECTURE}" 0 0 0 0 1
+fi
+
+if [ ${COMPIL_ULTIMATE} -eq 1 ]
+then
+ assemble "ultracopier-ultimate" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-sse2" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-sse3" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-pentium3" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-pentium4" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-core2" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-core-i" "${ARCHITECTURE}" 0 0 0 1 0
+
+ assemble "ultracopier-ultimate-k8" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-barcelona" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-bobcat" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-llano" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-bulldozer" "${ARCHITECTURE}" 0 0 0 1 0
+fi
+
+if [ ${COMPIL_PLUGIN} -eq 1 ]
+then
+
+TARGET="ultracopier"
+find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86<\/architecture>/g" {} \; > /dev/null 2>&1
+cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+for plugins_cat in `ls -1`
+do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} windows for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+done
+cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+for plugins_cat in `ls -1`
+do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} windows for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+done
+
+
+TARGET="ultracopier-debug"
+find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86<\/architecture>/g" {} \; > /dev/null 2>&1
+cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+for plugins_cat in `ls -1`
+do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} debug windows for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+done
+cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+for plugins_cat in `ls -1`
+do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} debug windows for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+done
+
+fi
diff --git a/tools/to-pack/sub-script/assemble-windows-version-64.sh b/tools/to-pack/sub-script/assemble-windows-version-64.sh
new file mode 100644
index 0000000..a158b83
--- /dev/null
+++ b/tools/to-pack/sub-script/assemble-windows-version-64.sh
@@ -0,0 +1,149 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+cd ${TEMP_PATH}/
+
+COMPIL_DEBUGREAL=1
+COMPIL_NORMAL=1
+COMPIL_PLUGIN=1
+COMPIL_ULTIMATE=1
+
+ARCHITECTURE="x86_64"
+
+source ${BASE_PWD}/sub-script/assemble.sh
+
+if [ ${COMPIL_DEBUGREAL} -eq 1 ]
+then
+ assemble "ultracopier-debug-real" "${ARCHITECTURE}" 1 1 0 0 0
+fi
+if [ ${COMPIL_NORMAL} -eq 1 ]
+then
+ assemble "ultracopier-debug" "${ARCHITECTURE}" 1 0 0 0 0
+ assemble "ultracopier-debug-portable" "${ARCHITECTURE}" 1 0 1 0 0
+ assemble "ultracopier-portable" "${ARCHITECTURE}" 0 0 1 0 0
+ assemble "ultracopier" "${ARCHITECTURE}" 0 0 0 0 0
+
+ assemble "ultracopier-debug-static" "${ARCHITECTURE}" 1 0 0 0 1
+ assemble "ultracopier-debug-portable-static" "${ARCHITECTURE}" 1 0 1 0 1
+ assemble "ultracopier-portable-static" "${ARCHITECTURE}" 0 0 1 0 1
+ assemble "ultracopier-static" "${ARCHITECTURE}" 0 0 0 0 1
+fi
+
+if [ ${COMPIL_ULTIMATE} -eq 1 ]
+then
+ assemble "ultracopier-ultimate" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-sse2" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-sse3" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-core2" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-core-i" "${ARCHITECTURE}" 0 0 0 1 0
+
+ assemble "ultracopier-ultimate-k8" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-barcelona" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-bobcat" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-llano" "${ARCHITECTURE}" 0 0 0 1 0
+ assemble "ultracopier-ultimate-bulldozer" "${ARCHITECTURE}" 0 0 0 1 0
+fi
+
+if [ ${COMPIL_PLUGIN} -eq 1 ]
+then
+
+TARGET="ultracopier"
+find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86_64<\/architecture>/g" {} \; > /dev/null 2>&1
+cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+for plugins_cat in `ls -1`
+do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} windows for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+done
+cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+for plugins_cat in `ls -1`
+do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} windows for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+done
+
+
+TARGET="ultracopier-debug"
+find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86_64<\/architecture>/g" {} \; > /dev/null 2>&1
+cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+for plugins_cat in `ls -1`
+do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} debug windows for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+done
+cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+for plugins_cat in `ls -1`
+do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} debug windows for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+done
+
+fi
diff --git a/tools/to-pack/sub-script/assemble.sh b/tools/to-pack/sub-script/assemble.sh
new file mode 100644
index 0000000..8b344e9
--- /dev/null
+++ b/tools/to-pack/sub-script/assemble.sh
@@ -0,0 +1,219 @@
+#!/bin/bash
+
+function assemble {
+ TARGET=$1
+ ARCHITECTURE=$2
+ DEBUG=$3
+ DEBUG_REAL=$4
+ PORTABLE=$5
+ ULTIMATE=$6
+ STATIC=${7}
+ CGMINER=${8}
+ SUPERCOPIER=${9}
+ ULTRACOPIER_VERSION_FINAL=${ULTRACOPIER_VERSION}
+ DEBUGANDSETUP=0
+ cd ${TEMP_PATH}/
+ if [ ${DEBUG_REAL} -eq 1 ]
+ then
+ FINAL_ARCHIVE="${TARGET}-windows-${ARCHITECTURE}-${ULTRACOPIER_VERSION_FINAL}.7z"
+ else
+ FINAL_ARCHIVE="${TARGET}-windows-${ARCHITECTURE}-${ULTRACOPIER_VERSION_FINAL}.zip"
+ fi
+ if [ ! -d ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ ]
+ then
+ echo "no previous compilation folder found into ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/..."
+ exit
+ fi
+ if [ ! -e ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/*.exe ]
+ then
+ echo "no application found into ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/..."
+ exit
+ fi
+ if [ ! -e ${FINAL_ARCHIVE} ]; then
+ echo "creating the archive ${TARGET}..."
+ if [ ${STATIC} -ne 1 ]
+ then
+ mkdir -p ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/CopyEngine/Ultracopier/
+ mkdir -p ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/
+ mkdir -p ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Listener/catchcopy-v0002/
+ mkdir -p ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/PluginLoader/catchcopy-v0002/
+ mkdir -p ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/SessionLoader/Windows/
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ mkdir -p ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Themes/Supercopier/
+ else
+ mkdir -p ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Themes/Oxygen/
+ fi
+
+ if [ -e ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins/ ]
+ then
+ if [ ${ULTIMATE} -eq 1 ]
+ then
+ rsync -aqrt ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/
+ rsync -aqrt ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins-alternative/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/
+ else
+ rsync -aqrt ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/
+ fi
+ fi
+
+ rsync -aqrt ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins/Languages/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/
+ rsync -aqrt ${ULTRACOPIERSOURCESPATH}/plugins/Languages/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/ --exclude=*.xml --exclude=*.qm
+ rsync -aqrt ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins/CopyEngine/Ultracopier/Languages/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/CopyEngine/Ultracopier/Languages/
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ rsync -aqrt ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins-alternative/Themes/Supercopier/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Themes/Supercopier/
+ else
+ rsync -aqrt ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins/Themes/Oxygen/Languages/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Themes/Oxygen/Languages/
+ fi
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ -iname "*.a" -exec rm {} \; > /dev/null 2>&1
+ rm -Rf ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/plugins-alternative/
+ else
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ -mindepth 1 -type d -exec rm -Rf {} \;
+ fi
+ if [ ${CGMINER} -eq 1 ]
+ then
+ if [ "${ARCHITECTURE}" != "x86" ]
+ then
+ rsync -aqrt ${BASE_PWD}/data/windows/miner-win64/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/addon/
+ else
+ rsync -aqrt ${BASE_PWD}/data/windows/miner-win32/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/addon/
+ fi
+ fi
+ cp -Rf ${ULTRACOPIERSOURCESPATH}/README ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/README.txt
+ cp -Rf ${ULTRACOPIERSOURCESPATH}/COPYING ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/COPYING.txt
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ sed -i "s/Ultracopier /Supercopier /g" ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/README.txt
+ fi
+ if [ 1 == 2 ]
+ then
+ if [ "${ARCHITECTURE}" == "x86" ] && [ ${DEBUG_REAL} -ne 1 ]
+ then
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ upx --lzma -9 ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/supercopier.exe > /dev/null 2>&1
+ else
+ upx --lzma -9 ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ultracopier.exe > /dev/null 2>&1
+ fi
+ fi
+ fi
+ cp -Rf ${BASE_PWD}/data/windows-${ARCHITECTURE}/dll-qt-debug/lib* ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/
+ if [ ${STATIC} -ne 1 ]
+ then
+ if [ ${DEBUG_REAL} -eq 1 ]
+ then
+ cp -Rf ${BASE_PWD}/data/windows-${ARCHITECTURE}/dll-qt-debug/* ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/
+ else
+ cp -Rf ${BASE_PWD}/data/windows-${ARCHITECTURE}/dll-qt/* ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/
+ fi
+ fi
+ if [ ${DEBUG} -eq 1 ]
+ then
+ CATCHCOPY_SUFIX="d"
+ else
+ CATCHCOPY_SUFIX=""
+ fi
+ if [ ${STATIC} -eq 1 ]
+ then
+ cp -Rf ${BASE_PWD}/data/windows/catchcopy32${CATCHCOPY_SUFIX}.dll ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/catchcopy32${CATCHCOPY_SUFIX}.dll
+ cp -Rf ${BASE_PWD}/data/windows/catchcopy64${CATCHCOPY_SUFIX}.dll ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/catchcopy64${CATCHCOPY_SUFIX}.dll
+ else
+ cp -Rf ${BASE_PWD}/data/windows/catchcopy32${CATCHCOPY_SUFIX}.dll ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/PluginLoader/catchcopy-v0002/catchcopy32${CATCHCOPY_SUFIX}.dll
+ cp -Rf ${BASE_PWD}/data/windows/catchcopy64${CATCHCOPY_SUFIX}.dll ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/PluginLoader/catchcopy-v0002/catchcopy64${CATCHCOPY_SUFIX}.dll
+ fi
+ if [ ${STATIC} -ne 1 ]
+ then
+ cp -f ${BASE_PWD}/data/qm-translation/fr.qm ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/fr/qt.qm
+ cp -f ${BASE_PWD}/data/qm-translation/ar.qm ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/ar/qt.qm
+ cp -f ${BASE_PWD}/data/qm-translation/es.qm ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/es/qt.qm
+ cp -f ${BASE_PWD}/data/qm-translation/ja.qm ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/ja/qt.qm
+ cp -f ${BASE_PWD}/data/qm-translation/ko.qm ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/ko/qt.qm
+ cp -f ${BASE_PWD}/data/qm-translation/pl.qm ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/pl/qt.qm
+ cp -f ${BASE_PWD}/data/qm-translation/pt.qm ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/pt/qt.qm
+ cp -f ${BASE_PWD}/data/qm-translation/ru.qm ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Languages/ru/qt.qm
+ fi
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ -iname "*.ts" -exec rm {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-${ARCHITECTURE}<\/architecture>/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION_FINAL}<\/version>/g" {} \; > /dev/null 2>&1
+
+ rm -Rf ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/SessionLoader/KDE4/
+ rm -Rf ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/Listener/dbus/
+ if [ ${PORTABLE} -eq 1 ]
+ then
+ rm -Rf ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/SessionLoader/
+ fi
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ -type d -empty -delete > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ -type d -empty -delete > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ -type d -empty -delete > /dev/null 2>&1
+
+ if [ ${DEBUG_REAL} -eq 1 ]
+ then
+ mkdir ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ultracopier/
+ mv ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/* ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ultracopier/
+ mv ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ultracopier/ultracopier-debug.bat ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/
+ cp -Rf /home/wine/qt-5.0-32Bits-for-ultracopier/drive_c/mingw32/ ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/mingw32/
+ fi
+
+ find ${TARGET}-windows-${ARCHITECTURE}/ -type d -exec chmod 700 "{}" \;
+ find ${TARGET}-windows-${ARCHITECTURE}/ -type f -exec chmod 600 "{}" \;
+ chown -Rf root.root ${TARGET}-windows-${ARCHITECTURE}/
+ find ${TARGET}-windows-${ARCHITECTURE}/ -type f -exec touch -t 201601020000.00 "{}" \;
+ find ${TARGET}-windows-${ARCHITECTURE}/ -type d -exec touch -t 201601020000.00 "{}" \;
+ if [ ${DEBUG_REAL} -eq 1 ]
+ then
+ 7za a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on ${FINAL_ARCHIVE} ${TARGET}-windows-${ARCHITECTURE}/
+ else
+ zip -r -q -9 ${FINAL_ARCHIVE} ${TARGET}-windows-${ARCHITECTURE}/
+ fi
+ #7za a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on ${FINAL_ARCHIVE} ${TARGET}-windows-${ARCHITECTURE}/
+ #nice -n 15 ionice -c 3 tar cf - ${TARGET}-windows-${ARCHITECTURE}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | nice -n 15 ionice -c 3 xz -z -9 -e > ${FINAL_ARCHIVE}
+ if [ ! -e ${FINAL_ARCHIVE} ]; then
+ echo "${FINAL_ARCHIVE} not exists!";
+ exit;
+ fi
+ echo "creating the archive ${TARGET}... done"
+ fi
+ FINAL_ARCHIVE="${TARGET}-windows-${ARCHITECTURE}-${ULTRACOPIER_VERSION_FINAL}-setup.exe"
+ if ( [ ${DEBUG} -eq 0 ] || [ ${DEBUGANDSETUP} -eq 1 ] ) && [ ${PORTABLE} -eq 0 ] && [ ! -e ${FINAL_ARCHIVE} ]; then
+ echo "creating the installer ${TARGET}..."
+ cd ${TEMP_PATH}/
+ rm -Rf ${TEMP_PATH}/Ultracopier-installer-windows-${ARCHITECTURE}/
+ mkdir -p ${TEMP_PATH}/Ultracopier-installer-windows-${ARCHITECTURE}/
+ cd ${TEMP_PATH}/Ultracopier-installer-windows-${ARCHITECTURE}/
+ if [ ${STATIC} -eq 1 ]
+ then
+ cp -aRf ${BASE_PWD}/data/windows/install-static.nsi ${TEMP_PATH}/Ultracopier-installer-windows-${ARCHITECTURE}/
+ else
+ cp -aRf ${BASE_PWD}/data/windows/install.nsi ${TEMP_PATH}/Ultracopier-installer-windows-${ARCHITECTURE}/
+ fi
+ #cp -aRf ${BASE_PWD}/data/windows/ultracopier.ico ${TEMP_PATH}/Ultracopier-installer-windows-${ARCHITECTURE}/
+ rsync -art ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/ ${TEMP_PATH}/Ultracopier-installer-windows-${ARCHITECTURE}/
+ cd ${TEMP_PATH}/Ultracopier-installer-windows-${ARCHITECTURE}/
+ sed -i -r "s/X.X.X.X/${ULTRACOPIER_VERSION_FINAL}/g" *.nsi > /dev/null 2>&1
+ if [ "${ARCHITECTURE}" != "x86" ]
+ then
+ sed -i -r "s/PROGRAMFILES/PROGRAMFILES64/g" *.nsi > /dev/null 2>&1
+ fi
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ sed -i -r "s/Ultracopier/Supercopier/g" *.nsi > /dev/null 2>&1
+ sed -i -r "s/ultracopier/supercopier/g" *.nsi > /dev/null 2>&1
+ fi
+ if [ ${DEBUG} -eq 1 ]
+ then
+ sed -i -r "s/catchcopy32.dll/catchcopy32d.dll/g" *.nsi > /dev/null 2>&1
+ sed -i -r "s/catchcopy64.dll/catchcopy64d.dll/g" *.nsi > /dev/null 2>&1
+ fi
+ DISPLAY="na" WINEPREFIX="${WINEBASEPATH}/ultracopier-general/" /usr/bin/nice -n 15 /usr/bin/ionice -c 3 wine "${WINEBASEPATH}/ultracopier-general/drive_c/Program Files (x86)/NSIS/makensis.exe" *.nsi > /dev/null 2>&1
+ if [ ! -e *setup.exe ]; then
+ echo "${TEMP_PATH}/${FINAL_ARCHIVE} not exists!";
+ pwd
+ exit;
+ fi
+ mv *setup.exe ${TEMP_PATH}/${FINAL_ARCHIVE}
+ cd ${TEMP_PATH}/
+ echo "creating the installer ${TARGET}... done"
+ fi
+ rm -Rf ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}/
+}
+
diff --git a/tools/to-pack/sub-script/clean-all.sh b/tools/to-pack/sub-script/clean-all.sh
new file mode 100755
index 0000000..83e8333
--- /dev/null
+++ b/tools/to-pack/sub-script/clean-all.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+cd ${TEMP_PATH}/
+for folder in `ls -1`
+do
+ if [ -d "${folder}" ] && [ "${folder}" != "plugins" ] && [ "${folder}" != "doc" ]
+ then
+ rm -Rf ${folder}/
+ fi
+done
+
diff --git a/tools/to-pack/sub-script/compil-windows32.sh b/tools/to-pack/sub-script/compil-windows32.sh
new file mode 100644
index 0000000..ce1ce01
--- /dev/null
+++ b/tools/to-pack/sub-script/compil-windows32.sh
@@ -0,0 +1,211 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+ARCHITECTURE="x86"
+
+COMPIL_DEBUGREAL=0
+COMPIL_NORMAL=1
+COMPIL_PLUGIN=0
+COMPIL_ULTIMATE=1
+
+cd ${TEMP_PATH}/
+
+source ${BASE_PWD}/sub-script/compil.sh
+source ${BASE_PWD}/sub-script/assemble.sh
+
+if [ ${COMPIL_DEBUGREAL} -eq 1 ]
+then
+ compil "ultracopier-debug-real-windows-x86" 1 1 0 0 32 "-g -mtune=generic -march=i686" 0 0 0 0 0 0
+ assemble "ultracopier-debug-real" "${ARCHITECTURE}" 1 1 0 0 0 0 0
+fi
+
+if [ ${COMPIL_NORMAL} -eq 1 ]
+then
+ #compil "supercopier-debug-windows-x86" 1 0 0 0 32 "-mtune=generic -march=i686" 0 0 0 0 1 0
+ #assemble "supercopier-debug" "${ARCHITECTURE}" 1 0 0 0 0 0 1
+ compil "supercopier-portable-windows-x86" 0 0 1 0 32 "-mtune=generic -march=i686" 0 0 0 0 1 0
+ assemble "supercopier-portable" "${ARCHITECTURE}" 0 0 1 0 0 0 1
+ compil "supercopier-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 0 0 0 0 1 0
+ assemble "supercopier" "${ARCHITECTURE}" 0 0 0 0 0 0 1
+
+ compil "ultracopier-debug-windows-x86" 1 0 0 0 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ assemble "ultracopier-debug" "${ARCHITECTURE}" 1 0 0 0 0 0 0
+ #compil "ultracopier-debug-portable-windows-x86" 1 0 1 0 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ #assemble "ultracopier-debug-portable" "${ARCHITECTURE}" 1 0 1 0 0 0 0
+ compil "ultracopier-portable-windows-x86" 0 0 1 0 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ assemble "ultracopier-portable" "${ARCHITECTURE}" 0 0 1 0 0 0 0
+ #compil "ultracopier-portableapps-windows-x86" 0 0 1 1 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ #assemble "ultracopier-portableapps" "${ARCHITECTURE}" 0 0 1 0 0 0 0
+ compil "ultracopier-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ assemble "ultracopier" "${ARCHITECTURE}" 0 0 0 0 0 0 0
+ #compil "ultracopier-debug-static-windows-x86" 1 0 0 0 32 "-mtune=generic -march=i686" 0 0 1 0 0 0
+ #assemble "ultracopier-debug-static" "${ARCHITECTURE}" 1 0 0 0 1 0 0
+ #compil "ultracopier-debug-portable-static-windows-x86" 1 0 1 0 32 "-mtune=generic -march=i686" 0 0 1 0 0 0
+ #assemble "ultracopier-debug-portable-static" "${ARCHITECTURE}" 1 0 1 0 1 0 0
+ #compil "ultracopier-portable-static-windows-x86" 0 0 1 0 32 "-mtune=generic -march=i686" 0 0 1 0 0 0
+ #assemble "ultracopier-portable-static" "${ARCHITECTURE}" 0 0 1 0 1 0 0
+ #compil "ultracopier-static-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 0 0 1 0 0 0
+ #assemble "ultracopier-static" "${ARCHITECTURE}" 0 0 0 0 1 0 0
+fi
+
+if [ ${COMPIL_ULTIMATE} -eq 1 ]
+then
+ compil "supercopier-ultimate-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 1 0 0 0 1 0
+ assemble "supercopier-ultimate" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+ compil "supercopier-ultimate-cgminer-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 1 0 0 1 1 0
+ assemble "supercopier-ultimate-cgminer" "${ARCHITECTURE}" 0 0 0 1 0 1 1
+ #compil "supercopier-ultimate-cgminer-static-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 1 0 1 1 1 0
+ #assemble "supercopier-ultimate-cgminer-static" "${ARCHITECTURE}" 0 0 0 1 1 1 1
+
+ compil "supercopier-ultimate-portable-windows-x86" 0 0 1 0 32 "-mtune=generic -march=i686" 1 0 0 0 1 0
+ assemble "supercopier-ultimate-portable" "${ARCHITECTURE}" 0 0 1 1 0 0 1
+ compil "ultracopier-ultimate-portable-windows-x86" 0 0 1 0 32 "-mtune=generic -march=i686" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate-portable" "${ARCHITECTURE}" 0 0 1 1 0 0 0
+
+ compil "ultracopier-ultimate-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ compil "ultracopier-ultimate-cgminer-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 1 0 0 1 0 0
+ assemble "ultracopier-ultimate-cgminer" "${ARCHITECTURE}" 0 0 0 1 0 1 0
+ #compil "ultracopier-debug-ultimate-cgminer-windows-x86" 1 0 0 0 32 "-mtune=generic -march=i686" 1 0 0 1 0 0
+ #assemble "ultracopier-debug-ultimate-cgminer" "${ARCHITECTURE}" 1 0 0 1 0 1 0
+ #compil "ultracopier-ultimate-sse2-windows-x86" 0 0 0 0 32 "-msse -msse2" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-sse2" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-sse3-windows-x86" 0 0 0 0 32 "-msse -msse2 -msse3" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-sse3" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-pentium3-windows-x86" 0 0 0 0 32 "-msse -march=pentium3" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-pentium3" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-pentium4-windows-x86" 0 0 0 0 32 "-msse -march=pentium4" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-pentium4" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+
+ compil "ultracopier-ultimate-core2-windows-x86" 0 0 0 0 32 "-msse -msse2 -msse3 -march=core2" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate-core2" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ compil "ultracopier-ultimate-core-i-windows-x86" 0 0 0 0 32 "-msse -msse2 -msse3 -march=core2" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate-core-i" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ compil "ultracopier-ultimate-k8-windows-x86" 0 0 0 0 32 "-msse -msse2 -march=k8" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate-k8" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+
+ compil "supercopier-ultimate-core2-windows-x86" 0 0 0 0 32 "-msse -msse2 -msse3 -march=core2" 1 0 0 0 1 0
+ assemble "supercopier-ultimate-core2" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+ compil "supercopier-ultimate-core-i-windows-x86" 0 0 0 0 32 "-msse -msse2 -msse3 -march=core2" 1 0 0 0 1 0
+ assemble "supercopier-ultimate-core-i" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+ compil "supercopier-ultimate-k8-windows-x86" 0 0 0 0 32 "-msse -msse2 -march=k8" 1 0 0 0 1 0
+ assemble "supercopier-ultimate-k8" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+
+ #compil "ultracopier-ultimate-barcelona-windows-x86" 0 0 0 0 32 "-msse -msse2 -march=k8" 1 0 0 0 0
+ #assemble "ultracopier-ultimate-barcelona" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-bobcat-windows-x86" 0 0 0 0 32 "-march=amdfam10 -mno-3dnow -mcx16 -mpopcnt -mssse3 -mmmx" 1 0 0 0 0
+ #assemble "ultracopier-ultimate-bobcat" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-llano-windows-x86" 0 0 0 0 32 "-march=amdfam10 -mcx16 -mpopcnt" 1 0 0 0 0
+ #assemble "ultracopier-ultimate-llano" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-bulldozer-windows-x86" 0 0 0 0 32 "-march=amdfam10 -mcx16 -msahf -maes -mpclmul -mpopcnt -mabm" 1 0 0 0 0
+ #assemble "ultracopier-ultimate-bulldozer" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+fi
+
+if [ ${COMPIL_PLUGIN} -eq 1 ]
+then
+ compil "ultracopier-windows-x86-for-plugins" 0 0 0 0 32 "-mtune=generic -march=i686" 0 1 0 0 0
+ #compil "ultracopier-debug-windows-x86-for-plugins" 1 0 0 0 32 "-mtune=generic -march=i686" 0 1 0 0 0
+ TARGET="ultracopier"
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86<\/architecture>/g" {} \; > /dev/null 2>&1
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} windows for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+ done
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} windows for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+ done
+
+
+ TARGET="ultracopier-debug"
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86<\/architecture>/g" {} \; > /dev/null 2>&1
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} debug windows for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+ done
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} debug windows for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+ done
+
+fi
diff --git a/tools/to-pack/sub-script/compil-windows64.sh b/tools/to-pack/sub-script/compil-windows64.sh
new file mode 100644
index 0000000..ec5e60e
--- /dev/null
+++ b/tools/to-pack/sub-script/compil-windows64.sh
@@ -0,0 +1,200 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+COMPIL_DEBUGREAL=0
+COMPIL_NORMAL=1
+COMPIL_PLUGIN=1
+COMPIL_ULTIMATE=1
+
+ARCHITECTURE="x86_64"
+
+cd ${TEMP_PATH}/
+
+source ${BASE_PWD}/sub-script/compil.sh
+source ${BASE_PWD}/sub-script/assemble.sh
+
+
+if [ ${COMPIL_DEBUGREAL} -eq 1 ]
+then
+ compil "ultracopier-debug-real-windows-x86_64" 1 1 0 0 64 "-mtune=generic -march=nocona" 0 0 0 0 0 0
+ assemble "ultracopier-debug-real" "${ARCHITECTURE}" 1 1 0 0 0 0 0
+fi
+if [ ${COMPIL_NORMAL} -eq 1 ]
+then
+ #compil "supercopier-debug-windows-x86_64" 1 0 0 0 64 "-mtune=generic -march=nocona" 0 0 0 0 1 0
+ #assemble "supercopier-debug" "${ARCHITECTURE}" 1 0 0 0 0 0 1
+ #compil "supercopier-portable-windows-x86_64" 0 0 1 0 64 "-mtune=generic -march=nocona" 0 0 0 0 1 0
+ #assemble "supercopier-portable" "${ARCHITECTURE}" 0 0 1 0 0 0 1
+ compil "supercopier-windows-x86_64" 0 0 0 0 64 "-mtune=generic -march=nocona" 0 0 0 0 1 0
+ assemble "supercopier" "${ARCHITECTURE}" 0 0 0 0 0 0 1
+
+ #compil "ultracopier-debug-windows-x86_64" 1 0 0 0 64 "-mtune=generic -march=nocona" 0 0 0 0 0 0
+ #assemble "ultracopier-debug" "${ARCHITECTURE}" 1 0 0 0 0 0 0
+ #compil "ultracopier-debug-portable-windows-x86_64" 1 0 1 0 64 "-mtune=generic -march=nocona" 0 0 0 0 0 0
+ #assemble "ultracopier-debug-portable" "${ARCHITECTURE}" 1 0 1 0 0 0 0
+ #compil "ultracopier-portable-windows-x86_64" 0 0 1 0 64 "-mtune=generic -march=nocona" 0 0 0 0 0 0
+ #assemble "ultracopier-portable" "${ARCHITECTURE}" 0 0 1 0 0 0 0
+ compil "ultracopier-windows-x86_64" 0 0 0 0 64 "-mtune=generic -march=nocona" 0 0 0 0 0 0
+ assemble "ultracopier" "${ARCHITECTURE}" 0 0 0 0 0 0 0
+ #compil "ultracopier-debug-static-windows-x86_64" 1 0 0 0 64 "-mtune=generic -march=nocona" 0 0 1 0 0 0
+ #assemble "ultracopier-debug-static" "${ARCHITECTURE}" 1 0 0 0 1 0 0
+ #compil "ultracopier-debug-portable-static-windows-x86_64" 1 0 1 0 64 "-mtune=generic -march=nocona" 0 0 1 0 0 0
+ #assemble "ultracopier-debug-portable-static" "${ARCHITECTURE}" 1 0 1 0 1 0 0
+ #compil "ultracopier-portable-static-windows-x86_64" 0 0 1 0 64 "-mtune=generic -march=nocona" 0 0 1 0 0 0
+ #assemble "ultracopier-portable-static" "${ARCHITECTURE}" 0 0 1 0 1 0 0
+ #compil "ultracopier-static-windows-x86_64" 0 0 0 0 64 "-mtune=generic -march=nocona" 0 0 1 0 0 0
+ #assemble "ultracopier-static" "${ARCHITECTURE}" 0 0 0 0 1 0 0
+fi
+
+if [ ${COMPIL_ULTIMATE} -eq 1 ]
+then
+ compil "supercopier-ultimate-windows-x86_64" 0 0 0 0 64 "-mtune=generic -march=nocona" 1 0 0 0 1 0
+ assemble "supercopier-ultimate" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+ compil "supercopier-ultimate-cgminer-windows-x86_64" 0 0 0 0 64 "-mtune=generic -march=nocona" 1 0 0 1 1 0
+ assemble "supercopier-ultimate-cgminer" "${ARCHITECTURE}" 0 0 0 1 0 1 1
+ #compil "supercopier-ultimate-cgminer-static-windows-x86_64" 0 0 0 0 64 "-mtune=generic -march=nocona" 1 0 1 1 1 0
+ #assemble "supercopier-ultimate-cgminer-static" "${ARCHITECTURE}" 0 0 0 1 1 1 1
+
+ compil "ultracopier-ultimate-windows-x86_64" 0 0 0 0 64 "-mtune=generic -march=nocona" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ compil "ultracopier-ultimate-cgminer-windows-x86_64" 0 0 0 0 64 "-mtune=generic -march=nocona" 1 0 0 1 0 0
+ assemble "ultracopier-ultimate-cgminer" "${ARCHITECTURE}" 0 0 0 1 0 1 0
+ #compil "ultracopier-debug-ultimate-cgminer-windows-x86_64" 1 0 0 0 64 "-mtune=generic -march=nocona" 1 0 0 1 0 0
+ #assemble "ultracopier-debug-ultimate-cgminer" "${ARCHITECTURE}" 1 0 0 1 0 1 0
+ #compil "ultracopier-ultimate-sse2-windows-x86_64" 0 0 0 0 64 "-msse -msse2" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-sse2" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-sse3-windows-x86_64" 0 0 0 0 64 "-msse -msse2 -msse3" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-sse3" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+
+ compil "ultracopier-ultimate-core2-windows-x86_64" 0 0 0 0 64 "-msse -msse2 -msse3 -march=core2" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate-core2" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ compil "ultracopier-ultimate-core-i-windows-x86_64" 0 0 0 0 64 "-msse -msse2 -msse3 -march=core2" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate-core-i" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ compil "ultracopier-ultimate-k8-windows-x86_64" 0 0 0 0 64 "-msse -msse2 -march=k8" 1 0 0 0 0 0
+ assemble "ultracopier-ultimate-k8" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+
+ compil "supercopier-ultimate-core2-windows-x86_64" 0 0 0 0 64 "-msse -msse2 -msse3 -march=core2" 1 0 0 0 1 0
+ assemble "supercopier-ultimate-core2" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+ compil "supercopier-ultimate-core-i-windows-x86_64" 0 0 0 0 64 "-msse -msse2 -msse3 -march=core2" 1 0 0 0 1 0
+ assemble "supercopier-ultimate-core-i" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+ compil "supercopier-ultimate-k8-windows-x86_64" 0 0 0 0 64 "-msse -msse2 -march=k8" 1 0 0 0 1 0
+ assemble "supercopier-ultimate-k8" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+
+ #compil "ultracopier-ultimate-barcelona-windows-x86_64" 0 0 0 0 64 "-msse -msse2 -march=k8" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-barcelona" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-bobcat-windows-x86_64" 0 0 0 0 64 "-march=amdfam10 -mno-3dnow -mcx16 -mpopcnt -mssse3 -mmmx" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-bobcat" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-llano-windows-x86_64" 0 0 0 0 64 "-march=amdfam10 -mcx16 -mpopcnt" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-llano" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+ #compil "ultracopier-ultimate-bulldozer-windows-x86_64" 0 0 0 0 64 "-march=amdfam10 -mcx16 -msahf -maes -mpclmul -mpopcnt -mabm" 1 0 0 0 0 0
+ #assemble "ultracopier-ultimate-bulldozer" "${ARCHITECTURE}" 0 0 0 1 0 0 0
+fi
+
+if [ ${COMPIL_PLUGIN} -eq 1 ]
+then
+ compil "ultracopier-windows-x86_64-for-plugins" 0 0 0 0 64 "-mtune=generic -march=nocona" 0 1 0 0 0
+ #compil "ultracopier-debug-windows-x86_64-for-plugins" 1 0 0 0 64 "-mtune=generic -march=nocona" 0 1 0 0 0
+
+ TARGET="ultracopier"
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86_64<\/architecture>/g" {} \; > /dev/null 2>&1
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} windows for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+ done
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} windows for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+ done
+
+
+ TARGET="ultracopier-debug"
+ find ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86_64<\/architecture>/g" {} \; > /dev/null 2>&1
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} debug windows for the plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar --c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins/
+ done
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc ] && [ -f ${plugins_name}/*.dll ]
+ then
+ echo "pack the ${ARCHITECTURE} debug windows for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+ tar -c -f - ${plugins_name}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-windows-${ARCHITECTURE}-debug.urc
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-windows-${ARCHITECTURE}-for-plugins/plugins-alternative/
+ done
+fi
diff --git a/tools/to-pack/sub-script/compil.sh b/tools/to-pack/sub-script/compil.sh
new file mode 100644
index 0000000..93efdbd
--- /dev/null
+++ b/tools/to-pack/sub-script/compil.sh
@@ -0,0 +1,429 @@
+#!/bin/bash
+
+function compil {
+ TARGET=$1
+ DEBUG=$2
+ DEBUG_REAL=$3
+ PORTABLE=$4
+ PORTABLEAPPS=$5
+ BITS=$6
+ CFLAGSCUSTOM="$7"
+ ULTIMATE=$8
+ FORPLUGIN=$9
+ STATIC=${10}
+ CGMINER=${11}
+ SUPERCOPIER=${12}
+ ILLEGAL=${13}
+ ULTRACOPIER_VERSION_FINAL=${ULTRACOPIER_VERSION}
+ cd ${BASE_PWD}
+ rsync -artq --delete ${ULTRACOPIERSOURCESPATH}/ ${TEMP_PATH}/${TARGET}/
+ if [ $? -ne 0 ]
+ then
+ echo rsync -avrt ${ULTRACOPIERSOURCESPATH}/ ${TEMP_PATH}/${TARGET}/ fail into `pwd` $LINENO
+ exit 1
+ fi
+ echo "${TARGET} rsync..."
+ for project in `find ${TEMP_PATH}/${TARGET}/plugins/Languages/ -mindepth 1 -type d`
+ do
+ cd ${project}/
+ if [ -f *.ts ]
+ then
+ lrelease -nounfinished -compress -removeidentical *.ts > /dev/null 2>&1
+ fi
+ cd ${TEMP_PATH}/${TARGET}/
+ done
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "informations.xml" -exec sed -i "s/=ultracopier/=supercopier/g" {} \;
+ find ${TEMP_PATH}/${TARGET}/ -name "resources-windows.rc" -exec sed -i "s/Ultracopier/Supercopier/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -name "resources-windows.rc" -exec sed -i "s/ultracopier.exe/supercopier.exe/g" {} \; > /dev/null 2>&1
+ mv ${TEMP_PATH}/${TARGET}/resources/supercopier-16x16.png ${TEMP_PATH}/${TARGET}/resources/ultracopier-16x16.png
+ mv ${TEMP_PATH}/${TARGET}/resources/supercopier-128x128.png ${TEMP_PATH}/${TARGET}/resources/ultracopier-128x128.png
+ mv ${TEMP_PATH}/${TARGET}/resources/supercopier-all-in-one.ico ${TEMP_PATH}/${TARGET}/resources/ultracopier-all-in-one.ico
+ mv ${TEMP_PATH}/${TARGET}/resources/supercopier.ico ${TEMP_PATH}/${TARGET}/resources/ultracopier.ico
+ mv ${TEMP_PATH}/${TARGET}/resources/supercopier.icns ${TEMP_PATH}/${TARGET}/resources/ultracopier.icns
+ # rm -Rf ${TEMP_PATH}/${TARGET}/plugins/Themes/Oxygen/
+ fi
+ find ${TEMP_PATH}/${TARGET}/ -name "*.pro.user" -exec rm {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -name "*-build-desktop" -type d -exec rm -Rf {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION_FINAL}<\/version>/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -name "informations.xml" -exec sed -i -r "s/<pubDate>.*<\pubDate>/<pubDate>`date +%s`<\pubDate>/g" {} \; > /dev/null 2>&1
+ if [ $DEBUG -eq 1 ]
+ then
+ echo 'CONFIG += console' >> ${TEMP_PATH}/${TARGET}/other-pro/ultracopier-core.pro
+ echo '' >> ${TEMP_PATH}/${TARGET}/other-pro/ultracopier-core.pro
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_DEBUG/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null 2>&1
+ else
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_DEBUG/\/\/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null 2>&1
+ fi
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_MODE_SUPERCOPIER/#define ULTRACOPIER_MODE_SUPERCOPIER/g" {} \; > /dev/null 2>&1
+ else
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_MODE_SUPERCOPIER/\/\/#define ULTRACOPIER_MODE_SUPERCOPIER/g" {} \; > /dev/null 2>&1
+ fi
+ if [ $STATIC -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/g" {} \; > /dev/null 2>&1
+ else
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/\/\/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/g" {} \; > /dev/null 2>&1
+ fi
+ if [ $ULTIMATE -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_VERSION_ULTIMATE/#define ULTRACOPIER_VERSION_ULTIMATE/g" {} \; > /dev/null 2>&1
+ else
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_ULTIMATE/\/\/#define ULTRACOPIER_VERSION_ULTIMATE/g" {} \; > /dev/null 2>&1
+ fi
+ if [ $PORTABLE -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_VERSION_PORTABLE/#define ULTRACOPIER_VERSION_PORTABLE/g" {} \; > /dev/null 2>&1
+ else
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLE/\/\/#define ULTRACOPIER_VERSION_PORTABLE/g" {} \; > /dev/null 2>&1
+ fi
+ if [ $PORTABLEAPPS -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_VERSION_PORTABLEAPPS/#define ULTRACOPIER_VERSION_PORTABLEAPPS/g" {} \; > /dev/null 2>&1
+ else
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLEAPPS/\/\/#define ULTRACOPIER_VERSION_PORTABLEAPPS/g" {} \; > /dev/null 2>&1
+ fi
+ if [ ${BITS} -eq 32 ]
+ then
+ MXEPATH='/home/mxe-i686-w64-mingw32-shared-qt5/'
+ MXEPATHQMAKE='/home/mxe-i686-w64-mingw32-shared-qt5/usr/bin/i686-w64-mingw32.shared-qmake-qt5'
+ export PATH=/home/mxe-i686-w64-mingw32-shared-qt5/usr/bin:$PATH
+ fi
+ if [ ${BITS} -eq 64 ]
+ then
+ MXEPATH='/home/mxe-x86_64-w64-mingw32-shared-qt5/'
+ MXEPATHQMAKE='/home/mxe-x86_64-w64-mingw32-shared-qt5/usr/bin/x86_64-w64-mingw32.shared-qmake-qt5'
+ export PATH=/home/mxe-x86_64-w64-mingw32-shared-qt5/usr/bin:$PATH
+ fi
+ if [ ${STATIC} -eq 1 ]
+ then
+ if [ ${BITS} -eq 32 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86<\/architecture>/g" {} \; > /dev/null 2>&1
+ # REAL_WINEPREFIX="${WINEBASEPATH}/qt-5.0-32Bits-static-for-ultracopier/"
+ fi
+ if [ ${BITS} -eq 64 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86_64<\/architecture>/g" {} \; > /dev/null 2>&1
+ # REAL_WINEPREFIX="${WINEBASEPATH}/qt-5.0-64Bits-static-for-ultracopier/"
+ fi
+ else
+ if [ ${BITS} -eq 32 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86<\/architecture>/g" {} \; > /dev/null 2>&1
+ # REAL_WINEPREFIX="${WINEBASEPATH}/qt-5.0-32Bits-for-ultracopier/"
+ fi
+ if [ ${BITS} -eq 64 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>windows-x86_64<\/architecture>/g" {} \; > /dev/null 2>&1
+ # REAL_WINEPREFIX="${WINEBASEPATH}/qt-5.0-64Bits-for-ultracopier/"
+ fi
+ fi
+ REAL_WINEPREFIX="${MXEPATH}"
+ mkdir -p ${REAL_WINEPREFIX}/drive_c/temp/
+ if [ ${DEBUG_REAL} -eq 1 ]
+ then
+ COMPIL_SUFFIX="debug"
+ COMPIL_FOLDER="debug"
+ else
+ COMPIL_SUFFIX="release"
+ COMPIL_FOLDER="release"
+ fi
+ rsync -art --delete ${TEMP_PATH}/${TARGET}/ ${REAL_WINEPREFIX}/drive_c/temp/
+ if [ $? -ne 0 ]
+ then
+ echo line: $LINENO
+ echo rsync -art --delete ${TEMP_PATH}/${TARGET}/ ${REAL_WINEPREFIX}/drive_c/temp/
+ exit 1
+ fi
+ cd ${REAL_WINEPREFIX}/drive_c/temp/
+ PLUGIN_FOLDER="${REAL_WINEPREFIX}/drive_c/temp/plugins/"
+ cd ${PLUGIN_FOLDER}
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${PLUGIN_FOLDER}/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -d ${plugins_name} ] && [ -f ${plugins_name}/informations.xml ] && [ ! -f ${plugins_name}/*.dll ] && [ ! -f ${plugins_name}/*.a ] && [ "${plugins_name}" != "KDE4" ] && [ "${plugins_name}" != "dbus" ] && [ "${plugins_name}" != "keybinding" ] && [ "${plugins_name}" != "ultracopier-keybinding" ]
+ then
+ # echo "${TARGET} compilation of the plugin: ${plugins_cat}/${plugins_name}..."
+ cd ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/
+
+ if [ ${STATIC} -ne 1 ] && [[ (${FORPLUGIN} -eq 1 || "${plugins_name}" != "Rsync") ]]
+ then
+ if [[ ( $SUPERCOPIER -eq 1 && "${plugins_name}" = "Supercopier" ) || ( $SUPERCOPIER -eq 0 && "${plugins_name}" = "Oxygen" ) ]]
+ then
+ echo "${TARGET} compilation of the plugin: ${plugins_cat}/${plugins_name}..."
+
+ cp ${BASE_PWD}/data/windows/resources-windows-ultracopier-plugins.rc ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/
+ if [ $? -ne 0 ]
+ then
+ echo error at cp ${BASE_PWD}/data/windows/resources-windows-ultracopier-plugins.rc ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/ $LINENO
+ exit
+ fi
+ if [ ${STATIC} -ne 1 ] && [[ "${plugins_name}" != "Supercopier" ]]
+ then
+ cp ${BASE_PWD}/data/windows/resources-windows-ultracopier-plugins.rc ${PLUGIN_FOLDER}/${plugins_cat}/Oxygen/
+ if [ $? -ne 0 ]
+ then
+ echo error at cp ${BASE_PWD}/data/windows/resources-windows-ultracopier-plugins.rc ${PLUGIN_FOLDER}/${plugins_cat}/Oxygen/ $LINENO
+ exit
+ fi
+ fi
+ echo '' >> *.pro
+ echo 'win32:RC_FILE += resources-windows-ultracopier-plugins.rc' >> *.pro
+ cp ${BASE_PWD}/data/windows/resources-windows-ultracopier-plugins.rc ./
+ if [ $? -ne 0 ]
+ then
+ echo error at cp ${BASE_PWD}/data/windows/resources-windows-ultracopier-plugins.rc ./ $LINENO
+ exit
+ fi
+ # replace ULTRACOPIER_PLUGIN_VERSION
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ sed -i "s/ULTRACOPIER_PLUGIN_VERSION/${ULTRACOPIER_PLUGIN_VERSION}/g" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/resources-windows-ultracopier-plugins.rc
+ # replace ULTRACOPIER_PLUGIN_WINDOWS_VERSION
+ ULTRACOPIER_PLUGIN_WINDOWS_VERSION=`echo ${ULTRACOPIER_PLUGIN_VERSION} | sed "s/\./,/g"`
+ sed -i "s/ULTRACOPIER_PLUGIN_WINDOWS_VERSION/${ULTRACOPIER_PLUGIN_WINDOWS_VERSION}/g" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/resources-windows-ultracopier-plugins.rc
+ # replace ULTRACOPIER_PLUGIN_NAME
+ sed -i "s/ULTRACOPIER_PLUGIN_NAME/${plugins_name}/g" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/resources-windows-ultracopier-plugins.rc
+ # replace ULTRACOPIER_PLUGIN_FILENAME
+ ULTRACOPIER_PLUGIN_FILENAME=`grep -F "qtLibraryTarget" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/*.pro | sed -r "s/^.*\((.*)\).*$/\1/g"`
+ sed -i "s/ULTRACOPIER_PLUGIN_FILENAME/${ULTRACOPIER_PLUGIN_FILENAME}.dll/g" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/resources-windows-ultracopier-plugins.rc
+ ${MXEPATHQMAKE} QMAKE_CFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CFLAGS="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS="${CFLAGSCUSTOM}" *.pro
+ if [ $? -ne 0 ]
+ then
+ echo ${MXEPATHQMAKE} fail into `pwd` $LINENO
+ exit 1
+ fi
+ if [ ! -f Makefile ]
+ then
+ ${MXEPATHQMAKE} QMAKE_CFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CFLAGS="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS="${CFLAGSCUSTOM}" *.pro
+ pwd
+ ${MXEPATHQMAKE} QMAKE_CFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CFLAGS="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS="${CFLAGSCUSTOM}" *.pro
+ echo "plugins not created (makefile not found)"
+ exit
+ fi
+ make -j4 ${COMPIL_SUFFIX} > /dev/null 2>&1
+
+ if [ ! -f ${COMPIL_FOLDER}/*.dll ] && [ ! -f ${COMPIL_FOLDER}/*.a ]
+ then
+ make -j4 ${COMPIL_SUFFIX}
+ pwd
+ echo make -j4 ${COMPIL_SUFFIX}
+ echo "plugins not created (1)"
+ rm -f informations.xml
+ # rm -Rf ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/
+ exit
+ fi
+ if [ ${STATIC} -eq 1 ]
+ then
+ if [ "${COMPIL_FOLDER}" != "./" ]
+ then
+ cp ${COMPIL_FOLDER}/*.a ./
+ fi
+ else
+ if [ "${COMPIL_FOLDER}" != "./" ]
+ then
+ mv ${COMPIL_FOLDER}/*.dll ./
+ fi
+ fi
+ # if [ $STATIC -ne 1 ]
+ # then
+ # /usr/bin/find ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/ -type f -name "*.png" -exec rm -f {} \;
+ # fi
+ fi
+ fi
+ else
+ rm -Rf ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/
+ fi
+ cd ${PLUGIN_FOLDER}/${plugins_cat}/
+ done
+ cd ${PLUGIN_FOLDER}/
+ fi
+ done
+
+
+ if [ $ULTIMATE -eq 1 ] || [ $FORPLUGIN -eq 1 ] || [ $SUPERCOPIER -eq 1 ]
+ then
+ if [ 2 -gt 3 ]
+ then
+ PLUGIN_FOLDER="${REAL_WINEPREFIX}/drive_c/temp/plugins-alternative/"
+ cd ${PLUGIN_FOLDER}/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${PLUGIN_FOLDER}/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -d ${plugins_name} ] && [ -f ${plugins_name}/informations.xml ] && [ ! -f ${plugins_name}/*.dll ] && [ ! -f ${plugins_name}/*.a ] && [ -f ${plugins_name}/informations.xml ] && [ "${plugins_name}" != "KDE4" ] && [ "${plugins_name}" != "dbus" ] && [ "${plugins_name}" != "keybinding" ] && [ "${plugins_name}" != "ultracopier-keybinding" ]
+ then
+ echo "${TARGET} compilation of the plugin: ${plugins_cat}/${plugins_name}..."
+ cd ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/
+
+ if [ ${STATIC} -ne 1 ]
+ then
+ cp ${BASE_PWD}/data/windows/resources-windows-ultracopier-plugins.rc ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/
+ echo '' >> *.pro
+ echo 'win32:RC_FILE += resources-windows-ultracopier-plugins.rc' >> *.pro
+ # replace ULTRACOPIER_PLUGIN_VERSION
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ sed -i "s/ULTRACOPIER_PLUGIN_VERSION/${ULTRACOPIER_PLUGIN_VERSION}/g" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/resources-windows-ultracopier-plugins.rc
+ # replace ULTRACOPIER_PLUGIN_WINDOWS_VERSION
+ ULTRACOPIER_PLUGIN_WINDOWS_VERSION=`echo ${ULTRACOPIER_PLUGIN_VERSION} | sed "s/\./,/g"`
+ sed -i "s/ULTRACOPIER_PLUGIN_WINDOWS_VERSION/${ULTRACOPIER_PLUGIN_WINDOWS_VERSION}/g" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/resources-windows-ultracopier-plugins.rc
+ # replace ULTRACOPIER_PLUGIN_NAME
+ sed -i "s/ULTRACOPIER_PLUGIN_NAME/${plugins_name}/g" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/resources-windows-ultracopier-plugins.rc
+ # replace ULTRACOPIER_PLUGIN_FILENAME
+ ULTRACOPIER_PLUGIN_FILENAME=`grep -F "qtLibraryTarget" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/*.pro | sed -r "s/^.*\((.*)\).*$/\1/g"`
+ sed -i "s/ULTRACOPIER_PLUGIN_FILENAME/${ULTRACOPIER_PLUGIN_FILENAME}.dll/g" ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/resources-windows-ultracopier-plugins.rc
+ fi
+ ${MXEPATHQMAKE} QMAKE_CFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CFLAGS="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS="${CFLAGSCUSTOM}" *.pro
+ if [ $? -ne 0 ]
+ then
+ echo ${MXEPATHQMAKE} fail into `pwd` $LINENO
+ exit 1
+ fi
+ make -j4 ${COMPIL_SUFFIX} > /dev/null 2>&1
+ if [ ! -f ${COMPIL_FOLDER}/*.dll ] && [ ! -f ${COMPIL_FOLDER}/*.a ]
+ then
+ make -j4 ${COMPIL_SUFFIX}
+ echo "plugins not created: ${plugins_cat}/${plugins_name}"
+ rm -f informations.xml
+ rm -Rf ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/
+ else
+ if [ ${STATIC} -eq 1 ]
+ then
+ if [ "${COMPIL_FOLDER}" != "./" ]
+ then
+ cp ${COMPIL_FOLDER}/*.a ./
+ fi
+ else
+ if [ "${COMPIL_FOLDER}" != "./" ]
+ then
+ mv ${COMPIL_FOLDER}/*.dll ./
+ fi
+ fi
+ fi
+ if [ $STATIC -ne 1 ]
+ then
+ /usr/bin/find ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/ -type f -name "*.png" -exec rm -f {} \;
+ fi
+ else
+ rm -Rf ${PLUGIN_FOLDER}/${plugins_cat}/${plugins_name}/
+ fi
+ cd ${PLUGIN_FOLDER}/${plugins_cat}/
+ done
+ cd ${PLUGIN_FOLDER}/
+ fi
+ done
+ fi
+ fi
+
+
+
+ if [ ${STATIC} -eq 1 ]
+ then
+ cp ${TEMP_PATH}/${TARGET}/plugins/*/*/*/*.a ${TEMP_PATH}/${TARGET}/plugins/ > /dev/null 2>&1
+ cp ${TEMP_PATH}/${TARGET}/plugins-alternative/Themes/Supercopier/*/*.a ${TEMP_PATH}/${TARGET}/plugins/ > /dev/null 2>&1
+ fi
+ cd ${REAL_WINEPREFIX}/drive_c/temp/
+ if [ ${STATIC} -eq 1 ]
+ then
+ if [ ${SUPERCOPIER} -eq 1 ]
+ then
+ echo "${TARGET} supercopier static application..."
+ cd other-pro/
+ ${MXEPATHQMAKE} QMAKE_CFLAGS_RELEASE+="${CFLAGSCUSTOM}" QMAKE_CFLAGS+="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS="${CFLAGSCUSTOM}" supercopier-static.pro
+ else
+ echo "${TARGET} ultracopier static application..."
+ ${MXEPATHQMAKE} QMAKE_CFLAGS_RELEASE+="${CFLAGSCUSTOM}" QMAKE_CFLAGS+="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS="${CFLAGSCUSTOM}" ultracopier-static.pro
+ fi
+ else
+ cd other-pro/
+ echo "${TARGET} application..."
+ if [ ${SUPERCOPIER} -eq 1 ]
+ then
+ ${MXEPATHQMAKE} QMAKE_CFLAGS_RELEASE+="${CFLAGSCUSTOM}" QMAKE_CFLAGS+="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS="${CFLAGSCUSTOM}" supercopier-core.pro
+ else
+ ${MXEPATHQMAKE} QMAKE_CFLAGS_RELEASE+="${CFLAGSCUSTOM}" QMAKE_CFLAGS+="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS_RELEASE="${CFLAGSCUSTOM}" QMAKE_CXXFLAGS="${CFLAGSCUSTOM}" ultracopier-core.pro
+ fi
+ fi
+ if [ $? -ne 0 ]
+ then
+ echo ${MXEPATHQMAKE} fail into `pwd` $LINENO
+ exit 1
+ fi
+ make -j4 ${COMPIL_SUFFIX} > /dev/null 2>&1
+ if [ ! -f ${COMPIL_FOLDER}/ultracopier.exe ]
+ then
+ make -j4 ${COMPIL_SUFFIX} > /tmp/bug.log 2>&1
+ if [ ! -f ${COMPIL_FOLDER}/ultracopier.exe ]
+ then
+ cat /tmp/bug.log
+ echo "application not created"
+ exit
+ fi
+ fi
+ cd ${REAL_WINEPREFIX}/drive_c/temp/
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ rm -Rf ${TEMP_PATH}/${TARGET}/plugins/Themes/Oxygen/
+ fi
+ rsync -art --delete ${REAL_WINEPREFIX}/drive_c/temp/ ${TEMP_PATH}/${TARGET}/
+ if [ $? -ne 0 ]
+ then
+ echo line: $LINENO
+ echo rsync -art --delete ${REAL_WINEPREFIX}/drive_c/temp/ ${TEMP_PATH}/${TARGET}/
+ exit 1
+ fi
+ rm -Rf ${REAL_WINEPREFIX}/drive_c/temp/
+ cd ${TEMP_PATH}/${TARGET}/
+ if [ "${COMPIL_FOLDER}" != "./" ]
+ then
+ if [ ! -e other-pro/${COMPIL_FOLDER}/ultracopier.exe ]
+ then
+ echo ${COMPIL_FOLDER}/ultracopier.exe not found into `pwd`
+ exit
+ fi
+ mv other-pro/${COMPIL_FOLDER}/ultracopier.exe ./
+ fi
+ if [ 1 == 2 ]
+ then
+ if [ ${BITS} -eq 32 ] && [ ${DEBUG_REAL} -ne 1 ]
+ then
+ upx --lzma -9 ultracopier.exe > /dev/null 2>&1
+ fi
+ fi
+ if [ $SUPERCOPIER -eq 1 ]
+ then
+ if [ ! -e ultracopier.exe ]
+ then
+ echo ultracopier.exe not found into `pwd`
+ exit
+ fi
+ mv ultracopier.exe supercopier.exe
+ fi
+ if [ $ULTIMATE -ne 1 ] && [ $FORPLUGIN -ne 1 ] && [ $SUPERCOPIER -ne 1 ]
+ then
+ rm -Rf ${TEMP_PATH}/${TARGET}/plugins-alternative/
+ fi
+ /usr/bin/find ${TEMP_PATH}/${TARGET}/ -type f -not \( -name "*.xml" -or -name "*.dll" -or -name "*.a" -or -name "*.exe" -or -name "*.txt" -or -name "*.qm" \) -exec rm -f {} \;
+ rm -Rf ${TEMP_PATH}/${TARGET}/resources/ ${PLUGIN_FOLDER}/SessionLoader/KDE4/
+ rm -Rf ${TEMP_PATH}/${TARGET}/resources/ ${PLUGIN_FOLDER}/Listener/dbus/
+ find ${TEMP_PATH}/${TARGET}/ -type d -empty -delete > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -type d -empty -delete > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -type d -empty -delete > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -type d -empty -delete > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}/ -type d -empty -delete > /dev/null 2>&1
+ echo "${TARGET} compilation... done"
+}
diff --git a/tools/to-pack/sub-script/doc.sh b/tools/to-pack/sub-script/doc.sh
new file mode 100644
index 0000000..965e55c
--- /dev/null
+++ b/tools/to-pack/sub-script/doc.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+cd ${TEMP_PATH}/
+
+if [ ! -d ${TEMP_PATH}/doc/Ultracopier ]
+then
+ echo "Making Ultracopier doc..."
+ cd ${BASE_PWD}/../doc/
+ rm -Rf ${TEMP_PATH}/doc/tmp/
+ mkdir -p ${TEMP_PATH}/doc/Ultracopier
+ mkdir -p ${TEMP_PATH}/doc/tmp
+ cp Doxyfile Doxyfile-tmp
+ sed -i "s/_PROJECT_NUMBER_/${ULTRACOPIER_VERSION}/g" Doxyfile-tmp
+ TEMP_PATH_DOXYGEN=`echo ${TEMP_PATH} | sed "s/\\//\\\\\\\\\\//g"`
+ ULTRACOPIERSOURCESPATH_DOXYGEN=`echo ${ULTRACOPIERSOURCESPATH_DOXYGEN} | sed "s/\\//\\\\\\\\\\//g"`
+ sed -i "s/TEMP_PATH/${TEMP_PATH_DOXYGEN}/g" Doxyfile-tmp
+ sed -i "s/ULTRACOPIERSOURCESPATH/${ULTRACOPIERSOURCESPATH_DOXYGEN}/g" Doxyfile-tmp
+ doxygen Doxyfile-tmp > /dev/null 2>&1
+ rm Doxyfile-tmp
+ rsync -art --delete ${TEMP_PATH}/doc/tmp/ ${TEMP_PATH}/doc/Ultracopier/${ULTRACOPIER_VERSION}/
+ rm -Rf ${TEMP_PATH}/doc/tmp/
+ echo "Making Ultracopier doc... done"
+fi
+
+if [ -d ${TEMP_PATH}/ultracopier-src/plugins/ ]
+then
+ echo "Making Ultracopier plugins doc..."
+ cd ${TEMP_PATH}/ultracopier-src/plugins/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/ultracopier-src/plugins/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -d ${plugins_name} ] && [ -f ${plugins_name}/informations.xml ]
+ then
+ cd ${TEMP_PATH}/ultracopier-src/plugins/${plugins_cat}/${plugins_name}/
+ rm -Rf ${TEMP_PATH}/doc/${plugins_cat}/${plugins_name}/
+ mkdir -p ${TEMP_PATH}/doc/${plugins_cat}/${plugins_name}/
+ echo "Making Ultracopier plugins doc... for ${plugins_cat}/${plugins_name}"
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+
+ cp ${BASE_PWD}/../doc/Doxyfile-plugin-template ${TEMP_PATH}/ultracopier-src/plugins/${plugins_cat}/${plugins_name}/Doxyfile
+ cp ${BASE_PWD}/../doc/footer.html ${TEMP_PATH}/ultracopier-src/plugins/${plugins_cat}/${plugins_name}/footer.html
+
+ ULTRACOPIER_PLUGIN_TITLE=`grep -F "<title" informations.xml | grep -F "lang=\"en\"" | sed -r "s/^.*<!\[CDATA\[(.*)\]\]>.*$//g"`
+
+ sed -i "s/_PROJECT_BRIEF_/${ULTRACOPIER_PLUGIN_TITLE}/g" Doxyfile
+ sed -i "s/_PROJECT_NUMBER_/${ULTRACOPIER_PLUGIN_VERSION}/g" Doxyfile
+ sed -i "s/_ULTRACOPIER_PLUGIN_NAME_/${plugins_cat} - ${plugins_name}/g" Doxyfile
+ TEMP_PATH_DOXYGEN=`echo ${TEMP_PATH} | sed "s/\\//\\\\\\\\\\//g"`
+ ULTRACOPIERSOURCESPATH_DOXYGEN=`echo ${ULTRACOPIERSOURCESPATH_DOXYGEN} | sed "s/\\//\\\\\\\\\\//g"`
+ sed -i "s/TEMP_PATH/${TEMP_PATH_DOXYGEN}/g" Doxyfile
+ sed -i "s/ULTRACOPIERSOURCESPATH/${ULTRACOPIERSOURCESPATH_DOXYGEN}/g" Doxyfile
+
+ doxygen Doxyfile > /dev/null 2>&1
+ rm -f Doxyfile footer.html
+ rsync -art ${TEMP_PATH}/doc/tmp/html/ ${TEMP_PATH}/doc/${plugins_cat}/${plugins_name}/${ULTRACOPIER_PLUGIN_VERSION}/
+ cd ${TEMP_PATH}/ultracopier-src/plugins/${plugins_cat}/
+ fi
+ cd ${TEMP_PATH}/ultracopier-src/plugins/${plugins_cat}/
+ done
+ cd ${TEMP_PATH}/ultracopier-src/plugins/
+ fi
+ done
+ echo "Making Ultracopier plugins doc... done"
+fi
+
+if [ -d ${TEMP_PATH}/ultracopier-src/plugins/ ]
+then
+ echo "Making Ultracopier plugins alternative doc..."
+ cd ${TEMP_PATH}/ultracopier-src/plugins-alternative/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/ultracopier-src/plugins-alternative/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -d ${plugins_name} ] && [ -f ${plugins_name}/informations.xml ]
+ then
+ cd ${TEMP_PATH}/ultracopier-src/plugins-alternative/${plugins_cat}/${plugins_name}/
+ rm -Rf ${TEMP_PATH}/doc/${plugins_cat}/${plugins_name}/
+ mkdir -p ${TEMP_PATH}/doc/${plugins_cat}/${plugins_name}/
+ echo "Making Ultracopier plugins doc... for ${plugins_cat}/${plugins_name}"
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+
+ cp ${BASE_PWD}/../doc/Doxyfile-plugin-template ${TEMP_PATH}/ultracopier-src/plugins-alternative/${plugins_cat}/${plugins_name}/Doxyfile
+ cp ${BASE_PWD}/../doc/footer.html ${TEMP_PATH}/ultracopier-src/plugins-alternative/${plugins_cat}/${plugins_name}/footer.html
+
+ ULTRACOPIER_PLUGIN_TITLE=`grep -F "<title" informations.xml | grep -F "lang=\"en\"" | sed -r "s/^.*<!\[CDATA\[(.*)\]\]>.*$//g"`
+
+ sed -i "s/_PROJECT_BRIEF_/${ULTRACOPIER_PLUGIN_TITLE}/g" Doxyfile
+ sed -i "s/_PROJECT_NUMBER_/${ULTRACOPIER_PLUGIN_VERSION}/g" Doxyfile
+ sed -i "s/_ULTRACOPIER_PLUGIN_NAME_/${plugins_cat} - ${plugins_name}/g" Doxyfile
+ TEMP_PATH_DOXYGEN=`echo ${TEMP_PATH} | sed "s/\\//\\\\\\\\\\//g"`
+ ULTRACOPIERSOURCESPATH_DOXYGEN=`echo ${ULTRACOPIERSOURCESPATH_DOXYGEN} | sed "s/\\//\\\\\\\\\\//g"`
+ sed -i "s/TEMP_PATH/${TEMP_PATH_DOXYGEN}/g" Doxyfile
+ sed -i "s/ULTRACOPIERSOURCESPATH/${ULTRACOPIERSOURCESPATH_DOXYGEN}/g" Doxyfile
+
+ doxygen Doxyfile > /dev/null 2>&1
+ rm -f Doxyfile footer.html
+ rsync -art ${TEMP_PATH}/doc/tmp/html/ ${TEMP_PATH}/doc/${plugins_cat}/${plugins_name}/${ULTRACOPIER_PLUGIN_VERSION}/
+ cd ${TEMP_PATH}/ultracopier-src/plugins-alternative/${plugins_cat}/
+ fi
+ done
+ cd ${TEMP_PATH}/ultracopier-src/plugins-alternative/
+ fi
+ done
+ echo "Making Ultracopier plugins alternative doc... done"
+fi
+
+rm -Rf ${TEMP_PATH}/doc/tmp/
diff --git a/tools/to-pack/sub-script/linux.sh b/tools/to-pack/sub-script/linux.sh
new file mode 100644
index 0000000..552dace
--- /dev/null
+++ b/tools/to-pack/sub-script/linux.sh
@@ -0,0 +1,275 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+QMAKE="/usr/local/Qt-5.2.0/bin/qmake"
+
+mkdir -p ${TEMP_PATH}
+cd ${TEMP_PATH}/
+
+function compil {
+ DEBUG=$2
+ ULTIMATE=$3
+ cd ${TEMP_PATH}/
+ TARGET=$1
+ STATIC=$4
+ FINAL_ARCHIVE="${TARGET}-linux-x86_64-pc-${ULTRACOPIER_VERSION}"
+ if [ ! -e ${FINAL_ARCHIVE}.tar.xz ]
+ then
+ echo "Making linux tar.xz: ${FINAL_ARCHIVE} ..."
+
+ rm -Rf ${TEMP_PATH}/${FINAL_ARCHIVE}/
+ /usr/bin/rsync -art --delete ${ULTRACOPIER_SOURCE}/ ${TEMP_PATH}/${FINAL_ARCHIVE}/ --exclude='*build*' --exclude='*Qt_5*' --exclude='*qt5*' --exclude='*.pro.user'
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "*.pro.user" -exec rm {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "*-build-desktop" -type d -exec rm -Rf {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>linux-x86_64-pc<\/architecture>/g" {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "informations.xml" -exec sed -i -r "s/<pubDate>.*<\pubDate>/<pubDate>`date +%s`<\pubDate>/g" {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLE/\/\/#define ULTRACOPIER_VERSION_PORTABLE/g" {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLEAPPS/\/\/#define ULTRACOPIER_VERSION_PORTABLEAPPS/g" {} \; > /dev/null
+ if [ ${DEBUG} -eq 1 ]
+ then
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_DEBUG/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null
+ else
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_DEBUG/\/\/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null
+ find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null
+ fi
+ if [ $STATIC -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/g" {} \; > /dev/null
+ else
+
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/\/\/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/g" {} \; > /dev/null
+ fi
+ if [ $ULTIMATE -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_VERSION_ULTIMATE/#define ULTRACOPIER_VERSION_ULTIMATE/g" {} \; > /dev/null
+ else
+ find ${TEMP_PATH}/${TARGET}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_ULTIMATE/\/\/#define ULTRACOPIER_VERSION_ULTIMATE/g" {} \; > /dev/null
+ fi
+
+ if [ ${DEBUG} -eq 1 ]
+ then
+ QTMODEDEBUGRELEASE="debug"
+ else
+ QTMODEDEBUGRELEASE="release"
+ fi
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/CopyEngine/Ultracopier/
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE}
+ make -j 4 > /dev/null
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the linux: ${RETURN_CODE}"
+ exit
+ fi
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/Listener/catchcopy-v0002/
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE}
+ make -j 4 > /dev/null
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the linux: ${RETURN_CODE}"
+ exit
+ fi
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/Themes/Oxygen/
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE}
+ make -j 4 > /dev/null
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the linux: ${RETURN_CODE}"
+ exit
+ fi
+ if [ ${ULTIMATE} -eq 1 ] && [ $STATIC -ne 1 ]
+ then
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins-alternative/Themes/Clean/
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE}
+ make -j 4 > /dev/null
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the linux: ${RETURN_CODE}"
+ exit
+ fi
+ mv ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins-alternative/Themes/Clean/ ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/Themes/Clean/
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins-alternative/Themes/Windows/
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE}
+ make -j 4 > /dev/null
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the linux: ${RETURN_CODE}"
+ exit
+ fi
+ mv ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins-alternative/Themes/Windows/ ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/Themes/Windows/
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins-alternative/Themes/Teracopy/
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE}
+ make -j 4 > /dev/null
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the linux: ${RETURN_CODE}"
+ exit
+ fi
+ mv ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins-alternative/Themes/Teracopy/ ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/Themes/Teracopy/
+ fi
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/
+ if [ $STATIC -eq 1 ]
+ then
+ cp -aRf ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/*/*/*.a ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE} ultracopier-static.pro
+ else
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE} ultracopier-core.pro
+ fi
+ make -j 4 > /dev/null
+ if [ $STATIC -eq 1 ]
+ then
+ upx --lzma -9 ultracopier > /dev/null
+ fi
+ RETURN_CODE=$?
+ if [ $? -ne 0 ] || [ ! -e ultracopier ]
+ then
+ echo "make failed on the linux: ${RETURN_CODE}"
+ exit
+ fi
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}
+ for SUBFOLDER in `ls -1`
+ do
+ if [ -d ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/ ]
+ then
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ ! -f ${plugins_name}/lib*.so ] && [ -d ${plugins_name}/ ]
+ then
+ rm -Rf ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/${plugins_cat}/${plugins_name}/
+ fi
+ done
+ fi
+ done
+ fi
+ done
+ cd ${TEMP_PATH}/
+ rm -Rf ${TEMP_PATH}/${FINAL_ARCHIVE}/resources/
+ if [ $STATIC -eq 1 ]
+ then
+ rm -Rf ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins/
+ fi
+ if [ ${ULTIMATE} -ne 1 ] || [ $STATIC -eq 1 ]
+ then
+ rm -Rf ${TEMP_PATH}/${FINAL_ARCHIVE}/plugins-alternative/
+ fi
+ /usr/bin/find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -type f -not \( -name "*.xml" -or -name "lib*.so" -or -name "ultracopier" -or -name "*.txt" -or -name "*.qm" \) -exec rm -f {} \;
+ /usr/bin/find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -type d \( -name "*build*" -or -name "Desktop" -or -name "Qt_5" -or -name "qt5" \) -exec rm -Rf {} \;
+ /usr/bin/find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -type d -empty -delete > /dev/null
+ /usr/bin/find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -type d -empty -delete > /dev/null
+ /usr/bin/find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -type d -empty -delete > /dev/null
+ /usr/bin/find ${TEMP_PATH}/${FINAL_ARCHIVE}/ -type d -empty -delete > /dev/null
+ cd ${TEMP_PATH}/
+ if [ ! -e ${FINAL_ARCHIVE} ]; then
+ echo "${FINAL_ARCHIVE} not exists!";
+ exit;
+ fi
+ nice -n 19 ionice -c 3 tar cpf - ${FINAL_ARCHIVE}/ | nice -n 19 ionice -c 3 xz -z -9 -e > ${FINAL_ARCHIVE}.tar.xz
+ if [ ! -e ${FINAL_ARCHIVE}.tar.xz ]; then
+ echo "${FINAL_ARCHIVE}.tar.xz not exists!";
+ exit;
+ fi
+ echo "Making binary debug linux tar.xz... done"
+ else
+ echo "Archive already exists: ${FINAL_ARCHIVE}.tar.xz"
+ fi
+}
+
+function compil_plugin {
+ DEBUG=$2
+ cd ${TEMP_PATH}/
+ TARGET=$1
+ SUBFOLDER=$3
+ FINAL_ARCHIVE="${TARGET}-linux-x86_64-pc-for-plugins"
+
+ cp -aRf ${ULTRACOPIER_SOURCE}/ ${TEMP_PATH}/${FINAL_ARCHIVE}/
+
+ if [ ${DEBUG} -eq 1 ]
+ then
+ QTMODEDEBUGRELEASE="debug"
+ else
+ QTMODEDEBUGRELEASE="release"
+ fi
+
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/1\.0\.0\.0/${ULTRACOPIER_VERSION}/g" {} \; > /dev/null
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ if [ -d ${plugins_name} ] && [ ! -f ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-linux-x86_64-pc.urc ]
+ then
+ echo "pack the ${ARCHITECTURE} linux for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+
+ find ${plugins_name}/ -name "*.pro.user" -exec rm {} \; > /dev/null
+ find ${plugins_name}/ -name "*-build-desktop" -type d -exec rm -Rf {} \; > /dev/null
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>linux-x86_64-pc<\/architecture>/g" {} \; > /dev/null
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLE/\/\/#define ULTRACOPIER_VERSION_PORTABLE/g" {} \; > /dev/null
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLEAPPS/\/\/#define ULTRACOPIER_VERSION_PORTABLEAPPS/g" {} \; > /dev/null
+ if [ ${DEBUG} -eq 1 ]
+ then
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_DEBUG/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null
+ else
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_DEBUG/\/\/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null
+ fi
+ cd ${plugins_name}/
+ ${QMAKE} -config ${QTMODEDEBUGRELEASE} *.pro
+ make -j 4 > /dev/null
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/${plugins_cat}/
+ if [ ! -e ${plugins_name}/lib*.so ]; then
+ echo "no lib*.so file!";
+ make -j 4
+ else
+ find ${plugins_name}/ -iname "*.ts" -exec rm {} \;
+ find ${plugins_name}/ -maxdepth 1 -mindepth 1 -type f ! -iname "lib*.so" ! -iname "informations.xml" -exec rm {} \;
+ find ${plugins_name}/ -maxdepth 1 -mindepth 1 -type d ! -iname "Languages" -exec rm -Rf {} \;
+ /usr/bin/find ${plugins_name}/ -type d -empty -delete > /dev/null
+ /usr/bin/find ${plugins_name}/ -type d -empty -delete > /dev/null
+ /usr/bin/find ${plugins_name}/ -type d -empty -delete > /dev/null
+ /usr/bin/find ${plugins_name}/ -type d -empty -delete > /dev/null
+
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-linux-x86_64-pc.urc
+ fi
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${FINAL_ARCHIVE}/${SUBFOLDER}/
+ done
+}
+
+compil "ultracopier" 0 0 0 0
+compil "ultracopier-ultimate" 0 1 0 0
+compil "ultracopier-debug" 1 0 0 0
+
+#compil_plugin "ultracopier" 0 "plugins-alternative"
+#compil_plugin "ultracopier" 0 "plugins"
diff --git a/tools/to-pack/sub-script/mac.sh b/tools/to-pack/sub-script/mac.sh
new file mode 100644
index 0000000..79665f1
--- /dev/null
+++ b/tools/to-pack/sub-script/mac.sh
@@ -0,0 +1,275 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+mkdir -p ${TEMP_PATH}
+cd ${TEMP_PATH}/
+
+IPMAC="192.168.158.34"
+SSHUSER="user"
+QTVERSION="5.4.0"
+QTVERSIONMAJ="5.4"
+
+ssh root@${IPMAC} "cd /usr/bin/;ln -s /Applications/Xcode.app/Contents/Developer//Toolchains/XcodeDefault.xctoolchain/usr/bin/otool"
+ssh root@${IPMAC} "mkdir /opt/;mkdir /opt/local/;mkdir /opt/local/lib/;cd /opt/local/lib/;ln -s /usr/lib/libz.1.dylib"
+
+#compil "ultracopier" 1 0
+function compil {
+ DEBUG=$2
+ ULTIMATE=$3
+ cd ${TEMP_PATH}/
+ TARGET=$1
+ STATIC=$4
+ DEBUGREAL=${5}
+ if [ $DEBUGREAL -eq 1 ]
+ then
+ LIBEXT="_debug.dylib"
+ CONFIGARG="debug"
+ else
+ LIBEXT=".dylib"
+ CONFIGARG="release"
+ fi
+ FINAL_ARCHIVE="${TARGET}-mac-os-x-${ULTRACOPIER_VERSION}.dmg"
+ if [ ! -e ${FINAL_ARCHIVE} ]
+ then
+ echo "Making Mac dmg: ${FINAL_ARCHIVE} ..."
+
+ rm -Rf ${TEMP_PATH}/${TARGET}-mac-os-x/
+ cp -aRf ${ULTRACOPIER_SOURCE}/ ${TEMP_PATH}/${TARGET}-mac-os-x/
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "*.pro.user" -exec rm {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "*-build-desktop" -type d -exec rm -Rf {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>mac-os-x<\/architecture>/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "informations.xml" -exec sed -i -r "s/<version>.*<\/version>/<version>${ULTRACOPIER_VERSION}<\/version>/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "informations.xml" -exec sed -i -r "s/<pubDate>.*<\pubDate>/<pubDate>`date +%s`<\pubDate>/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLE/\/\/#define ULTRACOPIER_VERSION_PORTABLE/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLEAPPS/\/\/#define ULTRACOPIER_VERSION_PORTABLEAPPS/g" {} \; > /dev/null 2>&1
+ if [ ${DEBUG} -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_DEBUG/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null 2>&1
+ else
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_DEBUG/\/\/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null 2>&1
+ fi
+ if [ $STATIC -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/g" {} \; > /dev/null 2>&1
+ else
+
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/\/\/#define ULTRACOPIER_PLUGIN_ALL_IN_ONE/g" {} \; > /dev/null 2>&1
+ fi
+ if [ $ULTIMATE -eq 1 ]
+ then
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_VERSION_ULTIMATE/#define ULTRACOPIER_VERSION_ULTIMATE/g" {} \; > /dev/null 2>&1
+ else
+ find ${TEMP_PATH}/${TARGET}-mac-os-x/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_ULTIMATE/\/\/#define ULTRACOPIER_VERSION_ULTIMATE/g" {} \; > /dev/null 2>&1
+ fi
+
+ echo "try connect"
+ ssh ${SSHUSER}@${IPMAC} "rm -fR /Users/${SSHUSER}/Desktop/ultracopier/"
+ echo "try rsync"
+ rsync -art ${TEMP_PATH}/${TARGET}-mac-os-x/ ${SSHUSER}@${IPMAC}:/Users/${SSHUSER}/Desktop/ultracopier/
+
+ echo "try qmake"
+ BASEAPPNAME="ultracopier.app"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/;/Users/user/Qt${QTVERSION}/${QTVERSIONMAJ}/clang_64/bin/qmake /Users/${SSHUSER}/Desktop/ultracopier/ultracopier-core.pro -spec macx-g++ -config ${CONFIGARG}"
+ echo "try make"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/;/Applications/Xcode.app/Contents/Developer/usr/bin/gnumake -j 3 > /dev/null > /dev/null"
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the mac: ${RETURN_CODE}"
+ exit
+ fi
+ echo "try make plugins"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins/CopyEngine/Ultracopier/;/Users/user/Qt${QTVERSION}/${QTVERSIONMAJ}/clang_64/bin/qmake /Users/${SSHUSER}/Desktop/ultracopier/plugins/CopyEngine/Ultracopier/*.pro -spec macx-g++ -config ${CONFIGARG}"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins/CopyEngine/Ultracopier/;/Applications/Xcode.app/Contents/Developer/usr/bin/gnumake -j 3 > /dev/null"
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the mac: ${RETURN_CODE}"
+ exit
+ fi
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins/Listener/catchcopy-v0002/;/Users/user/Qt${QTVERSION}/${QTVERSIONMAJ}/clang_64/bin/qmake /Users/${SSHUSER}/Desktop/ultracopier/plugins/Listener/catchcopy-v0002/*.pro -spec macx-g++ -config ${CONFIGARG}"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins/Listener/catchcopy-v0002/;/Applications/Xcode.app/Contents/Developer/usr/bin/gnumake -j 3 > /dev/null"
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the mac: ${RETURN_CODE}"
+ exit
+ fi
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins/Themes/Oxygen/;/Users/user/Qt${QTVERSION}/${QTVERSIONMAJ}/clang_64/bin/qmake /Users/${SSHUSER}/Desktop/ultracopier/plugins/Themes/Oxygen/*.pro -spec macx-g++ -config ${CONFIGARG}"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins/Themes/Oxygen/;/Applications/Xcode.app/Contents/Developer/usr/bin/gnumake -j 3 > /dev/null"
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the mac: ${RETURN_CODE}"
+ exit
+ fi
+ if [ ${ULTIMATE} -eq 1 ]
+ then
+ echo "do the ultimate plugin"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Windows/;/Users/user/Qt${QTVERSION}/${QTVERSIONMAJ}/clang_64/bin/qmake /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Windows/*.pro -spec macx-g++ -config ${CONFIGARG}" > /dev/null 2>&1
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Windows/;/Applications/Xcode.app/Contents/Developer/usr/bin/gnumake -j 3 > /dev/null"
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the mac: ${RETURN_CODE}"
+ exit
+ fi
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Teracopy/;/Users/user/Qt${QTVERSION}/${QTVERSIONMAJ}/clang_64/bin/qmake /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Teracopy/*.pro -spec macx-g++ -config ${CONFIGARG}" > /dev/null 2>&1
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Teracopy/;/Applications/Xcode.app/Contents/Developer/usr/bin/gnumake -j 3 > /dev/null"
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the mac: ${RETURN_CODE}"
+ exit
+ fi
+ ssh ${SSHUSER}@${IPMAC} "mkdir -p /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Windows/"
+ ssh ${SSHUSER}@${IPMAC} "mkdir -p /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Teracopy/"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Windows/informations.xml /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Windows/informations.xml"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Teracopy/informations.xml /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Teracopy/informations.xml"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Windows/libinterface${LIBEXT} /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Windows/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Teracopy/libinterface${LIBEXT} /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Teracopy/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "rsync -aqrt /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Windows/Languages/ /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Windows/Languages/"
+ ssh ${SSHUSER}@${IPMAC} "rsync -aqrt /Users/${SSHUSER}/Desktop/ultracopier/plugins-alternative/Themes/Teracopy/Languages/ /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Teracopy/Languages/"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Windows/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Windows/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtNetwork.framework/Versions/5/QtNetwork @executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Windows/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Teracopy/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Teracopy/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtNetwork.framework/Versions/5/QtNetwork @executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Teracopy/libinterface${LIBEXT}"
+ fi
+ echo "make the folder"
+ ssh ${SSHUSER}@${IPMAC} "mkdir /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/Frameworks"
+
+ ssh ${SSHUSER}@${IPMAC} "mkdir -p /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/CopyEngine/Ultracopier/"
+ ssh ${SSHUSER}@${IPMAC} "mkdir -p /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Languages/"
+ ssh ${SSHUSER}@${IPMAC} "mkdir -p /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Listener/catchcopy-v0002/"
+
+ echo "put the informations.xml"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins/CopyEngine/Ultracopier/informations.xml /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/CopyEngine/Ultracopier/informations.xml"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins/Listener/catchcopy-v0002/informations.xml /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Listener/catchcopy-v0002/informations.xml"
+
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins/CopyEngine/Ultracopier/libcopyEngine${LIBEXT} /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/CopyEngine/Ultracopier/libcopyEngine${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins/Listener/catchcopy-v0002/liblistener${LIBEXT} /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Listener/catchcopy-v0002/liblistener${LIBEXT}"
+
+ ssh ${SSHUSER}@${IPMAC} "rsync -aqrt /Users/${SSHUSER}/Desktop/ultracopier/plugins/Languages/ /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Languages/"
+ ssh ${SSHUSER}@${IPMAC} "rsync -aqrt /Users/${SSHUSER}/Desktop/ultracopier/plugins/CopyEngine/Ultracopier/Languages/ /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/CopyEngine/Ultracopier/Languages/"
+ ssh ${SSHUSER}@${IPMAC} "find /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/ -iname \"*.ts\" -exec rm {} \; > /dev/null 2>&1"
+
+ echo "finish the link"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/CopyEngine/Ultracopier/libcopyEngine${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/CopyEngine/Ultracopier/libcopyEngine${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtNetwork.framework/Versions/5/QtNetwork @executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/CopyEngine/Ultracopier/libcopyEngine${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Listener/catchcopy-v0002/liblistener${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Listener/catchcopy-v0002/liblistener${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtNetwork.framework/Versions/5/QtNetwork @executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Listener/catchcopy-v0002/liblistener${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "mkdir -p /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Oxygen/"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins/Themes/Oxygen/informations.xml /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Oxygen/informations.xml"
+ ssh ${SSHUSER}@${IPMAC} "cp /Users/${SSHUSER}/Desktop/ultracopier/plugins/Themes/Oxygen/libinterface${LIBEXT} /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Oxygen/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "rsync -aqrt /Users/${SSHUSER}/Desktop/ultracopier/plugins/Themes/Oxygen/Languages/ /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Oxygen/Languages/"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Oxygen/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Oxygen/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtNetwork.framework/Versions/5/QtNetwork @executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork /Users/${SSHUSER}/Desktop/ultracopier/${BASEAPPNAME}/Contents/MacOS/Themes/Oxygen/libinterface${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/;/Users/user/Qt${QTVERSION}/${QTVERSIONMAJ}/clang_64/bin/macdeployqt ${BASEAPPNAME}/ -dmg"
+ rsync -art ${SSHUSER}@${IPMAC}:/Users/${SSHUSER}/Desktop/ultracopier/ultracopier.dmg ${TEMP_PATH}/${FINAL_ARCHIVE}
+ if [ ! -e ${FINAL_ARCHIVE} ]; then
+ echo "${FINAL_ARCHIVE} not exists!";
+ exit;
+ fi
+ ssh ${SSHUSER}@${IPMAC} "rm -fR /Users/${SSHUSER}/Desktop/ultracopier/"
+ echo "Making binary debug Mac dmg... done"
+ else
+ echo "Archive already exists: ${FINAL_ARCHIVE}"
+ fi
+}
+
+function compil_plugin {
+ DEBUG=$2
+ cd ${TEMP_PATH}/
+ TARGET=$1
+ SUBFOLDER=$3
+
+ rsync -art --delete ${ULTRACOPIER_SOURCE}/ ${TEMP_PATH}/${TARGET}-mac-os-x/
+
+ cd ${TEMP_PATH}/${TARGET}-mac-os-x/${SUBFOLDER}/
+ for plugins_cat in `ls -1`
+ do
+ if [ -d ${plugins_cat} ] && [ "${plugins_cat}" != "Languages" ]
+ then
+ cd ${TEMP_PATH}/${TARGET}-mac-os-x/${SUBFOLDER}/${plugins_cat}/
+ for plugins_name in `ls -1`
+ do
+ if [ -f ${plugins_name}/informations.xml ]
+ then
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/1\.0\.0\.0/${ULTRACOPIER_VERSION}/g" {} \; > /dev/null 2>&1
+ ULTRACOPIER_PLUGIN_VERSION=`grep -F "<version>" ${plugins_name}/informations.xml | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+ # && [ ${plugins_name} != "Windows" ] -> for the plugins interface
+ if [ -d ${plugins_name} ] && [ ! -f "${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-mac-os-x.urc" ] && [ ${plugins_name} != "dbus" ] && [ ${plugins_cat} != "SessionLoader" ]
+ then
+ echo "pack the mac for the alternative plugin: ${plugins_cat}/${plugins_name}"
+ mkdir -p ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/
+
+ find ${plugins_name}/ -name "*.pro.user" -exec rm {} \; > /dev/null 2>&1
+ find ${plugins_name}/ -name "*-build-desktop" -type d -exec rm -Rf {} \; > /dev/null 2>&1
+ find ${plugins_name}/ -name "informations.xml" -exec sed -i -r "s/<architecture>.*<\/architecture>/<architecture>mac-os-x<\/architecture>/g" {} \; > /dev/null 2>&1
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLE/\/\/#define ULTRACOPIER_VERSION_PORTABLE/g" {} \; > /dev/null 2>&1
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_VERSION_PORTABLEAPPS/\/\/#define ULTRACOPIER_VERSION_PORTABLEAPPS/g" {} \; > /dev/null 2>&1
+ if [ ${DEBUG} -eq 1 ]
+ then
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_DEBUG/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null 2>&1
+ else
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_DEBUG/\/\/#define ULTRACOPIER_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG/\/\/#define ULTRACOPIER_PLUGIN_DEBUG/g" {} \; > /dev/null 2>&1
+ find ${plugins_name}/ -name "Variable.h" -exec sed -i "s/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/\/\/#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW/g" {} \; > /dev/null 2>&1
+ fi
+
+ ssh ${SSHUSER}@${IPMAC} "rm -fR /Users/${SSHUSER}/Desktop/ultracopier/"
+ rsync -art ${TEMP_PATH}/${TARGET}-mac-os-x/ ${SSHUSER}@${IPMAC}:/Users/${SSHUSER}/Desktop/ultracopier/
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/${SUBFOLDER}/${plugins_cat}/${plugins_name}/;/Users/user/Qt${QTVERSION}/${QTVERSIONMAJ}/clang_64/bin/qmake /Users/${SSHUSER}/Desktop/ultracopier/${SUBFOLDER}/${plugins_cat}/${plugins_name}/*.pro -spec macx-g++ -config ${CONFIGARG}"
+ ssh ${SSHUSER}@${IPMAC} "cd /Users/${SSHUSER}/Desktop/ultracopier/${SUBFOLDER}/${plugins_cat}/${plugins_name}/;/Applications/Xcode.app/Contents/Developer/usr/bin/gnumake -j 3 > /dev/null"
+ RETURN_CODE=$?
+ if [ $? -ne 0 ]
+ then
+ echo "make failed on the mac: ${RETURN_CODE}"
+ exit
+ fi
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui /Users/${SSHUSER}/Desktop/ultracopier/${SUBFOLDER}/${plugins_cat}/${plugins_name}/*${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore /Users/${SSHUSER}/Desktop/ultracopier/${SUBFOLDER}/${plugins_cat}/${plugins_name}/*${LIBEXT}"
+ ssh ${SSHUSER}@${IPMAC} "/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool -change QtNetwork.framework/Versions/5/QtNetwork @executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork /Users/${SSHUSER}/Desktop/ultracopier/${SUBFOLDER}/${plugins_cat}/${plugins_name}/*${LIBEXT}"
+ rsync -art "${SSHUSER}@${IPMAC}:/Users/${SSHUSER}/Desktop/ultracopier/${SUBFOLDER}/${plugins_cat}/${plugins_name}/*${LIBEXT}" ${plugins_name}/
+ if [ ! -e ${plugins_name}/*.dylib ]; then
+ echo "no .dylib file!";
+ else
+ find ${plugins_name}/ -iname "*.ts" -exec rm {} \;
+ find ${plugins_name}/ -maxdepth 1 -mindepth 1 -type f ! -iname "*.dylib" ! -iname "informations.xml" -exec rm {} \;
+ find ${plugins_name}/ -maxdepth 1 -mindepth 1 -type d ! -iname "Languages" -exec rm -Rf {} \;
+ /usr/bin/find ${plugins_name}/ -type d -empty -delete > /dev/null 2>&1
+ /usr/bin/find ${plugins_name}/ -type d -empty -delete > /dev/null 2>&1
+ /usr/bin/find ${plugins_name}/ -type d -empty -delete > /dev/null 2>&1
+ /usr/bin/find ${plugins_name}/ -type d -empty -delete > /dev/null 2>&1
+
+ tar --posix -c -f - ${plugins_name}/ | xz -9 --check=crc32 > ${TEMP_PATH}/plugins/${plugins_cat}/${plugins_name}/${plugins_cat}-${plugins_name}-${ULTRACOPIER_PLUGIN_VERSION}-mac-os-x.urc
+ fi
+ fi
+ fi
+ done
+ fi
+ cd ${TEMP_PATH}/${TARGET}-mac-os-x/${SUBFOLDER}/
+ done
+}
+
+compil "ultracopier" 0 0 0 0 0
+compil "ultracopier-ultimate" 0 1 0 0 0
+compil "ultracopier-debug" 1 0 0 0 0
+
+compil_plugin "ultracopier" 0 "plugins-alternative"
+compil_plugin "ultracopier" 0 "plugins"
diff --git a/tools/to-pack/sub-script/sendmail.sh b/tools/to-pack/sub-script/sendmail.sh
new file mode 100644
index 0000000..909972c
--- /dev/null
+++ b/tools/to-pack/sub-script/sendmail.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+if [ "${ULTRACOPIER_VERSION}" = "" ]
+then
+ exit;
+fi
+SUPERCOPIER_VERSION=`echo "${ULTRACOPIER_VERSION}"`
+
+cd ${TEMP_PATH}/
+
+echo "Send mail..."
+/usr/bin/php /home/first-world.info/shop/sendmail_ultracopier_version.php ${ULTRACOPIER_VERSION}
+echo "Send mail... done"
diff --git a/tools/to-pack/sub-script/test.sh b/tools/to-pack/sub-script/test.sh
new file mode 100644
index 0000000..782d462
--- /dev/null
+++ b/tools/to-pack/sub-script/test.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+cd ${TEMP_PATH}/
+
+source ${BASE_PWD}/sub-script/compil.sh
+source ${BASE_PWD}/sub-script/assemble.sh
+
+ARCHITECTURE="x86"
+#compil "supercopier-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 0 0 0 0 1 0
+#assemble "supercopier" "${ARCHITECTURE}" 0 0 0 0 0 0 1
+
+ compil "ultracopier-debug-windows-x86" 1 0 0 0 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ assemble "ultracopier-debug" "${ARCHITECTURE}" 1 0 0 0 0 0 0
+ #compil "ultracopier-debug-portable-windows-x86" 1 0 1 0 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ #assemble "ultracopier-debug-portable" "${ARCHITECTURE}" 1 0 1 0 0 0 0
+ compil "ultracopier-portable-windows-x86" 0 0 1 0 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ assemble "ultracopier-portable" "${ARCHITECTURE}" 0 0 1 0 0 0 0
+ #compil "ultracopier-portableapps-windows-x86" 0 0 1 1 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ #assemble "ultracopier-portableapps" "${ARCHITECTURE}" 0 0 1 0 0 0 0
+ compil "ultracopier-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 0 0 0 0 0 0
+ assemble "ultracopier" "${ARCHITECTURE}" 0 0 0 0 0 0 0
+ #compil "ultracopier-debug-static-windows-x86" 1 0 0 0 32 "-mtune=generic -march=i686" 0 0 1 0 0 0
+ #assemble "ultracopier-debug-static" "${ARCHITECTURE}" 1 0 0 0 1 0 0
+ #compil "ultracopier-debug-portable-static-windows-x86" 1 0 1 0 32 "-mtune=generic -march=i686" 0 0 1 0 0 0
+ #assemble "ultracopier-debug-portable-static" "${ARCHITECTURE}" 1 0 1 0 1 0 0
+ #compil "ultracopier-portable-static-windows-x86" 0 0 1 0 32 "-mtune=generic -march=i686" 0 0 1 0 0 0
+ #assemble "ultracopier-portable-static" "${ARCHITECTURE}" 0 0 1 0 1 0 0
+ #compil "ultracopier-static-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 0 0 1 0 0 0
+ #assemble "ultracopier-static" "${ARCHITECTURE}" 0 0 0 0 1 0 0
+ compil "supercopier-ultimate-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 1 0 0 0 1 0
+ assemble "supercopier-ultimate" "${ARCHITECTURE}" 0 0 0 1 0 0 1
+ compil "supercopier-ultimate-cgminer-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 1 0 0 1 1 0
+ assemble "supercopier-ultimate-cgminer" "${ARCHITECTURE}" 0 0 0 1 0 1 1
+ #compil "supercopier-ultimate-cgminer-static-windows-x86" 0 0 0 0 32 "-mtune=generic -march=i686" 1 0 1 1 1 0
+ #assemble "supercopier-ultimate-cgminer-static" "${ARCHITECTURE}" 0 0 0 1 1 1 1
diff --git a/tools/to-pack/sub-script/translation-local.sh b/tools/to-pack/sub-script/translation-local.sh
new file mode 100644
index 0000000..2e56f15
--- /dev/null
+++ b/tools/to-pack/sub-script/translation-local.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+rm -Rf ${TEMP_PATH}
+
+cd ${ULTRACOPIER_SOURCE}
+lupdate ultracopier-core.pro > /dev/null 2>&1
+lrelease -nounfinished -compress -removeidentical ultracopier-core.pro > /dev/null 2>&1
+PWD_BASE2=`pwd`
+echo "update the .ts file"
+for project in `find plugins/ plugins-alternative/ -maxdepth 2 -type d`
+do
+ cd ${project}/
+ for projectfile in `find ./ -name '*.pro' -type f`
+ do
+ if [ -f ${projectfile} ]
+ then
+ lupdate ${projectfile} > /dev/null 2>&1
+ lrelease -nounfinished -compress -removeidentical ${projectfile} > /dev/null 2>&1
+ fi
+ done
+ cd ${PWD_BASE2}
+done
+
+
+
diff --git a/tools/to-pack/sub-script/translation.sh b/tools/to-pack/sub-script/translation.sh
new file mode 100755
index 0000000..109e9b9
--- /dev/null
+++ b/tools/to-pack/sub-script/translation.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+TARGET="ultracopier-translation-${ULTRACOPIER_VERSION}"
+rm -Rf ${TEMP_PATH}/${TARGET}/
+mkdir -p ${TEMP_PATH}/${TARGET}/
+cd ${ULTRACOPIERSOURCESPATH}
+lupdate -no-obsolete ultracopier-core.pro > /dev/null 2>&1
+lrelease -nounfinished -compress -removeidentical ultracopier-core.pro > /dev/null 2>&1
+PWD_BASE2=`pwd`
+echo "update the .ts file"
+for project in `find plugins/ plugins-alternative/ -maxdepth 2 -type d`
+do
+ cd ${project}/
+ for projectfile in `find ./ -name '*.pro' -type f`
+ do
+ if [ -f ${projectfile} ]
+ then
+ lupdate ${projectfile} > /dev/null 2>&1
+ lrelease -nounfinished -compress -removeidentical ${projectfile} > /dev/null 2>&1
+ fi
+ done
+ cd ${PWD_BASE2}
+done
+echo "copy the .ts file"
+for languages in `find ./ -name Languages -type d`
+do
+ mkdir -p ${TEMP_PATH}/${TARGET}/${languages}
+ cp -aRf ${languages} ${TEMP_PATH}/${TARGET}/${languages}/../
+done
+cd ../to-pack/
+
+rm -Rf ${TEMP_PATH}/${TARGET}/*/*/Rsync > /dev/null 2>&1
+rm -Rf ${TEMP_PATH}/${TARGET}/plugins-alternative/CopyEngine > /dev/null 2>&1
+find ${TEMP_PATH}/${TARGET}/ -name "*.qm" -exec rm {} \; > /dev/null 2>&1
+find ${TEMP_PATH}/${TARGET}/ -name "Test" -type d -exec rm -Rf {} \; > /dev/null 2>&1
+mv ${TEMP_PATH}/${TARGET}/resources/Languages/en/ ${TEMP_PATH}/${TARGET}/plugins/Languages/en/
+find ${TEMP_PATH}/${TARGET}/ -type d -empty -delete > /dev/null 2>&1
+find ${TEMP_PATH}/${TARGET}/ -type d -empty -delete > /dev/null 2>&1
+find ${TEMP_PATH}/${TARGET}/ -type d -empty -delete > /dev/null 2>&1
+rm -Rf ${TEMP_PATH}/${TARGET}/resources/
+
+cd ${TEMP_PATH}/
+tar cjf ${TARGET}.tar.bz2 ${TARGET}/ --owner=0 --group=0 --mtime='2010-01-01' -H ustar
+if [ ! -e ${TARGET}.tar.bz2 ]; then
+ echo "${TARGET}.tar.bz2 not exists!";
+ exit;
+fi
+rm -Rf ${TARGET}/
diff --git a/tools/to-pack/sub-script/upload-local.sh b/tools/to-pack/sub-script/upload-local.sh
new file mode 100644
index 0000000..c42e055
--- /dev/null
+++ b/tools/to-pack/sub-script/upload-local.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+
+mkdir -p ${TEMP_PATH}
+cd ${TEMP_PATH}/
+
+rsync -avrtz --compress-level=9 --rsh='ssh -p54973' --partial --progress /mnt/world/ultracopier-temp/ultracopier-*.dmg root@ssh.first-world.info:/home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/ --timeout=120
+RETURNA=$?
+while [ ${RETURNA} -ne 0 ] && [ ${RETURNA} -ne 20 ] && [ ${RETURNA} -ne 255 ]
+do
+ rsync -avrtz --compress-level=9 --rsh='ssh -p54973' --partial --progress /mnt/world/ultracopier-temp/ultracopier-*.dmg root@ssh.first-world.info:/home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/ --timeout=120
+ RETURNA=$?
+ echo ${RETURNA}
+done
+
+
+rsync -avrtzu --compress-level=9 --rsh='ssh -p54973' --partial --progress /mnt/world/ultracopier-temp/plugins/ root@ssh.first-world.info:/home/first-world.info/files-rw/ultracopier/plugins/ --timeout=120
+RETURNB=$?
+while [ ${RETURNB} -ne 0 ] && [ ${RETURNB} -ne 20 ] && [ ${RETURNB} -ne 255 ]
+do
+ rsync -avrtzu --compress-level=9 --rsh='ssh -p54973' --partial --progress /mnt/world/ultracopier-temp/plugins/ root@ssh.first-world.info:/home/first-world.info/files-rw/ultracopier/plugins/ --timeout=120
+ RETURNB=$?
+ echo ${RETURNB}
+done
+
+#if [ "${RETURNA}" -eq 0 ] && [ "${RETURNB}" -eq 0 ]
+#then
+# rm -Rf /mnt/world/ultracopier-temp/*.dmg /mnt/world/ultracopier-temp/*.tar.xz /mnt/world/ultracopier-temp/plugins/
+#fi
diff --git a/tools/to-pack/sub-script/upload.sh b/tools/to-pack/sub-script/upload.sh
new file mode 100644
index 0000000..f7c50df
--- /dev/null
+++ b/tools/to-pack/sub-script/upload.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+if [ "${TEMP_PATH}" = "" ]
+then
+ exit;
+fi
+if [ "${ULTRACOPIER_VERSION}" = "" ]
+then
+ exit;
+fi
+SUPERCOPIER_VERSION=`echo "${ULTRACOPIER_VERSION}"`
+
+cd ${TEMP_PATH}/
+
+echo "Move some elements..."
+if [ -d ${TEMP_PATH}/doc/ ]
+then
+ rsync -artu ${TEMP_PATH}/doc/ /home/first-world.info/doc-ultracopier/
+ if [ $? -ne 0 ]
+ then
+ echo 'rsync failed'
+ exit;
+ fi
+ rm -Rf ${TEMP_PATH}/doc/
+fi
+if [ -d ${TEMP_PATH}/plugins/ ]
+then
+ rsync -artu ${TEMP_PATH}/plugins/ /home/first-world.info/files-rw/ultracopier/plugins/
+ if [ $? -ne 0 ]
+ then
+ echo 'rsync failed'
+ exit;
+ fi
+ rm -Rf ${TEMP_PATH}/plugins/
+fi
+
+mkdir -p /home/first-world.info/files-rw/supercopier/${SUPERCOPIER_VERSION}/
+mv ${TEMP_PATH}/supercopier-*.zip /home/first-world.info/files-rw/supercopier/${SUPERCOPIER_VERSION}/
+mv ${TEMP_PATH}/supercopier-*-setup.exe /home/first-world.info/files-rw/supercopier/${SUPERCOPIER_VERSION}/
+
+mkdir -p /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/
+mv ${TEMP_PATH}/ultracopier-*.tar.xz /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/
+mv ${TEMP_PATH}/ultracopier-*.zip /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/
+mv ${TEMP_PATH}/ultracopier-*-setup.exe /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/
+mv ${TEMP_PATH}/ultracopier-*.tar.bz2 /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/
+cp ${BASE_PWD}/data/gentoo/ultracopier.ebuild /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/ultracopier-${ULTRACOPIER_VERSION}.ebuild
+echo "Move some elements... done"
+
+echo "Finalise some elements..."
+chown lighttpd.lighttpd -Rf /home/first-world.info/doc-ultracopier/*/*/${ULTRACOPIER_VERSION}/
+chown lighttpd.lighttpd -Rf /home/first-world.info/files-rw/ultracopier/plugins/
+echo "Finalise some elements... done"
+
+echo "Upload to the shop..."
+#cd /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/ && rm -f /home/first-world.info/shop/download/09616e4ee15b7445c80704b934559f3af483abaa && nice -n 19 ionice -c 3 zip -9 -q /home/first-world.info/shop/download/09616e4ee15b7445c80704b934559f3af483abaa ultracopier-ultimate-*-x86-${ULTRACOPIER_VERSION}-setup.exe -x ultracopier-ultimate-cgminer-*-x86-${ULTRACOPIER_VERSION}-setup.exe && mv /home/first-world.info/shop/download/09616e4ee15b7445c80704b934559f3af483abaa.zip /home/first-world.info/shop/download/09616e4ee15b7445c80704b934559f3af483abaa
+#cd /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/ && rm -f /home/first-world.info/shop/download/e4039d2bc194fb68f3ac6319c63381eed1573632 && nice -n 19 ionice -c 3 zip -9 -q /home/first-world.info/shop/download/e4039d2bc194fb68f3ac6319c63381eed1573632 ultracopier-ultimate-*-x86_64-${ULTRACOPIER_VERSION}-setup.exe -x ultracopier-ultimate-cgminer-*-x86_64-${ULTRACOPIER_VERSION}-setup.exe && mv /home/first-world.info/shop/download/e4039d2bc194fb68f3ac6319c63381eed1573632.zip /home/first-world.info/shop/download/e4039d2bc194fb68f3ac6319c63381eed1573632
+#cp /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/ultracopier-ultimate-mac-os-x-${ULTRACOPIER_VERSION}.dmg /home/first-world.info/shop/download/d6382b673f31a42c71101ed642fe69d3b39dba8a
+#cd /home/first-world.info/files-rw/supercopier/${SUPERCOPIER_VERSION}/ && rm -f /home/first-world.info/shop/download/b5f718420c697ddb34d3dfae6cb2adfdfc860153 && nice -n 19 ionice -c 3 zip -9 -q /home/first-world.info/shop/download/b5f718420c697ddb34d3dfae6cb2adfdfc860153 supercopier-ultimate-*${SUPERCOPIER_VERSION}* -x supercopier-ultimate-cgminer-*${SUPERCOPIER_VERSION}* && mv /home/first-world.info/shop/download/b5f718420c697ddb34d3dfae6cb2adfdfc860153.zip /home/first-world.info/shop/download/b5f718420c697ddb34d3dfae6cb2adfdfc860153
+
+#cd /home/first-world.info/files-rw/ultracopier/plugins/Themes/Teracopy/ && rm -f /home/first-world.info/shop/download/161e15b3dfd41a1c4fc265d8d2d856a07e8df559 && nice -n 19 ionice -c 3 zip -9 -q /home/first-world.info/shop/download/161e15b3dfd41a1c4fc265d8d2d856a07e8df559 *${ULTRACOPIER_VERSION}*-x86_64.urc *${ULTRACOPIER_VERSION}*-x86.urc *${ULTRACOPIER_VERSION}*-mac-os-x.urc && mv /home/first-world.info/shop/download/161e15b3dfd41a1c4fc265d8d2d856a07e8df559.zip /home/first-world.info/shop/download/161e15b3dfd41a1c4fc265d8d2d856a07e8df559
+#cd /home/first-world.info/files-rw/ultracopier/plugins/CopyEngine/Rsync/ && rm -f /home/first-world.info/shop/download/7fee8026fb4f7d9bfcb9790dfa0db25a514f79da && nice -n 19 ionice -c 3 zip -9 -q /home/first-world.info/shop/download/7fee8026fb4f7d9bfcb9790dfa0db25a514f79da *${ULTRACOPIER_VERSION}*-x86_64.urc *${ULTRACOPIER_VERSION}*-x86.urc *${ULTRACOPIER_VERSION}*-mac-os-x.urc && mv /home/first-world.info/shop/download/7fee8026fb4f7d9bfcb9790dfa0db25a514f79da.zip /home/first-world.info/shop/download/7fee8026fb4f7d9bfcb9790dfa0db25a514f79da
+#cd /home/first-world.info/files-rw/ultracopier/plugins/Themes/Windows/ && rm -f /home/first-world.info/shop/download/59c9fb956fedf4d7a6ef6fe84371882bc5591256 && nice -n 19 ionice -c 3 zip -9 -q /home/first-world.info/shop/download/59c9fb956fedf4d7a6ef6fe84371882bc5591256 *${ULTRACOPIER_VERSION}*-x86_64.urc *${ULTRACOPIER_VERSION}*-x86.urc *${ULTRACOPIER_VERSION}*-mac-os-x.urc && mv /home/first-world.info/shop/download/59c9fb956fedf4d7a6ef6fe84371882bc5591256.zip /home/first-world.info/shop/download/59c9fb956fedf4d7a6ef6fe84371882bc5591256
+#cd /home/first-world.info/files-rw/ultracopier/plugins/Themes/Supercopier/ && rm -f /home/first-world.info/shop/download/c3386f6d227585eb9672fff25b5865208a451cc3 && nice -n 19 ionice -c 3 zip -9 -q /home/first-world.info/shop/download/c3386f6d227585eb9672fff25b5865208a451cc3 *${ULTRACOPIER_VERSION}*-x86_64.urc *${ULTRACOPIER_VERSION}*-x86.urc *${ULTRACOPIER_VERSION}*-mac-os-x.urc && mv /home/first-world.info/shop/download/c3386f6d227585eb9672fff25b5865208a451cc3.zip /home/first-world.info/shop/download/c3386f6d227585eb9672fff25b5865208a451cc3
+
+/usr/bin/php /home/first-world.info/shop/update_ultracopier_version.php ${ULTRACOPIER_VERSION}
+echo "Upload to the shop... done"
+
+echo "Clean the ultimate version..."
+#mv /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/ultracopier-ultimate-* ${TEMP_PATH}/
+#mv ${TEMP_PATH}/ultracopier-ultimate-cgminer-windows-x86* /home/first-world.info/files-rw/ultracopier/${ULTRACOPIER_VERSION}/
+#mv /home/first-world.info/files-rw/supercopier/${SUPERCOPIER_VERSION}/supercopier-ultimate-* ${TEMP_PATH}/
+#mv ${TEMP_PATH}/supercopier-ultimate-cgminer-windows-x86* /home/first-world.info/files-rw/supercopier/${SUPERCOPIER_VERSION}/
+rm -Rf ${TEMP_PATH}/*
+echo "Clean the ultimate version... done"
+
+echo "Change the static files..."
+echo ${ULTRACOPIER_VERSION} > /home/first-world.info/ultracopier/updater.txt
+echo ${ULTRACOPIER_VERSION} > /home/first-world.info/ultracopier-update/updater.txt
+/etc/init.d/lighttpd restart
+echo "Change the static files... done"
diff --git a/tools/to-pack/test.sh b/tools/to-pack/test.sh
new file mode 100755
index 0000000..14245a4
--- /dev/null
+++ b/tools/to-pack/test.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+export TEMP_PATH="/home/ultracopier-temp/"
+export WINEBASEPATH="/home/wine/"
+export ULTRACOPIERSOURCESPATH="/root/ultracopier/sources/"
+export BASE_PWD=`pwd`
+
+export ULTRACOPIER_VERSION=`grep -F "ULTRACOPIER_VERSION" ${ULTRACOPIERSOURCESPATH}/Variable.h | grep -F "1.4" | sed -r "s/^.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/g"`
+function valid_ip()
+{
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+if ! valid_ip ${ULTRACOPIER_VERSION}; then
+ echo Wrong version: ${ULTRACOPIER_VERSION}
+ exit
+fi
+echo Version: ${ULTRACOPIER_VERSION}
+
+rm -Rf ${TEMP_PATH} > /dev/null 2>&1
+rm -Rf ${ULTRACOPIERSOURCESPATH}/plugins-alternative/CopyEngine/Ultracopier/ > /dev/null 2>&1
+mkdir -p ${TEMP_PATH}
+find ../ -name "Thumbs.db" -exec rm {} \; >> /dev/null 2>&1
+find ../ -name ".directory" -exec rm {} \; >> /dev/null 2>&1
+
+echo "Do the test folder..."
+source sub-script/test.sh
+cd ${BASE_PWD}
+echo "Do the test folder... done"
+
+./4-clean-all.sh
+rm /home/first-world.info/ultracopier/temp/*
+
+
+if [ -f ${TEMP_PATH}/*.7z ]
+then
+ cp /home/ultracopier-temp/*.7z /home/first-world.info/ultracopier/temp/
+fi
+if [ -f ${TEMP_PATH}/*.zip ]
+then
+ cp /home/ultracopier-temp/*.zip /home/first-world.info/ultracopier/temp/
+fi
+if [ -f ${TEMP_PATH}/*-setup.exe ]
+then
+ cp /home/ultracopier-temp/*-setup.exe /home/first-world.info/ultracopier/temp/
+fi
diff --git a/tools/unit-tester/copyEngine.cpp b/tools/unit-tester/copyEngine.cpp
new file mode 100644
index 0000000..f74361d
--- /dev/null
+++ b/tools/unit-tester/copyEngine.cpp
@@ -0,0 +1,1386 @@
+/** \file copyEngine.cpp
+\brief Define the copy engine
+\author alpha_one_x86
+*/
+
+#include "copyEngine.h"
+#include "folderExistsDialog.h"
+#include "../../../interface/PluginInterface_CopyEngine.h"
+
+copyEngine::copyEngine(const QString &path,const QList<SupportedTest> &tests)
+{
+ listThread=new ListThread(facilityEngine);
+ this->facilityEngine=facilityEngine;
+ filters=NULL;
+ renamingRules=NULL;
+
+ interface = NULL;
+ tempWidget = NULL;
+ uiIsInstalled = false;
+ dialogIsOpen = false;
+ maxSpeed = 0;
+ alwaysDoThisActionForFileExists = FileExists_NotSet;
+ alwaysDoThisActionForFileError = FileError_NotSet;
+ checkDestinationFolderExists = false;
+ stopIt = false;
+ size_for_speed = 0;
+ forcedMode = false;
+
+ //implement the SingleShot in this class
+ //timerActionDone.setSingleShot(true);
+ timerActionDone.setInterval(ULTRACOPIER_PLUGIN_TIME_UPDATE_TRASNFER_LIST);
+ //timerProgression.setSingleShot(true);
+ timerProgression.setInterval(ULTRACOPIER_PLUGIN_TIME_UPDATE_PROGRESSION);
+
+}
+
+copyEngine::~copyEngine()
+{
+ /*if(filters!=NULL)
+ delete filters;
+ if(renamingRules!=NULL)
+ delete renamingRules;
+ destroyed by the widget parent, here the interface
+ */
+ stopIt=true;
+ delete listThread;
+ delete ui;
+}
+
+void copyEngine::connectTheSignalsSlots()
+{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ debugDialogWindow.show();
+ #endif
+ if(!connect(listThread,&ListThread::actionInProgess, this,&copyEngine::actionInProgess, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect actionInProgess()");
+ if(!connect(listThread,&ListThread::actionInProgess, this,&copyEngine::newActionInProgess, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect actionInProgess() to slot");
+ if(!connect(listThread,&ListThread::newFolderListing, this,&copyEngine::newFolderListing, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect newFolderListing()");
+ if(!connect(listThread,&ListThread::newCollisionAction, this,&copyEngine::newCollisionAction, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect newCollisionAction()");
+ if(!connect(listThread,&ListThread::newErrorAction, this,&copyEngine::newErrorAction, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect newErrorAction()");
+ if(!connect(listThread,&ListThread::isInPause, this,&copyEngine::isInPause, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect isInPause()");
+ if(!connect(listThread,&ListThread::error, this,&copyEngine::error, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect error()");
+ if(!connect(listThread,&ListThread::rmPath, this,&copyEngine::rmPath, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect rmPath()");
+ if(!connect(listThread,&ListThread::mkPath, this,&copyEngine::mkPath, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect mkPath()");
+ if(!connect(listThread,&ListThread::newActionOnList, this,&copyEngine::newActionOnList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect newActionOnList()");
+ if(!connect(listThread,&ListThread::pushFileProgression, this,&copyEngine::pushFileProgression, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect pushFileProgression()");
+ if(!connect(listThread,&ListThread::pushGeneralProgression, this,&copyEngine::pushGeneralProgression, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect pushGeneralProgression()");
+ if(!connect(listThread,&ListThread::syncReady, this,&copyEngine::syncReady, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect syncReady()");
+ if(!connect(listThread,&ListThread::canBeDeleted, this,&copyEngine::canBeDeleted, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect canBeDeleted()");
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ if(!connect(listThread,&ListThread::debugInformation, this,&copyEngine::debugInformation, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect debugInformation()");
+ #endif
+
+ if(!connect(listThread,&ListThread::send_fileAlreadyExists, this,&copyEngine::fileAlreadyExistsSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_fileAlreadyExists()");
+ if(!connect(listThread,&ListThread::send_errorOnFile, this,&copyEngine::errorOnFileSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_errorOnFile()");
+ if(!connect(listThread,&ListThread::send_folderAlreadyExists, this,&copyEngine::folderAlreadyExistsSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_folderAlreadyExists()");
+ if(!connect(listThread,&ListThread::send_errorOnFolder, this,&copyEngine::errorOnFolderSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_errorOnFolder()");
+ if(!connect(listThread,&ListThread::updateTheDebugInfo, this,&copyEngine::updateTheDebugInfo, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect updateTheDebugInfo()");
+ if(!connect(listThread,&ListThread::errorTransferList, this,&copyEngine::errorTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect errorTransferList()");
+ if(!connect(listThread,&ListThread::warningTransferList, this,&copyEngine::warningTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect warningTransferList()");
+ if(!connect(listThread,&ListThread::mkPathErrorOnFolder, this,&copyEngine::mkPathErrorOnFolderSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect mkPathErrorOnFolder()");
+ if(!connect(listThread,&ListThread::rmPathErrorOnFolder, this,&copyEngine::rmPathErrorOnFolderSlot, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect rmPathErrorOnFolder()");
+ if(!connect(listThread,&ListThread::send_realBytesTransfered, this,&copyEngine::get_realBytesTransfered, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_realBytesTransfered()");
+
+ if(!connect(this,&copyEngine::tryCancel, listThread,&ListThread::tryCancel, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect tryCancel()");
+ if(!connect(this,&copyEngine::signal_pause, listThread,&ListThread::pause, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_pause()");
+ if(!connect(this,&copyEngine::signal_resume, listThread,&ListThread::resume, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_resume()");
+ if(!connect(this,&copyEngine::signal_skip, listThread,&ListThread::skip, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_skip()");
+ if(!connect(this,&copyEngine::signal_setCollisionAction, listThread,&ListThread::setAlwaysFileExistsAction, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_setCollisionAction()");
+ if(!connect(this,&copyEngine::signal_setFolderColision, listThread,&ListThread::setFolderColision, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_setFolderColision()");
+ if(!connect(this,&copyEngine::signal_removeItems, listThread,&ListThread::removeItems, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_removeItems()");
+ if(!connect(this,&copyEngine::signal_moveItemsOnTop, listThread,&ListThread::moveItemsOnTop, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_moveItemsOnTop()");
+ if(!connect(this,&copyEngine::signal_moveItemsUp, listThread,&ListThread::moveItemsUp, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_moveItemsUp()");
+ if(!connect(this,&copyEngine::signal_moveItemsDown, listThread,&ListThread::moveItemsDown, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_moveItemsDown()");
+ if(!connect(this,&copyEngine::signal_moveItemsOnBottom, listThread,&ListThread::moveItemsOnBottom, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_moveItemsOnBottom()");
+ if(!connect(this,&copyEngine::signal_exportTransferList, listThread,&ListThread::exportTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_exportTransferList()");
+ if(!connect(this,&copyEngine::signal_importTransferList, listThread,&ListThread::importTransferList, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_importTransferList()");
+ if(!connect(this,&copyEngine::signal_forceMode, listThread,&ListThread::forceMode, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_forceMode()");
+ if(!connect(this,&copyEngine::send_osBufferLimit, listThread,&ListThread::set_osBufferLimit, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_osBufferLimit()");
+ if(!connect(this,&copyEngine::send_setFilters,listThread,&ListThread::set_setFilters, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_setFilters()");
+ if(!connect(this,&copyEngine::send_sendNewRenamingRules,listThread,&ListThread::set_sendNewRenamingRules, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_sendNewRenamingRules()");
+ if(!connect(&timerActionDone,&QTimer::timeout, listThread,&ListThread::sendActionDone))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect timerActionDone");
+ if(!connect(&timerProgression,&QTimer::timeout, listThread,&ListThread::sendProgression))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect timerProgression");
+
+ if(!connect(this,&copyEngine::queryOneNewDialog,this,&copyEngine::showOneNewDialog,Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect queryOneNewDialog()");
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+void copyEngine::updateTheDebugInfo(QStringList newList,QStringList newList2,int numberOfInodeOperation)
+{
+ debugDialogWindow.setTransferThreadList(newList);
+ debugDialogWindow.setTransferList(newList2);
+ debugDialogWindow.setInodeUsage(numberOfInodeOperation);
+}
+#endif
+
+//to send the options panel
+bool copyEngine::getOptionsEngine(QWidget * tempWidget)
+{
+ this->tempWidget=tempWidget;
+ ui->setupUi(tempWidget);
+ connect(tempWidget, &QWidget::destroyed, this, &copyEngine::resetTempWidget);
+ //conect the ui widget
+/* connect(ui->doRightTransfer, &QCheckBox::toggled, &threadOfTheTransfer, &copyEngine::setRightTransfer);
+ connect(ui->keepDate, &QCheckBox::toggled, &threadOfTheTransfer, &copyEngine::setKeepDate);
+ connect(ui->blockSize, &QCheckBox::valueChanged, &threadOfTheTransfer, &copyEngine::setBlockSize);*/
+ connect(ui->autoStart, &QCheckBox::toggled, this, &copyEngine::setAutoStart);
+ connect(ui->checkBoxDestinationFolderExists, &QCheckBox::toggled,this, &copyEngine::setCheckDestinationFolderExists);
+ uiIsInstalled=true;
+ setRightTransfer(doRightTransfer);
+ setKeepDate(keepDate);
+ setSpeedLimitation(maxSpeed);
+ setBlockSize(blockSize);
+ setAutoStart(autoStart);
+ setCheckDestinationFolderExists(checkDestinationFolderExists);
+ set_doChecksum(doChecksum);
+ set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+ set_checksumOnlyOnError(checksumOnlyOnError);
+ set_osBuffer(osBuffer);
+ set_osBufferLimited(osBufferLimited);
+ set_osBufferLimit(osBufferLimit);
+ return true;
+}
+
+//to have interface widget to do modal dialog
+void copyEngine::setInterfacePointer(QWidget * interface)
+{
+ this->interface=interface;
+ filters=new Filters(tempWidget);
+ renamingRules=new RenamingRules(tempWidget);
+
+ if(uiIsInstalled)
+ {
+ connect(ui->doRightTransfer, &QCheckBox::toggled, this,&copyEngine::setRightTransfer);
+ connect(ui->keepDate, &QCheckBox::toggled, this,&copyEngine::setKeepDate);
+ connect(ui->blockSize, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&copyEngine::setBlockSize);
+ connect(ui->autoStart, &QCheckBox::toggled, this,&copyEngine::setAutoStart);
+ connect(ui->doChecksum, &QCheckBox::toggled, this,&copyEngine::doChecksum_toggled);
+ connect(ui->checksumIgnoreIfImpossible, &QCheckBox::toggled, this,&copyEngine::checksumIgnoreIfImpossible_toggled);
+ connect(ui->checksumOnlyOnError, &QCheckBox::toggled, this,&copyEngine::checksumOnlyOnError_toggled);
+ connect(ui->osBuffer, &QCheckBox::toggled, this,&copyEngine::osBuffer_toggled);
+ connect(ui->osBufferLimited, &QCheckBox::toggled, this,&copyEngine::osBufferLimited_toggled);
+ connect(ui->osBufferLimit, &QSpinBox::editingFinished, this,&copyEngine::osBufferLimit_editingFinished);
+
+ connect(filters,&Filters::haveNewFilters,this,&copyEngine::sendNewFilters);
+ connect(ui->filters,&QPushButton::clicked,this,&copyEngine::showFilterDialog);
+
+ if(!connect(renamingRules,&RenamingRules::sendNewRenamingRules,this,&copyEngine::sendNewRenamingRules))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect sendNewRenamingRules()");
+ if(!connect(ui->renamingRules,&QPushButton::clicked,this,&copyEngine::showRenamingRules))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect renamingRules.clicked()");
+ }
+
+ filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ set_setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+
+ renamingRules->setRenamingRules(firstRenamingRule,otherRenamingRule);
+ emit send_sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+bool copyEngine::haveSameSource(const QStringList &sources)
+{
+ return listThread->haveSameSource(sources);
+}
+
+bool copyEngine::haveSameDestination(const QString &destination)
+{
+ return listThread->haveSameDestination(destination);
+}
+
+bool copyEngine::newCopy(const QStringList &sources)
+{
+ if(forcedMode && mode!=Copy)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to move, you can't copy with it");
+ QMessageBox::critical(NULL,facilityEngine->translateText("Internal error"),tr("The engine is forced to move, you can't copy with it"));
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QString destination = QFileDialog::getExistingDirectory(interface,facilityEngine->translateText("Select destination directory"),"",QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if(destination.isEmpty() || destination.isNull() || destination=="")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Canceled by the user");
+ return false;
+ }
+ return listThread->newCopy(sources,destination);
+}
+
+bool copyEngine::newCopy(const QStringList &sources,const QString &destination)
+{
+ if(forcedMode && mode!=Copy)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to move, you can't copy with it");
+ QMessageBox::critical(NULL,facilityEngine->translateText("Internal error"),tr("The engine is forced to move, you can't copy with it"));
+ return false;
+ }
+ return listThread->newCopy(sources,destination);
+}
+
+bool copyEngine::newMove(const QStringList &sources)
+{
+ if(forcedMode && mode!=Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to copy, you can't move with it");
+ QMessageBox::critical(NULL,facilityEngine->translateText("Internal error"),tr("The engine is forced to copy, you can't move with it"));
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QString destination = QFileDialog::getExistingDirectory(interface,facilityEngine->translateText("Select destination directory"),"",QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if(destination.isEmpty() || destination.isNull() || destination=="")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Canceled by the user");
+ return false;
+ }
+ return listThread->newMove(sources,destination);
+}
+
+bool copyEngine::newMove(const QStringList &sources,const QString &destination)
+{
+ if(forcedMode && mode!=Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to copy, you can't move with it");
+ QMessageBox::critical(NULL,facilityEngine->translateText("Internal error"),tr("The engine is forced to copy, you can't move with it"));
+ return false;
+ }
+ return listThread->newMove(sources,destination);
+}
+
+void copyEngine::newTransferList(const QString &file)
+{
+ emit signal_importTransferList(file);
+}
+
+//because direct access to list thread into the main thread can't be do
+quint64 copyEngine::realByteTransfered()
+{
+ return size_for_speed;
+}
+
+//speed limitation
+qint64 copyEngine::getSpeedLimitation()
+{
+ return listThread->getSpeedLimitation();
+}
+
+//get collision action
+QList<QPair<QString,QString> > copyEngine::getCollisionAction()
+{
+ QPair<QString,QString> tempItem;
+ QList<QPair<QString,QString> > list;
+ tempItem.first=facilityEngine->translateText("Ask");tempItem.second="ask";list << tempItem;
+ tempItem.first=facilityEngine->translateText("Skip");tempItem.second="skip";list << tempItem;
+ tempItem.first=facilityEngine->translateText("Overwrite");tempItem.second="overwrite";list << tempItem;
+ tempItem.first=facilityEngine->translateText("Overwrite if newer");tempItem.second="overwriteIfNewer";list << tempItem;
+ tempItem.first=facilityEngine->translateText("Overwrite if the last modification dates are different");tempItem.second="overwriteIfNotSameModificationDate";list << tempItem;
+ tempItem.first=facilityEngine->translateText("Rename");tempItem.second="rename";list << tempItem;
+ return list;
+}
+
+QList<QPair<QString,QString> > copyEngine::getErrorAction()
+{
+ QPair<QString,QString> tempItem;
+ QList<QPair<QString,QString> > list;
+ tempItem.first=facilityEngine->translateText("Ask");tempItem.second="ask";list << tempItem;
+ tempItem.first=facilityEngine->translateText("Skip");tempItem.second="skip";list << tempItem;
+ tempItem.first=facilityEngine->translateText("Put to end of the list");tempItem.second="putToEndOfTheList";list << tempItem;
+ return list;
+}
+
+void copyEngine::setDrive(const QStringList &drives)
+{
+ listThread->setDrive(drives);
+}
+
+/** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+void copyEngine::syncTransferList()
+{
+ listThread->syncTransferList();
+}
+
+void copyEngine::set_doChecksum(bool doChecksum)
+{
+ listThread->set_doChecksum(doChecksum);
+ if(uiIsInstalled)
+ {
+ ui->doChecksum->setChecked(doChecksum);
+ ui->checksumOnlyOnError->setEnabled(ui->doChecksum->isChecked());
+ ui->checksumIgnoreIfImpossible->setEnabled(ui->doChecksum->isChecked());
+ }
+ this->doChecksum=doChecksum;
+}
+
+void copyEngine::set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible)
+{
+ listThread->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+ if(uiIsInstalled)
+ ui->checksumIgnoreIfImpossible->setChecked(checksumIgnoreIfImpossible);
+ this->checksumIgnoreIfImpossible=checksumIgnoreIfImpossible;
+}
+
+void copyEngine::set_checksumOnlyOnError(bool checksumOnlyOnError)
+{
+ listThread->set_checksumOnlyOnError(checksumOnlyOnError);
+ if(uiIsInstalled)
+ ui->checksumOnlyOnError->setChecked(checksumOnlyOnError);
+ this->checksumOnlyOnError=checksumOnlyOnError;
+}
+
+void copyEngine::set_osBuffer(bool osBuffer)
+{
+ listThread->set_osBuffer(osBuffer);
+ if(uiIsInstalled)
+ {
+ ui->osBuffer->setChecked(osBuffer);
+ updateBufferCheckbox();
+ }
+ this->osBuffer=osBuffer;
+}
+
+void copyEngine::set_osBufferLimited(bool osBufferLimited)
+{
+ listThread->set_osBufferLimited(osBufferLimited);
+ if(uiIsInstalled)
+ {
+ ui->osBufferLimited->setChecked(osBufferLimited);
+ updateBufferCheckbox();
+ }
+ this->osBufferLimited=osBufferLimited;
+}
+
+void copyEngine::set_osBufferLimit(unsigned int osBufferLimit)
+{
+ emit send_osBufferLimit(osBufferLimit);
+ if(uiIsInstalled)
+ ui->osBufferLimit->setValue(osBufferLimit);
+ this->osBufferLimit=osBufferLimit;
+}
+
+void copyEngine::updateBufferCheckbox()
+{
+ ui->osBufferLimited->setEnabled(ui->osBuffer->isChecked());
+ ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
+}
+
+void copyEngine::set_setFilters(QStringList includeStrings,QStringList includeOptions,QStringList excludeStrings,QStringList excludeOptions)
+{
+ if(filters!=NULL)
+ {
+ filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ emit send_setFilters(filters->getInclude(),filters->getExclude());
+ }
+ this->includeStrings=includeStrings;
+ this->includeOptions=includeOptions;
+ this->excludeStrings=excludeStrings;
+ this->excludeOptions=excludeOptions;
+}
+
+void copyEngine::setRenamingRules(QString firstRenamingRule,QString otherRenamingRule)
+{
+ sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+bool copyEngine::userAddFolder(const CopyMode &mode)
+{
+ QString source = QFileDialog::getExistingDirectory(interface,facilityEngine->translateText("Select source directory"),"",QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if(source.isEmpty() || source.isNull() || source=="")
+ return false;
+ if(mode==Copy)
+ return newCopy(QStringList() << source);
+ else
+ return newMove(QStringList() << source);
+}
+
+bool copyEngine::userAddFile(const CopyMode &mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QStringList sources = QFileDialog::getOpenFileNames(
+ interface,
+ facilityEngine->translateText("Select one or more files to open"),
+ "",
+ facilityEngine->translateText("All files")+" (*)");
+ if(sources.isEmpty())
+ return false;
+ if(mode==Copy)
+ return newCopy(sources);
+ else
+ return newMove(sources);
+}
+
+void copyEngine::pause()
+{
+ emit signal_pause();
+}
+
+void copyEngine::resume()
+{
+ emit signal_resume();
+}
+
+void copyEngine::skip(const quint64 &id)
+{
+ emit signal_skip(id);
+}
+
+void copyEngine::cancel()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ stopIt=true;
+ timerProgression.stop();
+ timerActionDone.stop();
+ emit tryCancel();
+}
+
+void copyEngine::removeItems(const QList<int> &ids)
+{
+ emit signal_removeItems(ids);
+}
+
+void copyEngine::moveItemsOnTop(const QList<int> &ids)
+{
+ emit signal_moveItemsOnTop(ids);
+}
+
+void copyEngine::moveItemsUp(const QList<int> &ids)
+{
+ emit signal_moveItemsUp(ids);
+}
+
+void copyEngine::moveItemsDown(const QList<int> &ids)
+{
+ emit signal_moveItemsDown(ids);
+}
+
+void copyEngine::moveItemsOnBottom(const QList<int> &ids)
+{
+ emit signal_moveItemsOnBottom(ids);
+}
+
+/** \brief give the forced mode, to export/import transfer list */
+void copyEngine::forceMode(const CopyMode &mode)
+{
+ if(forcedMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QString("Mode forced previously"));
+ QMessageBox::critical(NULL,facilityEngine->translateText("Internal error"),tr("The mode have been forced previously, it's internal error, please report it"));
+ return;
+ }
+ if(mode==Copy)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QString("Force mode to copy"));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QString("Force mode to move"));
+ this->mode=mode;
+ forcedMode=true;
+ emit signal_forceMode(mode);
+}
+
+void copyEngine::exportTransferList()
+{
+ QString fileName = QFileDialog::getSaveFileName(NULL,facilityEngine->translateText("Save transfer list"),"transfer-list.lst",facilityEngine->translateText("Transfer list")+" (*.lst)");
+ if(fileName.isEmpty())
+ return;
+ emit signal_exportTransferList(fileName);
+}
+
+void copyEngine::importTransferList()
+{
+ QString fileName = QFileDialog::getOpenFileName(NULL,facilityEngine->translateText("Open transfer list"),"transfer-list.lst",facilityEngine->translateText("Transfer list")+" (*.lst)");
+ if(fileName.isEmpty())
+ return;
+ emit signal_importTransferList(fileName);
+}
+
+void copyEngine::warningTransferList(const QString &warning)
+{
+ QMessageBox::warning(interface,facilityEngine->translateText("Error"),warning);
+}
+
+void copyEngine::errorTransferList(const QString &error)
+{
+ QMessageBox::critical(interface,facilityEngine->translateText("Error"),error);
+}
+
+bool copyEngine::setSpeedLimitation(const qint64 &speedLimitation)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"maxSpeed: "+QString::number(speedLimitation));
+ maxSpeed=speedLimitation;
+ return listThread->setSpeedLimitation(speedLimitation);
+}
+
+void copyEngine::setCollisionAction(const QString &action)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action: "+action);
+ if(action=="skip")
+ alwaysDoThisActionForFileExists=FileExists_Skip;
+ else if(action=="overwrite")
+ alwaysDoThisActionForFileExists=FileExists_Overwrite;
+ else if(action=="overwriteIfNewer")
+ alwaysDoThisActionForFileExists=FileExists_OverwriteIfNewer;
+ else if(action=="overwriteIfNotSameModificationDate")
+ alwaysDoThisActionForFileExists=FileExists_OverwriteIfNotSameModificationDate;
+ else if(action=="rename")
+ alwaysDoThisActionForFileExists=FileExists_Rename;
+ else
+ alwaysDoThisActionForFileExists=FileExists_NotSet;
+ emit signal_setCollisionAction(alwaysDoThisActionForFileExists);
+}
+
+void copyEngine::setErrorAction(const QString &action)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action: "+action);
+ if(action=="skip")
+ alwaysDoThisActionForFileError=FileError_Skip;
+ else if(action=="putToEndOfTheList")
+ alwaysDoThisActionForFileError=FileError_PutToEndOfTheList;
+ else
+ alwaysDoThisActionForFileError=FileError_NotSet;
+}
+
+void copyEngine::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+ if(uiIsInstalled)
+ ui->doRightTransfer->setChecked(doRightTransfer);
+ listThread->setRightTransfer(doRightTransfer);
+}
+
+//set keep date
+void copyEngine::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+ if(uiIsInstalled)
+ ui->keepDate->setChecked(keepDate);
+ listThread->setKeepDate(keepDate);
+}
+
+//set block size in KB
+void copyEngine::setBlockSize(const int blockSize)
+{
+ this->blockSize=blockSize;
+ if(uiIsInstalled)
+ ui->blockSize->setValue(blockSize);
+ listThread->setBlockSize(blockSize);
+}
+
+//set auto start
+void copyEngine::setAutoStart(const bool autoStart)
+{
+ this->autoStart=autoStart;
+ if(uiIsInstalled)
+ ui->autoStart->setChecked(autoStart);
+ listThread->setAutoStart(autoStart);
+}
+
+//set check destination folder
+void copyEngine::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+{
+ this->checkDestinationFolderExists=checkDestinationFolderExists;
+ if(uiIsInstalled)
+ ui->checkBoxDestinationFolderExists->setChecked(checkDestinationFolderExists);
+ listThread->setCheckDestinationFolderExists(checkDestinationFolderExists);
+}
+
+//reset widget
+void copyEngine::resetTempWidget()
+{
+ tempWidget=NULL;
+}
+
+void copyEngine::on_comboBoxFolderColision_currentIndexChanged(int index)
+{
+ switch(index)
+ {
+ case 0:
+ setComboBoxFolderColision(FolderExists_NotSet,false);
+ break;
+ case 1:
+ setComboBoxFolderColision(FolderExists_Merge,false);
+ break;
+ case 2:
+ setComboBoxFolderColision(FolderExists_Skip,false);
+ break;
+ case 3:
+ setComboBoxFolderColision(FolderExists_Rename,false);
+ break;
+ }
+}
+
+void copyEngine::on_comboBoxFolderError_currentIndexChanged(int index)
+{
+ switch(index)
+ {
+ case 0:
+ setComboBoxFolderError(FileError_NotSet,false);
+ break;
+ case 1:
+ setComboBoxFolderError(FileError_Skip,false);
+ break;
+ }
+}
+
+//set the translate
+void copyEngine::newLanguageLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, retranslate the widget options");
+ if(tempWidget!=NULL)
+ ui->retranslateUi(tempWidget);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"ui not loaded!");
+}
+
+void copyEngine::setComboBoxFolderColision(FolderExistsAction action,bool changeComboBox)
+{
+ alwaysDoThisActionForFolderExists=action;
+ emit signal_setFolderColision(alwaysDoThisActionForFolderExists);
+ if(!changeComboBox || !uiIsInstalled)
+ return;
+ switch(action)
+ {
+ case FolderExists_Merge:
+ ui->comboBoxFolderColision->setCurrentIndex(1);
+ break;
+ case FolderExists_Skip:
+ ui->comboBoxFolderColision->setCurrentIndex(2);
+ break;
+ case FolderExists_Rename:
+ ui->comboBoxFolderColision->setCurrentIndex(3);
+ break;
+ default:
+ ui->comboBoxFolderColision->setCurrentIndex(0);
+ break;
+ }
+}
+
+void copyEngine::setComboBoxFolderError(FileErrorAction action,bool changeComboBox)
+{
+ alwaysDoThisActionForFileError=action;
+ if(!changeComboBox || !uiIsInstalled)
+ return;
+ switch(action)
+ {
+ case FileError_Skip:
+ ui->comboBoxFolderError->setCurrentIndex(1);
+ break;
+ default:
+ ui->comboBoxFolderError->setCurrentIndex(0);
+ break;
+ }
+}
+
+void copyEngine::doChecksum_toggled(bool doChecksum)
+{
+ listThread->set_doChecksum(doChecksum);
+}
+
+void copyEngine::checksumOnlyOnError_toggled(bool checksumOnlyOnError)
+{
+ listThread->set_checksumOnlyOnError(checksumOnlyOnError);
+}
+
+void copyEngine::checksumIgnoreIfImpossible_toggled(bool checksumIgnoreIfImpossible)
+{
+ listThread->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+}
+
+void copyEngine::osBuffer_toggled(bool osBuffer)
+{
+ listThread->set_osBuffer(osBuffer);
+ updateBufferCheckbox();
+}
+
+void copyEngine::osBufferLimited_toggled(bool osBufferLimited)
+{
+ listThread->set_osBufferLimited(osBufferLimited);
+ updateBufferCheckbox();
+}
+
+void copyEngine::osBufferLimit_editingFinished()
+{
+ emit send_osBufferLimit(ui->osBufferLimit->value());
+}
+
+void copyEngine::showFilterDialog()
+{
+ if(filters!=NULL)
+ filters->exec();
+}
+
+void copyEngine::sendNewFilters()
+{
+ if(filters!=NULL)
+ emit send_setFilters(filters->getInclude(),filters->getExclude());
+}
+
+void copyEngine::sendNewRenamingRules(QString firstRenamingRule,QString otherRenamingRule)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"new filter");
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ emit send_sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+void copyEngine::showRenamingRules()
+{
+ if(renamingRules==NULL)
+ {
+ QMessageBox::critical(NULL,tr("Options error"),tr("Options engine is not loaded, can't access to the filters"));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"options not loaded");
+ return;
+ }
+ renamingRules->exec();
+}
+
+void copyEngine::get_realBytesTransfered(quint64 realBytesTransfered)
+{
+ size_for_speed=realBytesTransfered;
+}
+
+void copyEngine::newActionInProgess(EngineActionInProgress action)
+{
+ if(action==Idle)
+ {
+ timerProgression.stop();
+ timerActionDone.stop();
+ }
+ else
+ {
+ timerProgression.start();
+ timerActionDone.start();
+ }
+}
+
+//dialog message
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::fileAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread)
+{
+ emit collision();
+}
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::errorOnFileSlot(QFileInfo fileInfo,QString errorString,TransferThread * thread)
+{
+ emit error();
+}
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::folderAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,scanFileOrFolder * thread)
+{
+ emit collision();
+}
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::errorOnFolderSlot(QFileInfo fileInfo,QString errorString,scanFileOrFolder * thread)
+{
+ emit error();
+}
+
+//mkpath event
+void copyEngine::mkPathErrorOnFolderSlot(QFileInfo folder,QString error)
+{
+ emit error();
+}
+
+//rmpath event
+void copyEngine::rmPathErrorOnFolderSlot(QFileInfo folder,QString error)
+{
+ emit error();
+}
+
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the action
+ if(isSame)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file is same: "+source.absoluteFilePath());
+ tempFileExistsAction=alwaysDoThisActionForFileExists;
+ if(tempFileExistsAction==FileExists_Overwrite || tempFileExistsAction==FileExists_OverwriteIfNewer || tempFileExistsAction==FileExists_OverwriteIfNotSameModificationDate)
+ tempFileExistsAction=FileExists_NotSet;
+ switch(tempFileExistsAction)
+ {
+ case FileExists_Skip:
+ case FileExists_Rename:
+ thread->setFileExistsAction(tempFileExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=thread;
+ newItem.scan=NULL;
+ alreadyExistsQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ fileIsSameDialog dialog(interface,source,firstRenamingRule,otherRenamingRule);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileExistsAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileExists)
+ {
+ alwaysDoThisActionForFileExists=newAction;
+ listThread->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ switch(newAction)
+ {
+ default:
+ case FileExists_Skip:
+ emit newCollisionAction("skip");
+ break;
+ case FileExists_Rename:
+ emit newCollisionAction("rename");
+ break;
+ }
+ }
+ if(dialog.getAlways() || newAction!=FileExists_Rename)
+ thread->setFileExistsAction(newAction);
+ else
+ thread->setFileRename(dialog.getNewName());
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file already exists: "+source.absoluteFilePath()+", destination: "+destination.absoluteFilePath());
+ tempFileExistsAction=alwaysDoThisActionForFileExists;
+ switch(tempFileExistsAction)
+ {
+ case FileExists_Skip:
+ case FileExists_Rename:
+ case FileExists_Overwrite:
+ case FileExists_OverwriteIfNewer:
+ case FileExists_OverwriteIfNotSameModificationDate:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"always do this action: "+QString::number(tempFileExistsAction));
+ thread->setFileExistsAction(tempFileExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QString("dialog open, put in queue: %1 %2")
+ .arg(source.absoluteFilePath())
+ .arg(destination.absoluteFilePath())
+ );
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=thread;
+ newItem.scan=NULL;
+ alreadyExistsQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ fileExistsDialog dialog(interface,source,destination,firstRenamingRule,otherRenamingRule);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileExistsAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileExists)
+ {
+ alwaysDoThisActionForFileExists=newAction;
+ listThread->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ switch(newAction)
+ {
+ default:
+ case FileExists_Skip:
+ emit newCollisionAction("skip");
+ break;
+ case FileExists_Rename:
+ emit newCollisionAction("rename");
+ break;
+ case FileExists_Overwrite:
+ emit newCollisionAction("overwrite");
+ break;
+ case FileExists_OverwriteIfNewer:
+ emit newCollisionAction("overwriteIfNewer");
+ break;
+ case FileExists_OverwriteIfNotSameModificationDate:
+ emit newCollisionAction("overwriteIfNotSameModificationDate");
+ break;
+ }
+ }
+ if(dialog.getAlways() || newAction!=FileExists_Rename)
+ thread->setFileExistsAction(newAction);
+ else
+ thread->setFileRename(dialog.getNewName());
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit queryOneNewDialog()");
+ emit queryOneNewDialog();
+ }
+ return;
+ break;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::errorOnFile(QFileInfo fileInfo,QString errorString,TransferThread * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+fileInfo.absoluteFilePath()+", error: "+errorString);
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the action
+ tempFileErrorAction=alwaysDoThisActionForFileError;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ thread->skip();
+ return;
+ case FileError_Retry:
+ thread->retryAfterError();
+ return;
+ case FileError_PutToEndOfTheList:
+ /// \todo do the read transfer locator and put at the end
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"todo list item not found");
+ return;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=fileInfo;
+ newItem.mkPath=false;
+ newItem.rmPath=false;
+ newItem.scan=NULL;
+ newItem.transfer=thread;
+ errorQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ emit error(fileInfo.absoluteFilePath(),fileInfo.size(),fileInfo.lastModified(),errorString);
+ fileErrorDialog dialog(interface,fileInfo,errorString);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ alwaysDoThisActionForFileError=newAction;
+ switch(newAction)
+ {
+ default:
+ case FileError_Skip:
+ emit newErrorAction("skip");
+ break;
+ case FileError_PutToEndOfTheList:
+ emit newErrorAction("putToEndOfTheList");
+ break;
+ }
+ }
+ switch(newAction)
+ {
+ case FileError_Skip:
+ thread->skip();
+ break;
+ case FileError_Retry:
+ thread->retryAfterError();
+ break;
+ case FileError_PutToEndOfTheList:
+ thread->putAtBottom();
+ /// \todo do the read transfer locator and put at the end
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"todo");
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"file error action wrong");
+ break;
+ }
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"isCalledByShowOneNewDialog==true then not show other dial");
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::folderAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,scanFileOrFolder * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"folder already exists: "+source.absoluteFilePath()+", destination: "+destination.absoluteFilePath());
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the always action
+ tempFolderExistsAction=alwaysDoThisActionForFolderExists;
+ switch(tempFolderExistsAction)
+ {
+ case FolderExists_Skip:
+ case FolderExists_Rename:
+ case FolderExists_Merge:
+ thread->setFolderExistsAction(tempFolderExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=NULL;
+ newItem.scan=thread;
+ alreadyExistsQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ folderExistsDialog dialog(interface,source,isSame,destination,firstRenamingRule,otherRenamingRule);
+ dialog.exec();/// \bug crash when external close
+ FolderExistsAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FolderExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFolderExists)
+ setComboBoxFolderColision(newAction);
+ if(!dialog.getAlways() && newAction==FolderExists_Rename)
+ thread->setFolderExistsAction(newAction,dialog.getNewName());
+ else
+ thread->setFolderExistsAction(newAction);
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+}
+
+/// \note Can be call without queue because all call will be serialized
+/// \todo all this part
+void copyEngine::errorOnFolder(QFileInfo fileInfo,QString errorString,scanFileOrFolder * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+fileInfo.absoluteFilePath()+", error: "+errorString);
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the always action
+ tempFileErrorAction=alwaysDoThisActionForFolderError;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ case FileError_Retry:
+ case FileError_PutToEndOfTheList:
+ thread->setFolderErrorAction(tempFileErrorAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=fileInfo;
+ newItem.mkPath=false;
+ newItem.rmPath=false;
+ newItem.scan=thread;
+ newItem.transfer=NULL;
+ errorQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ emit error(fileInfo.absoluteFilePath(),fileInfo.size(),fileInfo.lastModified(),errorString);
+ fileErrorDialog dialog(interface,fileInfo,errorString);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ setComboBoxFolderError(newAction);
+ dialogIsOpen=false;
+ thread->setFolderErrorAction(newAction);
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+// -----------------------------------------------------
+
+//mkpath event
+void copyEngine::mkPathErrorOnFolder(QFileInfo folder,QString errorString,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+folder.absoluteFilePath()+", error: "+errorString);
+ //load the always action
+ tempFileErrorAction=alwaysDoThisActionForFolderError;
+ error_index=0;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ listThread->mkPathQueue.skip();
+ return;
+ case FileError_Retry:
+ listThread->mkPathQueue.retry();
+ return;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=folder;
+ newItem.mkPath=true;
+ newItem.rmPath=false;
+ newItem.scan=NULL;
+ newItem.transfer=NULL;
+ errorQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ emit error(folder.absoluteFilePath(),folder.size(),folder.lastModified(),errorString);
+ fileErrorDialog dialog(interface,folder,errorString,false);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ setComboBoxFolderError(newAction);
+ alwaysDoThisActionForFolderError=newAction;
+ }
+ dialogIsOpen=false;
+ switch(newAction)
+ {
+ case FileError_Skip:
+ listThread->mkPathQueue.skip();
+ break;
+ case FileError_Retry:
+ listThread->mkPathQueue.retry();
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unknow switch case: "+QString::number(newAction));
+ break;
+ }
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//rmpath event
+void copyEngine::rmPathErrorOnFolder(QFileInfo folder,QString errorString,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+folder.absoluteFilePath()+", error: "+errorString);
+ //load the always action
+ tempFileErrorAction=alwaysDoThisActionForFolderError;
+ error_index=0;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ listThread->rmPathQueue.skip();
+ return;
+ case FileError_Retry:
+ listThread->rmPathQueue.retry();
+ return;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=folder;
+ newItem.mkPath=false;
+ newItem.rmPath=true;
+ newItem.scan=NULL;
+ newItem.transfer=NULL;
+ errorQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
+ emit error(folder.absoluteFilePath(),folder.size(),folder.lastModified(),errorString);
+ fileErrorDialog dialog(interface,folder,errorString,false);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ setComboBoxFolderError(newAction);
+ alwaysDoThisActionForFolderError=newAction;
+ }
+ dialogIsOpen=false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"do the action");
+ switch(newAction)
+ {
+ case FileError_Skip:
+ listThread->rmPathQueue.skip();
+ break;
+ case FileError_Retry:
+ listThread->rmPathQueue.retry();
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unknow switch case: "+QString::number(newAction));
+ break;
+ }
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//show one new dialog if needed
+void copyEngine::showOneNewDialog()
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"alreadyExistsQueue.size(): "+QString::number(alreadyExistsQueue.size()));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"errorQueue.size(): "+QString::number(errorQueue.size()));
+ loop_size=alreadyExistsQueue.size();
+ while(loop_size>0)
+ {
+ if(alreadyExistsQueue.first().transfer!=NULL)
+ {
+ fileAlreadyExists(alreadyExistsQueue.first().source,
+ alreadyExistsQueue.first().destination,
+ alreadyExistsQueue.first().isSame,
+ alreadyExistsQueue.first().transfer,
+ true);
+ }
+ else if(alreadyExistsQueue.first().scan!=NULL)
+ folderAlreadyExists(alreadyExistsQueue.first().source,
+ alreadyExistsQueue.first().destination,
+ alreadyExistsQueue.first().isSame,
+ alreadyExistsQueue.first().scan,
+ true);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"bug, no thread actived");
+ alreadyExistsQueue.removeFirst();
+ loop_size--;
+ }
+ loop_size=errorQueue.size();
+ while(errorQueue.size()>0)
+ {
+ if(errorQueue.first().transfer!=NULL)
+ errorOnFile(errorQueue.first().inode,errorQueue.first().errorString,errorQueue.first().transfer,true);
+ else if(errorQueue.first().scan!=NULL)
+ errorOnFolder(errorQueue.first().inode,errorQueue.first().errorString,errorQueue.first().scan,true);
+ else if(errorQueue.first().mkPath)
+ mkPathErrorOnFolder(errorQueue.first().inode,errorQueue.first().errorString,true);
+ else if(errorQueue.first().rmPath)
+ rmPathErrorOnFolder(errorQueue.first().inode,errorQueue.first().errorString,true);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"bug, no thread actived");
+ errorQueue.removeFirst();
+ loop_size--;
+ }
+}
diff --git a/tools/unit-tester/copyEngine.h b/tools/unit-tester/copyEngine.h
new file mode 100644
index 0000000..7d81724
--- /dev/null
+++ b/tools/unit-tester/copyEngine.h
@@ -0,0 +1,263 @@
+/** \file copyEngine.h
+\brief Define the copy engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QObject>
+#include <QList>
+#include <QStringList>
+#include <QFileInfo>
+#include <QFile>
+#include <QFileDialog>
+#include <QMessageBox>
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "fileErrorDialog.h"
+#include "fileExistsDialog.h"
+#include "folderExistsDialog.h"
+#include "fileIsSameDialog.h"
+#include "ui_options.h"
+#include "Environment.h"
+#include "ListThread.h"
+#include "Filters.h"
+#include "RenamingRules.h"
+
+#ifndef COPY_ENGINE_H
+#define COPY_ENGINE_H
+
+namespace Ui {
+ class options;
+}
+
+/// \brief the implementation of copy engine plugin, manage directly few stuff, else pass to ListThread class.
+class copyEngine : public PluginInterface_CopyEngine
+{
+ Q_OBJECT
+public:
+ enum SupportedTest{Test_Copy};
+
+ copyEngine(const QString &path,const QList<SupportedTest> &tests);
+ ~copyEngine();
+private:
+ ListThread *listThread;
+ bool dialogIsOpen;
+ QList<SupportedTest> tests;
+private slots:
+ void fileAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread);
+ void errorOnFileSlot(QFileInfo fileInfo,QString errorString,TransferThread * thread);
+ void folderAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,scanFileOrFolder * thread);
+ void errorOnFolderSlot(QFileInfo fileInfo,QString errorString,scanFileOrFolder * thread);
+ void mkPathErrorOnFolderSlot(QFileInfo,QString);
+ void rmPathErrorOnFolderSlot(QFileInfo,QString);
+
+ //dialog message
+ /// \note Can be call without queue because all call will be serialized
+ void fileAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread,bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFile(QFileInfo fileInfo,QString errorString,TransferThread * thread,bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void folderAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,scanFileOrFolder * thread,bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFolder(QFileInfo fileInfo,QString errorString,scanFileOrFolder * thread,bool isCalledByShowOneNewDialog=false);
+ //mkpath event
+ void mkPathErrorOnFolder(QFileInfo,QString,bool isCalledByShowOneNewDialog=false);
+ //rmpath event
+ void rmPathErrorOnFolder(QFileInfo,QString,bool isCalledByShowOneNewDialog=false);
+
+ //show one new dialog if needed
+ void showOneNewDialog();
+ void sendNewFilters();
+
+ void doChecksum_toggled(bool);
+ void checksumOnlyOnError_toggled(bool);
+ void checksumIgnoreIfImpossible_toggled(bool);
+ void osBuffer_toggled(bool);
+ void osBufferLimited_toggled(bool);
+ void osBufferLimit_editingFinished();
+ void showFilterDialog();
+ void sendNewRenamingRules(QString firstRenamingRule,QString otherRenamingRule);
+ void showRenamingRules();
+ void get_realBytesTransfered(quint64 realBytesTransfered);
+ void newActionInProgess(EngineActionInProgress);
+ void updateBufferCheckbox();
+public:
+ /** \brief to send the options panel
+ * \return return false if have not the options
+ * \param tempWidget the widget to generate on it the options */
+ bool getOptionsEngine(QWidget * tempWidget);
+ /** \brief to have interface widget to do modal dialog
+ * \param interface to have the widget of the interface, useful for modal dialog */
+ void setInterfacePointer(QWidget * interface);
+ //return empty if multiple
+ /** \brief compare the current sources of the copy, with the passed arguments
+ * \param sources the sources list to compares with the current sources list
+ * \return true if have same sources, else false (or empty) */
+ bool haveSameSource(const QStringList &sources);
+ /** \brief compare the current destination of the copy, with the passed arguments
+ * \param destination the destination to compares with the current destination
+ * \return true if have same destination, else false (or empty) */
+ bool haveSameDestination(const QString &destination);
+ //external soft like file browser have send copy/move list to do
+ /** \brief send copy without destination, ask the destination
+ * \param sources the sources list to copy
+ * \return true if the copy have been accepted */
+ bool newCopy(const QStringList &sources);
+ /** \brief send copy with destination
+ * \param sources the sources list to copy
+ * \param destination the destination to copy
+ * \return true if the copy have been accepted */
+ bool newCopy(const QStringList &sources,const QString &destination);
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \return true if the move have been accepted */
+ bool newMove(const QStringList &sources);
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \param destination the destination to move
+ * \return true if the move have been accepted */
+ bool newMove(const QStringList &sources,const QString &destination);
+ /** \brief send the new transfer list
+ * \param file the transfer list */
+ void newTransferList(const QString &file);
+
+ /** \brief to get byte read, use by Ultracopier for the speed calculation
+ * real size transfered to right speed calculation */
+ quint64 realByteTransfered();
+ //speed limitation
+ /** \brief get the speed limitation
+ * < -1 if not able, 0 if disabled */
+ qint64 getSpeedLimitation();
+ //get collision action
+ /** \brief get the collision action list */
+ QList<QPair<QString,QString> > getCollisionAction();
+ /** \brief get the collision error list */
+ QList<QPair<QString,QString> > getErrorAction();
+
+ /** \brief to set drives detected
+ * specific to this copy engine */
+ void setDrive(const QStringList &drives);
+
+ /** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+ void syncTransferList();
+
+ void set_doChecksum(bool doChecksum);
+ void set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible);
+ void set_checksumOnlyOnError(bool checksumOnlyOnError);
+ void set_osBuffer(bool osBuffer);
+ void set_osBufferLimited(bool osBufferLimited);
+ void set_osBufferLimit(unsigned int osBufferLimit);
+ void set_setFilters(QStringList includeStrings,QStringList includeOptions,QStringList excludeStrings,QStringList excludeOptions);
+ void setRenamingRules(QString firstRenamingRule,QString otherRenamingRule);
+public slots:
+ //user ask ask to add folder (add it with interface ask source/destination)
+ /** \brief add folder called on the interface
+ * Used by manual adding */
+ bool userAddFolder(const CopyMode &mode);
+ /** \brief add file called on the interface
+ * Used by manual adding */
+ bool userAddFile(const CopyMode &mode);
+ //action on the copy
+ /// \brief put the transfer in pause
+ void pause();
+ /// \brief resume the transfer
+ void resume();
+ /** \brief skip one transfer entry
+ * \param id id of the file to remove */
+ void skip(const quint64 &id);
+ /// \brief cancel all the transfer
+ void cancel();
+ //edit the transfer list
+ /** \brief remove the selected item
+ * \param ids ids is the id list of the selected items */
+ void removeItems(const QList<int> &ids);
+ /** \brief move on top of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnTop(const QList<int> &ids);
+ /** \brief move up the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsUp(const QList<int> &ids);
+ /** \brief move down the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsDown(const QList<int> &ids);
+ /** \brief move on bottom of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnBottom(const QList<int> &ids);
+
+ /** \brief give the forced mode, to export/import transfer list */
+ void forceMode(const CopyMode &mode);
+ /// \brief export the transfer list into a file
+ void exportTransferList();
+ /// \brief import the transfer list into a file
+ void importTransferList();
+
+ /** \brief to set the speed limitation
+ * -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const qint64 &speedLimitation);
+ //action
+ /// \brief to set the collision action
+ void setCollisionAction(const QString &action);
+ /// \brief to set the error action
+ void setErrorAction(const QString &action);
+
+ // specific to this copy engine
+
+ /// \brief set if the rights shoul be keep
+ void setRightTransfer(const bool doRightTransfer);
+ /// \brief set keep date
+ void setKeepDate(const bool keepDate);
+ /// \brief set block size in KB
+ void setBlockSize(const int blockSize);
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
+ /// \brief set if need check if the destination folder exists
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief reset widget
+ void resetTempWidget();
+ //autoconnect
+ void on_comboBoxFolderColision_currentIndexChanged(int index);
+ void on_comboBoxFolderError_currentIndexChanged(int index);
+ /// \brief need retranslate the insterface
+ void newLanguageLoaded();
+private slots:
+ void setComboBoxFolderColision(FolderExistsAction action,bool changeComboBox=true);
+ void setComboBoxFolderError(FileErrorAction action,bool changeComboBox=true);
+ void warningTransferList(const QString &warning);
+ void errorTransferList(const QString &error);
+signals:
+ void error();
+ void collision();
+
+ //action on the copy
+ void signal_pause();
+ void signal_resume();
+ void signal_skip(const quint64 &id);
+
+ //edit the transfer list
+ void signal_removeItems(const QList<int> &ids);
+ void signal_moveItemsOnTop(const QList<int> &ids);
+ void signal_moveItemsUp(const QList<int> &ids);
+ void signal_moveItemsDown(const QList<int> &ids);
+ void signal_moveItemsOnBottom(const QList<int> &ids);
+
+ void signal_forceMode(const CopyMode &mode);
+ void signal_exportTransferList(const QString &fileName);
+ void signal_importTransferList(const QString &fileName);
+
+ //action
+ void signal_setCollisionAction(FileExistsAction alwaysDoThisActionForFileExists);
+ void signal_setComboBoxFolderColision(FolderExistsAction action);
+ void signal_setFolderColision(FolderExistsAction action);
+
+ //when the cancel is clicked on copy engine dialog
+ void cancelAll();
+
+ //other signals
+ void queryOneNewDialog();
+
+ void send_osBufferLimit(const unsigned int &osBufferLimit);
+ void send_setFilters(const QList<Filters_rules> &include,const QList<Filters_rules> &exclude);
+ void send_sendNewRenamingRules(QString firstRenamingRule,QString otherRenamingRule);
+};
+
+#endif // COPY_ENGINE_H
diff --git a/tools/unit-tester/copyEngineUnitTester.cpp b/tools/unit-tester/copyEngineUnitTester.cpp
new file mode 100644
index 0000000..5632576
--- /dev/null
+++ b/tools/unit-tester/copyEngineUnitTester.cpp
@@ -0,0 +1,104 @@
+/** \file copyEngine.cpp
+\brief Define the copy engine
+ */
+
+#include "copyEngineUnitTester.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+copyEngineUnitTester::copyEngineUnitTester(const QString &path,const QList<SupportedTest> &tests)
+{
+ this->path=path;
+ connect(&timer,&QTimer::timeout,this,&copyEngineUnitTester::initialize,Qt::QueuedConnection);
+ srand ( time(NULL) );
+}
+
+copyEngineUnitTester::~copyEngineUnitTester()
+{
+ rmpath(path);
+}
+
+void copyEngineUnitTester::errorSlot()
+{
+}
+
+void copyEngineUnitTester::collisionSlot()
+{
+}
+
+void copyEngineUnitTester::initialize()
+{
+ initializeSource();
+}
+
+void copyEngineUnitTester::initializeSource()
+{
+ QDir dir(path);
+ dir.mkpath(path);
+ dir.mkpath(path+"/source/");
+ dir.mkpath(path+"/destination/");
+}
+
+bool copyEngineUnitTester::mkFile(const QString &dir,const quint16 &minSize,const quint16 &maxSize)
+{
+ QString name;
+ int index=0;
+ while(index<(16/4))
+ {
+ name+=QString::number(rand()%10000);
+ index++;
+ }
+ QFile file(dir+"/"+name);
+ if(file.open(QIODevice::WriteOnly))
+ {
+ int size=minSize+(rand()%(maxSize-minSize));
+ int index=0;
+ QByteArray byte;
+ while(index<size)
+ {
+ byte[0]=rand()%256;
+ file.write(byte);
+ index++;
+ }
+ file.close();
+ return true;
+ }
+ else
+ {
+ qDebug() << file.errorString();
+ return false;
+ }
+}
+
+/** remplace QDir::rmpath() because it return false if the folder not exists
+ and seam bug with parent folder */
+bool copyEngineUnitTester::rmpath(const QDir &dir)
+{
+ if(!dir.exists())
+ return true;
+ bool allHaveWork=true;
+ QFileInfoList list = dir.entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst);
+ for (int i = 0; i < list.size(); ++i)
+ {
+ QFileInfo fileInfo(list.at(i));
+ if(!fileInfo.isDir())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName());
+ allHaveWork=false;
+ }
+ else
+ {
+ //return the fonction for scan the new folder
+ if(!rmpath(dir.absolutePath()+'/'+fileInfo.fileName()+'/'))
+ allHaveWork=false;
+ }
+ }
+ if(!allHaveWork)
+ return allHaveWork;
+ allHaveWork=dir.rmdir(dir.absolutePath());
+ if(!allHaveWork)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove the folder: "+dir.absolutePath());
+ return allHaveWork;
+}
diff --git a/tools/unit-tester/copyEngineUnitTester.h b/tools/unit-tester/copyEngineUnitTester.h
new file mode 100644
index 0000000..c64804c
--- /dev/null
+++ b/tools/unit-tester/copyEngineUnitTester.h
@@ -0,0 +1,46 @@
+/** \file copyEngine.h
+\brief Define the copy engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QObject>
+#include <QList>
+#include <QStringList>
+#include <QFileInfo>
+#include <QFile>
+#include <QTimer>
+
+#include "copyEngine.h"
+
+#ifndef COPY_ENGINE_UNIT_TESTER_H
+#define COPY_ENGINE_UNIT_TESTER_H
+
+namespace Ui {
+ class options;
+}
+
+/// \brief the implementation of copy engine plugin, manage directly few stuff, else pass to ListThread class.
+class copyEngineUnitTester : public copyEngine
+{
+ Q_OBJECT
+public:
+ enum SupportedTest{Test_Copy};
+
+ copyEngineUnitTester(const QString &path,const QList<SupportedTest> &tests);
+ ~copyEngineUnitTester();
+private:
+ ListThread *listThread;
+ bool dialogIsOpen;
+ QList<SupportedTest> tests;
+ QTimer timer;
+ QString path;
+ void initializeSource();
+ bool rmpath(const QDir &dir);
+ bool mkFile(const QString &dir,const quint16 &minSize=0,const quint16 &maxSize=65535);
+private slots:
+ void errorSlot();
+ void collisionSlot();
+ void initialize();
+};
+
+#endif // COPY_ENGINE_UNIT_TESTER_H
diff --git a/tools/unit-tester/main.cpp b/tools/unit-tester/main.cpp
new file mode 100644
index 0000000..3731aeb
--- /dev/null
+++ b/tools/unit-tester/main.cpp
@@ -0,0 +1,8 @@
+#include <QCoreApplication>
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication a(argc, argv);
+
+ return a.exec();
+}
diff --git a/tools/unit-tester/unit-tester.pro b/tools/unit-tester/unit-tester.pro
new file mode 100644
index 0000000..65dc00b
--- /dev/null
+++ b/tools/unit-tester/unit-tester.pro
@@ -0,0 +1,42 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2012-10-19T22:52:40
+#
+#-------------------------------------------------
+
+QT += core
+
+QT -= gui
+
+TARGET = unit-tester
+CONFIG += console
+CONFIG -= app_bundle
+
+TEMPLATE = app
+
+
+SOURCES += main.cpp \
+ ../../plugins/CopyEngine/Ultracopier/ReadThread.cpp \
+ ../../plugins/CopyEngine/Ultracopier/AvancedQFile.cpp \
+ ../../plugins/CopyEngine/Ultracopier/WriteThread.cpp \
+ ../../plugins/CopyEngine/Ultracopier/TransferThread.cpp \
+ ../../plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp \
+ ../../plugins/CopyEngine/Ultracopier/ListThread.cpp \
+ ../../plugins/CopyEngine/Ultracopier/MkPath.cpp \
+ ../../plugins/CopyEngine/Ultracopier/scanFileOrFolder.cpp \
+ ../../plugins/CopyEngine/Ultracopier/RmPath.cpp \
+ copyEngineUnitTester.cpp \
+ copyEngine.cpp
+
+HEADERS += \
+ ../../plugins/CopyEngine/Ultracopier/ReadThread.h \
+ ../../plugins/CopyEngine/Ultracopier/AvancedQFile.h \
+ ../../plugins/CopyEngine/Ultracopier/Variable.h \
+ ../../plugins/CopyEngine/Ultracopier/WriteThread.h \
+ ../../plugins/CopyEngine/Ultracopier/TransferThread.h \
+ ../../plugins/CopyEngine/Ultracopier/ListThread.h \
+ ../../plugins/CopyEngine/Ultracopier/MkPath.h \
+ ../../plugins/CopyEngine/Ultracopier/scanFileOrFolder.h \
+ ../../plugins/CopyEngine/Ultracopier/RmPath.h \
+ copyEngineUnitTester.h \
+ copyEngine.h
diff --git a/ultracopier.dox b/ultracopier.dox
new file mode 100644
index 0000000..47b83b3
--- /dev/null
+++ b/ultracopier.dox
@@ -0,0 +1,39 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
+ * Ultracopier
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GPLv3
+ *****************************************************************************/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage Ultracopier
+
+ \section mainpage_overview Overview
+
+ Ultracopier provide an advanced copier with play/pause/resume, with advanced management like playlist.
+ This documentation is FOR DEVELOPMENT, use <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a> for end user documentation, general documentation, algorithm documentation.
+
+ \section mainpage_platforms Platforms
+
+ Ultracopier might be usable in all environments where you find Qt 5.\n
+ Ultracopier requires Qt 5.4 or newer. Tested on Qt 5.4.
+
+ \section mainpage_downloads Downloads
+
+ Stable releases are available at the Ultracopier
+ <a href="http://ultracopier.first-world.info/">project page</a>.
+
+ \section license GPL Version 3
+ The core, and some default plugin are under GPL Version 3. See into each part to see the license.\n
+ document-save.png -> all SystemTrayIcon/systray_* (color alteration) done by png manipulation of KDE's oxygen icon pack.\n
+ From 16x16/actions/: arrow-down.png -> moveDown.png, arrow-up.png -> moveUp.png \n
+ All Ultracopier are from devices/drive-removable-media-usb.png, and same icon with U is touched by gimp.\n
+ from 128x128: actions/application-exit.png -> none-128x128.png, apps/kbugbuster.png -> bug-128x128.png
+
+*/
+
diff --git a/ultracopier.pro b/ultracopier.pro
new file mode 100644
index 0000000..68c8886
--- /dev/null
+++ b/ultracopier.pro
@@ -0,0 +1,137 @@
+DEFINES += ULTRACOPIER_PLUGIN_ALL_IN_ONE
+
+include(other-pro/ultracopier-core.pro)
+
+RESOURCES += $$PWD/plugins/static-plugins.qrc \
+ $$PWD/plugins/CopyEngine/Ultracopier/copyEngineResources.qrc \
+ $$PWD/plugins/Themes/Oxygen/interfaceResources_unix.qrc \
+ $$PWD/plugins/Themes/Oxygen/interfaceResources_windows.qrc \
+ $$PWD/plugins/Themes/Oxygen/interfaceResources.qrc
+
+win32:RESOURCES += $$PWD/plugins/static-plugins-windows.qrc
+
+HEADERS -= $$PWD/lib/qt-tar-xz/xz.h \
+ $$PWD/lib/qt-tar-xz/QXzDecodeThread.h \
+ $$PWD/lib/qt-tar-xz/QXzDecode.h \
+ $$PWD/lib/qt-tar-xz/QTarDecode.h \
+ $$PWD/AuthPlugin.h
+SOURCES -= $$PWD/lib/qt-tar-xz/QXzDecodeThread.cpp \
+ $$PWD/lib/qt-tar-xz/QXzDecode.cpp \
+ $$PWD/lib/qt-tar-xz/QTarDecode.cpp \
+ $$PWD/lib/qt-tar-xz/xz_crc32.c \
+ $$PWD/lib/qt-tar-xz/xz_dec_stream.c \
+ $$PWD/lib/qt-tar-xz/xz_dec_lzma2.c \
+ $$PWD/lib/qt-tar-xz/xz_dec_bcj.c \
+ $$PWD/AuthPlugin.cpp
+INCLUDEPATH -= $$PWD/lib/qt-tar-xz/
+
+RESOURCES -= $$PWD/resources/resources-windows-qt-plugin.qrc
+
+DEFINES += ULTRACOPIER_PLUGIN_ALL_IN_ONE
+DEFINES += ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+
+FORMS += \
+ $$PWD/plugins/CopyEngine/Ultracopier/copyEngineOptions.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/debugDialog.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/DiskSpace.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/fileErrorDialog.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/fileExistsDialog.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/fileIsSameDialog.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/FilterRules.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/Filters.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/folderExistsDialog.ui \
+ $$PWD/plugins/CopyEngine/Ultracopier/RenamingRules.ui \
+ $$PWD/plugins/Themes/Oxygen/themesOptions.ui \
+ $$PWD/plugins/Themes/Oxygen/options.ui \
+ $$PWD/plugins/Themes/Oxygen/interface.ui
+
+HEADERS += \
+ $$PWD/plugins/CopyEngine/Ultracopier/AvancedQFile.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/CompilerInfo.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/CopyEngine.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/DebugDialog.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/DebugEngineMacro.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/DiskSpace.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/DriveManagement.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/Environment.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/CopyEngineFactory.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/FileErrorDialog.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/FileExistsDialog.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/FileIsSameDialog.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/FilterRules.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/Filters.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/FolderExistsDialog.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/MkPath.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/ListThread.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/ReadThread.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/RenamingRules.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/StructEnumDefinition_CopyEngine.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/StructEnumDefinition.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/TransferThread.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/Variable.h \
+ $$PWD/plugins/CopyEngine/Ultracopier/WriteThread.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/Variable.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/StructEnumDefinition.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/listener.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/Environment.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/DebugEngineMacro.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.h \
+ $$PWD/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/VariablesCatchcopy.h \
+ $$PWD/plugins/Themes/Oxygen/DebugEngineMacro.h \
+ $$PWD/plugins/Themes/Oxygen/Environment.h \
+ $$PWD/plugins/Themes/Oxygen/ThemesFactory.h \
+ $$PWD/plugins/Themes/Oxygen/interface.h \
+ $$PWD/plugins/Themes/Oxygen/Variable.h \
+ $$PWD/plugins/Themes/Oxygen/TransferModel.h \
+ $$PWD/plugins/Themes/Oxygen/StructEnumDefinition.h
+
+SOURCES += \
+ $$PWD/plugins/CopyEngine/Ultracopier/AvancedQFile.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/CopyEngine-collision-and-error.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/CopyEngine.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/DebugDialog.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/DiskSpace.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/DriveManagement.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/CopyEngineFactory.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/FileErrorDialog.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/FileExistsDialog.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/FileIsSameDialog.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/FilterRules.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/Filters.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/FolderExistsDialog.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/MkPath.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/ReadThread.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/RenamingRules.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/TransferThread.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/WriteThread.cpp \
+ $$PWD/plugins/CopyEngine/Ultracopier/ListThread.cpp \
+ $$PWD/plugins/Listener/catchcopy-v0002/listener.cpp \
+ $$PWD/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ClientCatchcopy.cpp \
+ $$PWD/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ExtraSocketCatchcopy.cpp \
+ $$PWD/plugins/Listener/catchcopy-v0002/catchcopy-api-0002/ServerCatchcopy.cpp \
+ $$PWD/plugins/Themes/Oxygen/ThemesFactory.cpp \
+ $$PWD/plugins/Themes/Oxygen/interface.cpp \
+ $$PWD/plugins/Themes/Oxygen/TransferModel.cpp
+
+win32 {
+ RESOURCES -= $$PWD/resources/resources-windows-qt-plugin.qrc
+
+ HEADERS += \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/StructEnumDefinition.h \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/pluginLoader.h \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/DebugEngineMacro.h \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/Environment.h \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/Variable.h \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/PlatformMacro.h \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.h
+ SOURCES += \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/pluginLoader.cpp \
+ $$PWD/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.cpp
+ FORMS += $$PWD/plugins/PluginLoader/catchcopy-v0002/OptionsWidget.ui
+ LIBS += -lole32 -lshell32
+}