Compare commits

...

39 Commits
2.6 ... 2.11.8

Author SHA1 Message Date
1fa3ec00bc version 2.11.8 2023-06-08 19:07:18 +02:00
b19f545958 version 2.11.7 2023-06-08 19:03:05 +02:00
f882ca5e42 bug resolved 2023-05-01 14:27:20 +02:00
c811f3db4f version 2.11.6 2023-04-27 11:43:06 +02:00
fc4f896d86 - resolved a bug in retrying donwload 2023-04-27 11:42:53 +02:00
f1a024c4b8 version 2.11.5 2023-04-26 17:30:55 +02:00
975361c8c9 bug in asking password resolved. 2023-04-26 17:30:38 +02:00
659498c826 version 2.11.4 2023-04-11 22:24:43 +02:00
636801fa29 version 2.11.3 2023-04-11 21:59:51 +02:00
de184ea284 added buildrequire in spec 2023-03-18 14:05:55 +01:00
fde12a2ebf version 2.11.2 2023-03-18 12:48:53 +01:00
cb61f40ee8 debug : scandir do not scan sub-directory 2023-03-18 12:48:39 +01:00
4c52276882 version 2.11.1 2023-03-17 13:26:01 +01:00
38c25450ed - display existing files in green and in red non-existing files but in downloaded list 2023-03-17 13:25:32 +01:00
6c19dccf2e version 2.11 2023-03-17 13:04:14 +01:00
ad3b44b3f4 added saving list of downloaded files and they are displayed in red in the treeview 2023-03-17 13:04:03 +01:00
6a381c05c8 removed includes of unused libraries and code correction 2023-03-11 13:59:55 +01:00
106727506d removed includes of unused libraries 2023-03-11 13:56:19 +01:00
e10558ff5b bug correction: when stopping a dl an error when prompted 2023-03-11 13:53:05 +01:00
f40e4f9485 version 2.10.1 2023-03-11 13:31:19 +01:00
d82c8c942d debugging 2023-03-11 13:30:17 +01:00
1739b0adf3 version 2.10 2023-03-09 18:14:03 +01:00
fada0ebeb0 added storing password in a secure way 2023-03-09 18:13:46 +01:00
bc90ce2269 version 2.9.2 2023-03-08 16:15:18 +01:00
0a1aa6c4fd code cleaning 2023-03-08 16:09:17 +01:00
8df2a651a3 version 2.9.1 2023-03-08 16:03:44 +01:00
5f5277199a correction of password managment 2023-03-08 16:03:24 +01:00
63bcc965b5 added selecting user for password protected services 2023-03-05 14:18:43 +01:00
42a7376f58 version 2.9 2023-03-05 13:39:39 +01:00
83ef43fab1 testing password encryption 2023-03-05 13:39:16 +01:00
9d305b0b3b added date in qtreeview\nadded retry in case of download error 2023-03-05 13:38:28 +01:00
711ca7d1cd added mime filetype in qtreeview 2023-03-04 19:12:13 +01:00
927c4a932a some code cleaning\nSize in treeview is now hulan readable\nbegin of password encryption 2023-03-04 17:33:18 +01:00
8227c76a88 version 2.8 2023-03-02 20:20:08 +01:00
d326e63a2f added icon to directory in qtreeview 2023-03-02 20:19:20 +01:00
85dc65fc9e version 2.7 2023-03-02 17:06:46 +01:00
04b46b1b86 added access to gidden services 2023-03-02 17:06:15 +01:00
6bfbfe1c78 version 2.6.1 2023-03-01 15:50:55 +01:00
7e736b524e bug correction in making treeview 2023-03-01 15:50:37 +01:00
17 changed files with 740 additions and 705 deletions

View File

@ -22,6 +22,7 @@ Un clic gauche sur un fichier l'ajoute à la file des téléchargements, sur un
Un clic droit sur un dossier ouvre un menu contextuel permettant de télécharger le dossier entier. Un clic droit sur un dossier ouvre un menu contextuel permettant de télécharger le dossier entier.
Une notification s'affiche lors du début, de la fin, et lorsque l'on stoppe un téléchargement. Une notification s'affiche lors du début, de la fin, et lorsque l'on stoppe un téléchargement.
Le gadget de fermeture ferme la fenêtre mais ne quitte pas l'application, pour afficher à nouveau la fenêtre, cliquez sur l'icône dans la boite à miniatures. Le gadget de fermeture ferme la fenêtre mais ne quitte pas l'application, pour afficher à nouveau la fenêtre, cliquez sur l'icône dans la boite à miniatures.
Un identifiant et un mot de passe lorsqu'un service est protégé par mot de passe, celui-ci est enregistré dans le portefeuille système(gome-keyring ou kwallet)
## File de téléchargement ## File de téléchargement
@ -30,7 +31,7 @@ Cliquez sur un fichier pour le supprimer de la file et une fenêtre de confirmat
## Barre d'outils ## Barre d'outils
1er icône: Changer le dossier de destination 1er icône: Changer le dossier de destination
Permet de changer le dossier de téléchargement par défaut pour chaque service de chaque serveur. - Permet de changer le dossier de téléchargement par défaut pour chaque service de chaque serveur.
2ème icône: Paramètres de l'application 2ème icône: Paramètres de l'application
- Limite de bande passante - Limite de bande passante
@ -41,7 +42,7 @@ Cliquez sur un fichier pour le supprimer de la file et une fenêtre de confirmat
- Enregistrement automatique - Enregistrement automatique
Enregistre automatiquement la liste des téléchargements en cours.(activé par défaut) Enregistre automatiquement la liste des téléchargements en cours.(activé par défaut)
3ème icône: À propos 3ème icône: À propos
Affiche les propriétés de l'application. - Affiche les propriétés de l'application.
4ème icône: À propos de QT 4ème icône: À propos de QT
5 ème icône: Quitter 5ème icône: Quitter
Permet de quitter le programme. Permet de quitter le programme.

View File

@ -1,4 +1,4 @@
QT += core gui concurrent QT += core gui
QT += KItemViews QT += KItemViews
QT += KCompletion QT += KCompletion
QT += widgets QT += widgets
@ -6,10 +6,11 @@ QT += KConfigCore KConfigGui
QT += KCoreAddons QT += KCoreAddons
QT += KDBusAddons QT += KDBusAddons
#LIBS += -lKF5WindowSystem LIBS += -lqt5keychain
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11 CONFIG += c++17
#DEFINES += QTKEYCHAIN_NO_EXPORT
# You can make your code fail to compile if it uses deprecated APIs. # You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line. # In order to do so, uncomment the following line.
@ -19,24 +20,27 @@ SOURCES += \
downloadfile.cpp \ downloadfile.cpp \
main.cpp \ main.cpp \
mainwindow.cpp \ mainwindow.cpp \
password.cpp \
tools.cpp tools.cpp
HEADERS += \ HEADERS += \
version.h\
downloadfile.h \ downloadfile.h \
mainwindow.h \ mainwindow.h \
password.h \
tools.h tools.h
FORMS += \ FORMS += \
about.ui \ about.ui \
configuration.ui \ configuration.ui \
login.ui \
mainwindow.ui mainwindow.ui
TRANSLATIONS += \ TRANSLATIONS += \
RsyncUI_fr_FR.ts RsyncUI_fr_FR.ts
INCLUDEPATH += \ INCLUDEPATH += \
/usr/include/KF5 /usr/include/KF5 \
/usr/include/qt5keychain \
# Default rules for deployment. # Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin qnx: target.path = /tmp/$${TARGET}/bin
@ -48,7 +52,7 @@ INSTALLS += documentation
INSTALLS += desktopfile INSTALLS += desktopfile
INSTALLS += icon INSTALLS += icon
RESOURCES += #RESOURCES +=
DISTFILES += \ DISTFILES += \
RsyncUI.desktop RsyncUI.desktop

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.14.2, 2023-03-01T13:05:08. --> <!-- Written by QtCreator 9.0.1, 2023-05-01T14:24:07. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>
@ -8,7 +8,7 @@
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.ActiveTarget</variable> <variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value> <value type="qlonglong">0</value>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.EditorSettings</variable> <variable>ProjectExplorer.Project.EditorSettings</variable>
@ -28,7 +28,7 @@
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap> </valuemap>
</valuemap> </valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value> <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value> <value type="int" key="EditorConfiguration.IndentSize">4</value>
@ -37,6 +37,7 @@
<value type="bool" key="EditorConfiguration.MouseHiding">true</value> <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value> <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value> <value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value> <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
@ -45,6 +46,7 @@
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value> <value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value> <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value> <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
@ -52,6 +54,7 @@
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value> <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value> <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value> <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap> </valuemap>
</data> </data>
<data> <data>
@ -59,6 +62,7 @@
<valuemap type="QVariantMap"> <valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks"> <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value> <value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value> <value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value> <value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value> <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
@ -80,27 +84,28 @@
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/> <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value> <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="CppEditor.QuickFix">
<value type="bool" key="UseGlobalSettings">true</value>
</valuemap>
</valuemap> </valuemap>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.Target.0</variable> <variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap"> <valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value> <value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.15.7 (qt5)</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 5.15.7 (qt5)</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{893f9ca6-0efa-4c08-a4a6-5a818f60a8a0}</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{a8a6d767-5e05-45c7-b70b-532f99112b6a}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/daniel/develop/RsyncUI</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/daniel/develope/build-RsyncUI-Desktop-Debug</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/daniel/develop/RsyncUI</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/daniel/develope/build-RsyncUI-Desktop-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap> </valuemap>
@ -108,7 +113,7 @@
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
@ -119,47 +124,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="int" key="RunSystemFunction">0</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/daniel/develope/build-RsyncUI-Desktop-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/daniel/develope/build-RsyncUI-Desktop-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
@ -167,60 +132,16 @@
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="RunSystemFunction">0</value>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/daniel/develope/build-RsyncUI-Desktop-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/home/daniel/develope/build-RsyncUI-Desktop-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="RunSystemFunction">0</value>
<value type="int" key="SeparateDebugInfo">0</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
@ -230,69 +151,15 @@
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value> <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value> <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<valuelist type="QVariantList" key="CustomOutputParsers"/> <valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value> <value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">RsyncUI2</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">RsyncUI</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/daniel/develop/RsyncUI/RsyncUI.pro</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/daniel/develop/RsyncUI/RsyncUI.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/daniel/develop/RsyncUI/RsyncUI.pro</value> <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/daniel/develop/RsyncUI/RsyncUI.pro</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value> <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
@ -300,14 +167,14 @@
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/daniel/develope/build-RsyncUI-Desktop-Debug</value> <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/daniel/develop/RsyncUI</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap> </valuemap>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.TargetCount</variable> <variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value> <value type="qlonglong">1</value>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable> <variable>ProjectExplorer.Project.Updater.FileVersion</variable>

View File

@ -2,7 +2,7 @@
Name: rsyncui Name: rsyncui
Summary: Client for rsync server Summary: Client for rsync server
Version: 2.6 Version: 2.11.8
Release: %mkrel 1 Release: %mkrel 1
License: GPLv3 License: GPLv3
Group: Networking/Remote access Group: Networking/Remote access
@ -27,7 +27,7 @@ BuildRequires: cmake(KF5Config)
BuildRequires: cmake(KF5ItemViews) BuildRequires: cmake(KF5ItemViews)
BuildRequires: pstreams-devel BuildRequires: pstreams-devel
BuildRequires: boost-devel BuildRequires: boost-devel
BuildRequires: qt5keychain-devel
#Requires: kitemviews #Requires: kitemviews
#Requires: kcompletion #Requires: kcompletion
#Requires: kcoreaddons #Requires: kcoreaddons

View File

@ -69,29 +69,24 @@
<context> <context>
<name>LoginDialog</name> <name>LoginDialog</name>
<message> <message>
<location filename="login.ui" line="17"/>
<source>RsyncUI request</source> <source>RsyncUI request</source>
<translation>Requête RsyncUI</translation> <translation type="vanished">Requête RsyncUI</translation>
</message> </message>
<message> <message>
<location filename="login.ui" line="51"/>
<source>Login name</source> <source>Login name</source>
<translation>Identifiant</translation> <translation type="vanished">Identifiant</translation>
</message> </message>
<message> <message>
<location filename="login.ui" line="79"/>
<source>Enter login</source> <source>Enter login</source>
<translation>Entrez votre identifiant</translation> <translation type="vanished">Entrez votre identifiant</translation>
</message> </message>
<message> <message>
<location filename="login.ui" line="86"/>
<source>Password</source> <source>Password</source>
<translation>Mot de passe</translation> <translation type="vanished">Mot de passe</translation>
</message> </message>
<message> <message>
<location filename="login.ui" line="102"/>
<source>Enter password</source> <source>Enter password</source>
<translation>Entrez votre mot de passe</translation> <translation type="vanished">Entrez votre mot de passe</translation>
</message> </message>
</context> </context>
<context> <context>
@ -149,94 +144,104 @@
<translation>Cliquez pour ajouter à la file de téléchargement</translation> <translation>Cliquez pour ajouter à la file de téléchargement</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="338"/> <location filename="mainwindow.ui" line="329"/>
<source>Filter...</source>
<translation>Filtrer...</translation>
</message>
<message>
<location filename="mainwindow.ui" line="341"/>
<source>Click on file to stop downloading</source> <source>Click on file to stop downloading</source>
<translation>Cliquez sur le document pour arrêter le téléchargement et l&apos;enlever de la file</translation> <translation>Cliquez sur le document pour arrêter le téléchargement et l&apos;enlever de la file</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="364"/> <location filename="mainwindow.ui" line="367"/>
<source>%p%</source> <source>%p%</source>
<extracomment>Downloading</extracomment> <extracomment>Downloading</extracomment>
<translation>Téléchargement</translation> <translation>Téléchargement</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="375"/> <location filename="mainwindow.ui" line="378"/>
<source>toolBar</source> <source>toolBar</source>
<translation>Barre d&apos;outils</translation> <translation>Barre d&apos;outils</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="448"/> <location filename="mainwindow.ui" line="452"/>
<source>Download</source> <source>Download</source>
<translation>Télécharger</translation> <translation>Télécharger</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="451"/> <location filename="mainwindow.ui" line="455"/>
<source>Click on menu button to download the entire folder</source> <source>Click on menu button to download the entire folder</source>
<translation>Cliquer sur le bouton droit de la souris pour télécharger le dossier entier</translation> <translation>Cliquer sur le bouton droit de la souris pour télécharger le dossier entier</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="460"/> <location filename="mainwindow.ui" line="464"/>
<source>Exit</source> <source>Exit</source>
<translation>Quitter</translation> <translation>Quitter</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="463"/> <location filename="mainwindow.ui" line="467"/>
<source>Terminate the program</source> <source>Terminate the program</source>
<translation>Terminer le programme</translation> <translation>Terminer le programme</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="466"/> <location filename="mainwindow.ui" line="470"/>
<source>Ctrl+Q</source> <source>Ctrl+Q</source>
<translation>Ctrl+Q</translation> <translation>Ctrl+Q</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="413"/> <location filename="mainwindow.ui" line="479"/>
<location filename="mainwindow.ui" line="416"/> <source>hidden service</source>
<translation>Service caché</translation>
</message>
<message>
<location filename="mainwindow.ui" line="417"/>
<location filename="mainwindow.ui" line="420"/>
<source>Change save folder</source> <source>Change save folder</source>
<translation>Changer le dossier de destination</translation> <translation>Changer le dossier de destination</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="425"/> <location filename="mainwindow.ui" line="429"/>
<source>About</source> <source>About</source>
<translation>À propos</translation> <translation>À propos</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="434"/> <location filename="mainwindow.ui" line="438"/>
<source>About Qt</source> <source>About Qt</source>
<translation>À propos de Qt</translation> <translation>À propos de Qt</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="443"/> <location filename="mainwindow.ui" line="447"/>
<source>Settings</source> <source>Settings</source>
<translation>Paramètres</translation> <translation>Paramètres</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="107"/> <location filename="mainwindow.h" line="125"/>
<source>KB</source> <source>KB</source>
<translation>Ko</translation> <translation>Ko</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="107"/> <location filename="mainwindow.h" line="126"/>
<source>MB</source> <source>MB</source>
<translation>Mo</translation> <translation>Mo</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="107"/> <location filename="mainwindow.h" line="127"/>
<source>GB</source> <source>GB</source>
<translation>Go</translation> <translation>Go</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="107"/> <location filename="mainwindow.h" line="128"/>
<source>TB</source> <source>TB</source>
<translation>To</translation> <translation>To</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="107"/> <location filename="mainwindow.h" line="129"/>
<source>PB</source> <source>PB</source>
<translation>Po</translation> <translation>Po</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="61"/> <location filename="mainwindow.cpp" line="59"/>
<source>You click on file to enqueue it, and RyncUI Download one file a time</source> <source>You click on file to enqueue it, and RyncUI Download one file a time</source>
<oldsource>Client for rsync server&lt;br&gt;&lt;br&gt;You click on file to enqueue it, and RyncUI Download one file a time</oldsource> <oldsource>Client for rsync server&lt;br&gt;&lt;br&gt;You click on file to enqueue it, and RyncUI Download one file a time</oldsource>
<translation>&lt;h3&gt;Utilisation&lt;/h3&gt; <translation>&lt;h3&gt;Utilisation&lt;/h3&gt;
@ -269,194 +274,260 @@ Cliquez sur un fichier pour le supprimer de la file et une fenêtre de confirmat
Permet de quitter le programme</translation> Permet de quitter le programme</translation>
</message> </message>
<message> <message>
<source>&lt;h2&gt;Client for rsync server&lt;2&gt;&lt;br&gt;&lt;br&gt;</source> <location filename="mainwindow.cpp" line="75"/>
<translation type="vanished">&lt;h2&gt;Client pour serveur rsync&lt;2&gt;&lt;br&gt;&lt;br&gt;éaa</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="78"/>
<source>Path</source> <source>Path</source>
<translation>Chemin</translation> <translation>Chemin</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="78"/> <location filename="mainwindow.cpp" line="75"/>
<source>Size</source> <source>Size</source>
<translation>Taille</translation> <translation>Taille</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="78"/> <location filename="mainwindow.cpp" line="75"/>
<source>Type</source> <source>Type</source>
<translation>Type</translation> <translation>Type</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="122"/> <location filename="mainwindow.cpp" line="75"/>
<source>Date</source>
<translation>Date</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="102"/>
<source>KB/s</source>
<translation>Ko/s</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="102"/>
<source>MB/s</source>
<translation>Mo/s</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="102"/>
<source>GB/s</source>
<translation>Go/s</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="102"/>
<source>TB/s</source>
<translation>To/s</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="102"/>
<source>PB/s</source>
<translation>Po/s</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="120"/>
<source>A list of interrupted downloads exists, do you want to continue downloading ? if not the list will be cleared</source> <source>A list of interrupted downloads exists, do you want to continue downloading ? if not the list will be cleared</source>
<translation>Une liste de téléchargement existe, voulez-vous utiliser cette liste ? si non, elle sera effacée</translation> <translation>Une liste de téléchargement existe, voulez-vous utiliser cette liste ? si non, elle sera effacée</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="151"/> <location filename="mainwindow.cpp" line="149"/>
<source>&amp;Quit</source> <source>&amp;Quit</source>
<translation>&amp;Quitter</translation> <translation>&amp;Quitter</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="208"/> <location filename="mainwindow.cpp" line="206"/>
<source>Clicking Save button, You can save the list of downloads <source>Clicking Save button, You can save the list of downloads
</source> </source>
<translation>Vous pouvez enregistrer la liste des téléchargements en cliquant sur &quot;enregister&quot; <translation>Vous pouvez enregistrer la liste des téléchargements en cliquant sur &quot;enregister&quot;
</translation> </translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="214"/> <location filename="mainwindow.cpp" line="212"/>
<source>Exiting will stop downloading, and will clear the download queue. <source>Exiting will stop downloading, and will clear the download queue.
Do you want to exit ?</source> Do you want to exit ?</source>
<translation>Si vous sortez, les téléchargements seront arrêter. <translation>Si vous sortez, les téléchargements seront arrêter.
Voulez-vous vraiment sortir ?</translation> Voulez-vous vraiment sortir ?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="252"/> <location filename="mainwindow.cpp" line="250"/>
<source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source> <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
<translation>Le programme continue dans la boîte à miniatures. Pour quitter le programme cliquez sur l&apos;icône &lt;b&gt;Quitter&lt;/b&gt; ou dans les menu contextuel.</translation> <translation>Le programme continue dans la boîte à miniatures. Pour quitter le programme cliquez sur l&apos;icône &lt;b&gt;Quitter&lt;/b&gt; ou dans les menu contextuel.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="492"/> <location filename="mainwindow.cpp" line="551"/>
<source>Authentication failed</source>
<translation>Mauvais mot de passe ou utilisateur</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="604"/>
<source>The processus does&apos;nt respond: </source> <source>The processus does&apos;nt respond: </source>
<translation>Le processus ne répond pas: </translation> <translation>Le processus ne répond pas: </translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="578"/> <location filename="mainwindow.cpp" line="690"/>
<source>server does not exists</source> <source>server does not exists</source>
<translation>Le serveur n&apos;existe pas</translation> <translation>Le serveur n&apos;existe pas</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="606"/> <location filename="mainwindow.cpp" line="726"/>
<location filename="mainwindow.cpp" line="626"/> <location filename="mainwindow.cpp" line="886"/>
<source>Dir</source> <source>Dir</source>
<translation>dossier</translation> <translation>dossier</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="610"/>
<location filename="mainwindow.cpp" line="740"/>
<source>File</source> <source>File</source>
<translation>Doc</translation> <translation type="vanished">Doc</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="751"/> <location filename="mainwindow.cpp" line="914"/>
<source>File is partially downloaded. Do you want to resume download ? if no, the file will be deleted from destination directory</source> <source>File is partially downloaded. Do you want to resume download ? if no, the file will be deleted from destination directory</source>
<translation>Le document est déjà partiellement téléchargé. Voulez vous continuer le téléchargemnt ? Si non, il sera supprimer du dossier de destination</translation> <translation>Le document est déjà partiellement téléchargé. Voulez vous continuer le téléchargemnt ? Si non, il sera supprimer du dossier de destination</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="768"/> <location filename="mainwindow.cpp" line="931"/>
<source>File is already downloaded. Do you want to reload it ? The old file will be deleted</source> <source>File is already downloaded. Do you want to reload it ? The old file will be deleted</source>
<translation>Le document est déjà téléchargé. Voulez-vous le télécharger à nouveau ? L&apos;ancien fichier sera effacé</translation> <translation>Le document est déjà téléchargé. Voulez-vous le télécharger à nouveau ? L&apos;ancien fichier sera effacé</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="805"/> <location filename="mainwindow.cpp" line="968"/>
<source>File is already downloading</source> <source>File is already downloading</source>
<translation>Le document est déjà en téléchargement</translation> <translation>Le document est déjà en téléchargement</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="830"/> <location filename="mainwindow.cpp" line="998"/>
<source>Starting downloading <source>Starting downloading
</source> </source>
<translation>Démarrage du téléchargement <translation>Démarrage du téléchargement
</translation> </translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="845"/> <location filename="mainwindow.cpp" line="1013"/>
<source>finished</source> <source>finished</source>
<translation>Terminé</translation> <translation>Terminé</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="853"/> <location filename="mainwindow.cpp" line="1023"/>
<source>Rsync process crashed</source> <source>Rsync process crashed</source>
<translation>Le processus rsync à planté</translation> <translation>Le processus rsync à planté</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="865"/> <location filename="mainwindow.cpp" line="1030"/>
<source>stopped by user</source> <source>stopped by user</source>
<translation>stoppé par l&apos;utilisateur</translation> <translation>stoppé par l&apos;utilisateur</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="871"/> <location filename="mainwindow.cpp" line="1041"/>
<source>
Do you want to retry?</source>
<translation>
Voulez-vous -essayer?</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="1050"/>
<source>Download </source> <source>Download </source>
<translation>Téléchargement </translation> <translation>Téléchargement </translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="56"/> <source>RsyncUI Request</source>
<translation type="vanished">Requête RsyncUI</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="1391"/>
<source>Hidden service name</source>
<translation>Nom du servcice caché</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="54"/>
<source>Version</source> <source>Version</source>
<translation>Version</translation> <translation>Version</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="55"/> <location filename="mainwindow.cpp" line="53"/>
<source>&lt;h2&gt;Client for rsync server&lt;/h2&gt;</source> <source>&lt;h2&gt;Client for rsync server&lt;/h2&gt;</source>
<translation>&lt;h2&gt;Client pour serveur rsync&lt;/h2&gt;</translation> <translation>&lt;h2&gt;Client pour serveur rsync&lt;/h2&gt;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="57"/> <location filename="mainwindow.cpp" line="55"/>
<source>Licence</source> <source>Licence</source>
<translation>License</translation> <translation>License</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="58"/> <location filename="mainwindow.cpp" line="56"/>
<source>Author</source> <source>Author</source>
<translation>Auteur</translation> <translation>Auteur</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="59"/> <location filename="mainwindow.cpp" line="57"/>
<source>EMail</source> <source>EMail</source>
<translation>Courriel</translation> <translation>Courriel</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="60"/> <location filename="mainwindow.cpp" line="58"/>
<source>Source code</source> <source>Source code</source>
<translation>Code source</translation> <translation>Code source</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="1036"/> <location filename="mainwindow.cpp" line="821"/>
<source>Select the user you want to connect with or enter a new one</source>
<translation>Choisissez l&apos;utilisateur avec lequel vous voulez vous connecter ou entrez en un nouveau</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="834"/>
<location filename="mainwindow.cpp" line="1390"/>
<source> Request</source>
<translation> Requête de mot de passe</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="835"/>
<source>Enter password</source>
<translation>Entrez votre mot de passe</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="1225"/>
<source>Since the save path is linked to service, you need to select a service before you can select a folder</source> <source>Since the save path is linked to service, you need to select a service before you can select a folder</source>
<translation>Vous devez sélectionnez un service pour pouvoir sélectionnez un dossier par défaut</translation> <translation>Vous devez sélectionnez un service pour pouvoir sélectionnez un dossier par défaut</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="1041"/> <location filename="mainwindow.cpp" line="1230"/>
<source>Choose folder where to save file</source> <source>Choose folder where to save file</source>
<translation>Choisissez un dossier enregistrer le document</translation> <translation>Choisissez un dossier enregistrer le document</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="932"/> <location filename="mainwindow.cpp" line="1121"/>
<source>Do you want to stop downloading and delete this file from download queue ?</source> <source>Do you want to stop downloading and delete this file from download queue ?</source>
<translation>Voulez-vous arrêter le téléchargement et enlever ce fichier de la file de téléchargement ?</translation> <translation>Voulez-vous arrêter le téléchargement et enlever ce fichier de la file de téléchargement ?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="946"/> <location filename="mainwindow.cpp" line="1136"/>
<source>Do you want to delete this file from download queue ?</source> <source>Do you want to delete this file from download queue ?</source>
<translation>Voulez-vous enlever ce fichier de la file de téléchargement ?</translation> <translation>Voulez-vous enlever ce fichier de la file de téléchargement ?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="137"/> <location filename="mainwindow.h" line="124"/>
<source>B</source>
<translation>o</translation>
</message>
<message>
<location filename="mainwindow.h" line="141"/>
<source>The process failed to start. Either the invoked program is missing, or you may have insufficient permissions or resources to invoke the program.</source> <source>The process failed to start. Either the invoked program is missing, or you may have insufficient permissions or resources to invoke the program.</source>
<translation>Le processus échoué, soit le programme est manquant, soit vous n&apos;avez pas l&apos;autorisation de l&apos;exécuter.</translation> <translation>Le processus échoué, soit le programme est manquant, soit vous n&apos;avez pas l&apos;autorisation de l&apos;exécuter.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="138"/> <location filename="mainwindow.h" line="142"/>
<source>The process crashed some time after starting successfully.</source> <source>The process crashed some time after starting successfully.</source>
<translation>Le processus à planté après avoir démarré avec succès.</translation> <translation>Le processus à planté après avoir démarré avec succès.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="139"/> <location filename="mainwindow.h" line="143"/>
<source>The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again.</source> <source>The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again.</source>
<translation>La fonction waitFor...() a dépassé la limite de temps, you pouvez essayer de la relancer.</translation> <translation>La fonction waitFor...() a dépassé la limite de temps, you pouvez essayer de la relancer.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="140"/> <location filename="mainwindow.h" line="144"/>
<source>An error occurred when attempting to write to the process. For example, the process may not be running, or it may have closed its input channel.</source> <source>An error occurred when attempting to write to the process. For example, the process may not be running, or it may have closed its input channel.</source>
<translation>Une erreur est survenue lors de l&apos;envoi des données vers le processus. Le processus est peut être arrté ou il a fermé son canal d&apos;entrée.</translation> <translation>Une erreur est survenue lors de l&apos;envoi des données vers le processus. Le processus est peut être arrté ou il a fermé son canal d&apos;entrée.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="141"/> <location filename="mainwindow.h" line="145"/>
<source>An error occurred when attempting to read from the process. For example, the process may not be running.</source> <source>An error occurred when attempting to read from the process. For example, the process may not be running.</source>
<translation>Une erreur est survenue lors de la lecturee de données, le processus est probablement arrêté.</translation> <translation>Une erreur est survenue lors de la lecturee de données, le processus est probablement arrêté.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.h" line="142"/> <location filename="mainwindow.h" line="146"/>
<source>An unknown error occurred. This is the default return value of error().</source> <source>An unknown error occurred. This is the default return value of error().</source>
<translation>Une erreur inconnue est survenue. C&apos;est la valeur de retour par défaut de error().</translation> <translation>Une erreur inconnue est survenue. C&apos;est la valeur de retour par défaut de error().</translation>
</message> </message>
@ -464,87 +535,87 @@ Voulez-vous vraiment sortir ?</translation>
<context> <context>
<name>QTranslator</name> <name>QTranslator</name>
<message> <message>
<location filename="mainwindow.cpp" line="12"/> <location filename="mainwindow.cpp" line="13"/>
<source>Success. The rsync command completed successfully without any errors.</source> <source>Success. The rsync command completed successfully without any errors.</source>
<translation>Succès. La command rsync s&apos;est terminée sans erreurs.</translation> <translation>Succès. La command rsync s&apos;est terminée sans erreurs.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="13"/> <location filename="mainwindow.cpp" line="14"/>
<source>Syntax or usage error. There was a problem with the syntax of the rsync command or with the options specified.</source> <source>Syntax or usage error. There was a problem with the syntax of the rsync command or with the options specified.</source>
<translation>Erreur de syntaxe ou d&apos;usage. il y a un problème avec la synaxe de rsync ou avec les paramètres spécifiés.</translation> <translation>Erreur de syntaxe ou d&apos;usage. il y a un problème avec la synaxe de rsync ou avec les paramètres spécifiés.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="14"/> <location filename="mainwindow.cpp" line="15"/>
<source>Protocol incompatibility. There was a problem with the protocol version or negotiation between the rsync client and server.</source> <source>Protocol incompatibility. There was a problem with the protocol version or negotiation between the rsync client and server.</source>
<translation>Incompatibilité de protocole. Il y a eu un problème avec la version du protocole ou la négotiation avec le serveur rsync.</translation> <translation>Incompatibilité de protocole. Il y a eu un problème avec la version du protocole ou la négotiation avec le serveur rsync.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="15"/> <location filename="mainwindow.cpp" line="16"/>
<source>Errors selecting input/output files, dirs. There was a problem with the source or destination file or directory specified in the rsync command.</source> <source>Errors selecting input/output files, dirs. There was a problem with the source or destination file or directory specified in the rsync command.</source>
<translation>Erreurs dans la sélection des fichiers ou dossiers. il y a eu une problème avec le fichier/dossier source ou destination spécifié.</translation> <translation>Erreurs dans la sélection des fichiers ou dossiers. il y a eu une problème avec le fichier/dossier source ou destination spécifié.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="16"/> <location filename="mainwindow.cpp" line="17"/>
<source>Requested action not supported: An attempt was made to use an unsupported action or option.</source> <source>Requested action not supported: An attempt was made to use an unsupported action or option.</source>
<translation>Action non suportée. Une tentative d&apos;utiliser une action, ou une option, non supportée à é faite.</translation> <translation>Action non suportée. Une tentative d&apos;utiliser une action, ou une option, non supportée à é faite.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="17"/> <location filename="mainwindow.cpp" line="18"/>
<source>Error starting client-server protocol. There was an error starting the client-server protocol.</source> <source>Error starting client-server protocol. There was an error starting the client-server protocol.</source>
<translation>Erreur de démarrage du protocole client-seveur. Il ya eu une erreur en démarrant le protocole slient-serveur.</translation> <translation>Erreur de démarrage du protocole client-seveur. Il ya eu une erreur en démarrant le protocole slient-serveur.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="18"/> <location filename="mainwindow.cpp" line="19"/>
<source>Daemon unable to append to log-file. The rsync daemon was unable to write to its log file.</source> <source>Daemon unable to append to log-file. The rsync daemon was unable to write to its log file.</source>
<translation>Le démon rsyncd n&apos;arrive pas écrire dans son fichier de log.</translation> <translation>Le démon rsyncd n&apos;arrive pas écrire dans son fichier de log.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="19"/> <location filename="mainwindow.cpp" line="20"/>
<source>Error in socket I/O. There was an error with the socket input/output.</source> <source>Error in socket I/O. There was an error with the socket input/output.</source>
<translation>Erreur d&apos;entrée/sortie socket. Il y a eu une erreur d&apos;entrée/sortie sur le socket.</translation> <translation>Erreur d&apos;entrée/sortie socket. Il y a eu une erreur d&apos;entrée/sortie sur le socket.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="20"/> <location filename="mainwindow.cpp" line="21"/>
<source>Error in file I/O. There was an error reading or writing to a file.</source> <source>Error in file I/O. There was an error reading or writing to a file.</source>
<translation>Erreur de &apos;entrée/sortie. Il y a eu une erreur de lecture/écriture sur un fichier.</translation> <translation>Erreur de &apos;entrée/sortie. Il y a eu une erreur de lecture/écriture sur un fichier.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="21"/> <location filename="mainwindow.cpp" line="22"/>
<source>Error in rsync protocol data stream. There was an error in the rsync protocol data stream.</source> <source>Error in rsync protocol data stream. There was an error in the rsync protocol data stream.</source>
<translation>Erreur dans le protocole de flux de données de rsync.</translation> <translation>Erreur dans le protocole de flux de données de rsync.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="22"/> <location filename="mainwindow.cpp" line="23"/>
<source>Errors with program diagnostics. There was an error generating program diagnostics.</source> <source>Errors with program diagnostics. There was an error generating program diagnostics.</source>
<translation>Erreur avec les diagnostiques du programme.</translation> <translation>Erreur avec les diagnostiques du programme.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="23"/> <location filename="mainwindow.cpp" line="24"/>
<source>Error in IPC code. There was an error in the inter-process communication (IPC) code.</source> <source>Error in IPC code. There was an error in the inter-process communication (IPC) code.</source>
<translation>Erreur dans le code IPC. IL y a eu une erreur dans la communication inter-processus.</translation> <translation>Erreur dans le code IPC. IL y a eu une erreur dans la communication inter-processus.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="24"/> <location filename="mainwindow.cpp" line="25"/>
<source>Received SIGUSR1 or SIGINT. The rsync process was interrupted by a signal.</source> <source>Received SIGUSR1 or SIGINT. The rsync process was interrupted by a signal.</source>
<translation>Reçu les signaux SIGUSR1 ou SIGINT. Le processus rsync a é interrompu par un signal.</translation> <translation>Reçu les signaux SIGUSR1 ou SIGINT. Le processus rsync a é interrompu par un signal.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="25"/> <location filename="mainwindow.cpp" line="26"/>
<source>Some error returned by waitpid(). An error occurred while waiting for a child process to complete.</source> <source>Some error returned by waitpid(). An error occurred while waiting for a child process to complete.</source>
<translation>Erreurs retournées par waitpid().Une erreur est survenue pendant l&apos;attente de la complétion du processus fils.</translation> <translation>Erreurs retournées par waitpid().Une erreur est survenue pendant l&apos;attente de la complétion du processus fils.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="26"/> <location filename="mainwindow.cpp" line="27"/>
<source>Error allocating core memory buffers. There was an error allocating memory buffers.</source> <source>Error allocating core memory buffers. There was an error allocating memory buffers.</source>
<translation>Erreur d&apos;allocation des buffers mémoire.</translation> <translation>Erreur d&apos;allocation des buffers mémoire.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="27"/> <location filename="mainwindow.cpp" line="28"/>
<source>Partial transfer due to error. The rsync command completed with an error, but some files may have been transferred successfully.</source> <source>Partial transfer due to error. The rsync command completed with an error, but some files may have been transferred successfully.</source>
<translation>Transfert partiel due à une erreur. La command rsync s&apos;est terminée avec une erreur, mais des fichiers on é transférés avec succès.</translation> <translation>Transfert partiel due à une erreur. La command rsync s&apos;est terminée avec une erreur, mais des fichiers on é transférés avec succès.</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="28"/> <location filename="mainwindow.cpp" line="29"/>
<source>Partial transfer due to vanished source files. Some source files disappeared before they could be transferred.</source> <source>Partial transfer due to vanished source files. Some source files disappeared before they could be transferred.</source>
<translation>Transfert partiel à la disparition des fichiers source. Des fichiers source ont disparu avec d&apos;avoir é transférés.</translation> <translation>Transfert partiel à la disparition des fichiers source. Des fichiers source ont disparu avec d&apos;avoir é transférés.</translation>
</message> </message>

View File

@ -67,7 +67,6 @@ void MainWindow::download()
//connect(this->downloading.process, SIGNAL(errorOccurred(QProcess::ProcessError error)), this, SLOT(downloadProcessError(QProcess::ProcessError error))); //connect(this->downloading.process, SIGNAL(errorOccurred(QProcess::ProcessError error)), this, SLOT(downloadProcessError(QProcess::ProcessError error)));
//connect(this->downloading.process, SIGNAL(readyReadStandardError()), this, SLOT(downloadProcessStderr())); //connect(this->downloading.process, SIGNAL(readyReadStandardError()), this, SLOT(downloadProcessStderr()));
connect(this->downloading.process, SIGNAL(readyReadStandardOutput()), this, SLOT(readRsyncOutput())); connect(this->downloading.process, SIGNAL(readyReadStandardOutput()), this, SLOT(readRsyncOutput()));
this->downloading.process->start(cmd, param); this->downloading.process->start(cmd, param);
} }
@ -125,26 +124,3 @@ void MainWindow::readRsyncOutput()
} }
} }
} }
/*void MainWindow::downloadProcessError(QProcess::ProcessError error)
{
QMessageBox::warning(
this,
"RsyncUI",
downloadProcessErrorString[error].toStdString().c_str()
);
}*/
// process raise error
void MainWindow::downloadProcessStderr()
{
QByteArray errorLine;
errorLine = this->downloading.process->readAllStandardError();
QMessageBox::warning(
this,
"RsyncUI",
errorLine
);
}

144
login.ui
View File

@ -1,144 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LoginDialog</class>
<widget class="QDialog" name="LoginDialog">
<property name="windowModality">
<enum>Qt::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>194</height>
</rect>
</property>
<property name="windowTitle">
<string>RsyncUI request</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<widget class="QDialogButtonBox" name="loginBox">
<property name="geometry">
<rect>
<x>50</x>
<y>150</y>
<width>341</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
<widget class="QWidget" name="verticalLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>381</width>
<height>121</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Login name</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="textInteractionFlags">
<set>Qt::NoTextInteraction</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="loginEdit">
<property name="mouseTracking">
<bool>false</bool>
</property>
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="text">
<string/>
</property>
<property name="maxLength">
<number>32767</number>
</property>
<property name="placeholderText">
<string>Enter login</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="passwordEdit">
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>Enter password</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>loginBox</sender>
<signal>accepted()</signal>
<receiver>LoginDialog</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>loginBox</sender>
<signal>rejected()</signal>
<receiver>LoginDialog</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>

View File

@ -21,6 +21,9 @@ int main(int argc, char *argv[])
a.installTranslator(&myappTranslator); a.installTranslator(&myappTranslator);
} }
static const QString appName = "RsyncUI";
//Password passwdJob;
MainWindow w; MainWindow w;
w.show(); w.show();
w.init(); w.init();

View File

@ -1,12 +1,14 @@
#include "mainwindow.h" #include "mainwindow.h"
#include <QComboBox> #include <QComboBox>
#include <QTextBlock>
#include "version.h"
using namespace std; using namespace std;
bool display = false; bool display = false;
//extern QDialog Configuration;
extern Ui::Configuration config; extern Ui::Configuration config;
extern bool testRsyncReturn(QProcess *); extern bool testRsyncReturn(QProcess *);
extern QApplication a;
QMap<int, QString> rsyncErrorStrings { QMap<int, QString> rsyncErrorStrings {
{0, QTranslator::tr("Success. The rsync command completed successfully without any errors.")}, {0, QTranslator::tr("Success. The rsync command completed successfully without any errors.")},
@ -38,22 +40,20 @@ MainWindow::MainWindow(QWidget *parent)
QCoreApplication::setOrganizationName("RsyncUI"); QCoreApplication::setOrganizationName("RsyncUI");
QCoreApplication::setApplicationName("RsyncUI"); QCoreApplication::setApplicationName("RsyncUI");
this->setWindowTitle(a.applicationName());
// context menu for treewidget (list of files) // context menu for treewidget (list of files)
ui->treeWidget->addAction(ui->actionDownload); ui->treeWidget->addAction(ui->actionDownload);
// init configuration window // init configuration window
config.setupUi(&Configuration); config.setupUi(&Configuration);
// init about window // init about window
AboutW.setupUi(&aboutDialog); AboutW.setupUi(&aboutDialog);
//init login dialog
loginD.setupUi(&loginDialog);
loginD.loginEdit->setFocus();
// text of About // text of About
this->about.version = version;
QString aboutText = tr("<h2>Client for rsync server</h2>") + QString aboutText = tr("<h2>Client for rsync server</h2>") +
"<b>" + tr("Version") + ": " + this->about.version + "</b><br>" + "<b>" + tr("Version") + ": " + version + "</b><br>" +
"<b>" + tr("Licence") + ": " + this->about.licence + "</b><br>" + "<b>" + tr("Licence") + ": " + this->about.licence + "</b><br>" +
"<b>" + tr("Author") + ": " + this->about.author + "</b><br>" + "<b>" + tr("Author") + ": " + this->about.author + "</b><br>" +
"<b>" + tr("EMail") + ": " + this->about.email + "</b><br>" + "<b>" + tr("EMail") + ": " + this->about.email + "</b><br>" +
@ -65,19 +65,17 @@ MainWindow::MainWindow(QWidget *parent)
// connectors // connectors
connect(this, &MainWindow::fileName, ui->progressBar, &QProgressBar::setFormat); connect(this, &MainWindow::fileName, ui->progressBar, &QProgressBar::setFormat);
connect(this, &MainWindow::progressSignal, ui->progressBar, &QProgressBar::setValue); connect(this, &MainWindow::progressSignal, ui->progressBar, &QProgressBar::setValue);
//connect(this, &MainWindow::speed, ui->progressBar, &MainWindow::setDlSpeed);
//connect(this, &MainWindow::errorSignal, this, &MainWindow::downloadingErrorSlot);
connect(this, &MainWindow::stopDownloading, this, &MainWindow::cancelled); connect(this, &MainWindow::stopDownloading, this, &MainWindow::cancelled);
connect(config.buttonBox, SIGNAL(accepted()), this, SLOT(on_buttonBox_accepted())); connect(config.buttonBox, SIGNAL(accepted()), this, SLOT(on_buttonBox_accepted()));
connect(config.comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &MainWindow::on_comboBox_currentIndexChanged); connect(config.comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &MainWindow::on_comboBox_currentIndexChanged);
connect(loginD.loginBox, SIGNAL(accepted()), this, SLOT(on_loginBox_accepted()));
loadSettings();
// init of widgets // init of widgets
ui->ktreewidgetsearchline->setTreeWidget(ui->treeWidget); // attach search widget to treewidget ui->ktreewidgetsearchline->setTreeWidget(ui->treeWidget); // attach search widget to treewidget
ui->ktreewidgetsearchline->setCaseSensitivity(Qt::CaseInsensitive); // and set it case insensitive ui->ktreewidgetsearchline->setCaseSensitivity(Qt::CaseInsensitive); // and set it case insensitive
ui->treeWidget->setHeaderLabels({tr("Path"), tr("Type"), tr("Size")} ); // set header of columns of tree widget ui->treeWidget->setHeaderLabels({tr("Path"), tr("Type"), tr("Size"), tr("Date"), "fullSize"} ); // set header of columns of tree widget
//ui->treeWidget->header()->setContextMenuPolicy();
// setting arrowcursor for treeWidget, listWidget and listDownload to arrow // setting arrowcursor for treeWidget, listWidget and listDownload to arrow
ui->treeWidget->setCursor(Qt::ArrowCursor); ui->treeWidget->setCursor(Qt::ArrowCursor);
ui->listWidget->setCursor(Qt::ArrowCursor); ui->listWidget->setCursor(Qt::ArrowCursor);
@ -86,7 +84,6 @@ MainWindow::MainWindow(QWidget *parent)
// Hiding progress bar // Hiding progress bar
ui->progressBar->hide(); ui->progressBar->hide();
loadSettings();
// if last server exists in settings // if last server exists in settings
if (this->settings.contains("connexion/lastServer")) if (this->settings.contains("connexion/lastServer"))
@ -104,7 +101,10 @@ MainWindow::MainWindow(QWidget *parent)
config.comboBox->setCurrentIndex(ui->toolBar->toolButtonStyle()); // setting combobox to saved settings config.comboBox->setCurrentIndex(ui->toolBar->toolButtonStyle()); // setting combobox to saved settings
//setting unit of bandwidth limit //setting unit of bandwidth limit
config.UnitCombobox->addItems({tr("KB"), tr("MB"), tr("GB"), tr("TB"), tr("PB")}); config.UnitCombobox->addItems({tr("KB/s"), tr("MB/s"), tr("GB/s"), tr("TB/s"), tr("PB/s")});
// hide fullsize column of treeview
ui->treeWidget->setColumnHidden(4, true);
initSystemTrayIcon(); initSystemTrayIcon();
} }
@ -118,7 +118,7 @@ void MainWindow::init()
if (this->settings.value("Downloads/rows").toInt() != 0) if (this->settings.value("Downloads/rows").toInt() != 0)
{ {
// asking if we load the list and continue downloading // asking if we load the list and continue downloading
msgBox.setWindowTitle("RsyncUI"); msgBox.setWindowTitle(a.applicationName());
msgBox.setInformativeText(tr("A list of interrupted downloads exists, do you want to continue downloading ? if not the list will be cleared" )); msgBox.setInformativeText(tr("A list of interrupted downloads exists, do you want to continue downloading ? if not the list will be cleared" ));
QPushButton *yes = msgBox.addButton(QMessageBox::Yes); QPushButton *yes = msgBox.addButton(QMessageBox::Yes);
@ -135,7 +135,7 @@ void MainWindow::init()
} }
} }
// load list of services // load list of services
populateList(); populateList(ui->khistorycombobox->currentIndex());
} }
void MainWindow::initSystemTrayIcon() void MainWindow::initSystemTrayIcon()
@ -210,7 +210,7 @@ void MainWindow::quitApp()
reply = QMessageBox::question( reply = QMessageBox::question(
this, this,
"RsyncUI", a.applicationName(),
tr("Exiting will stop downloading, and will clear the download queue.\nDo you want to exit ?") + displayText, tr("Exiting will stop downloading, and will clear the download queue.\nDo you want to exit ?") + displayText,
param, param,
QMessageBox::No); QMessageBox::No);
@ -242,13 +242,14 @@ void MainWindow::quitApp()
void MainWindow::closeEvent (QCloseEvent *event) void MainWindow::closeEvent (QCloseEvent *event)
{ {
QMessageBox msgBox; QMessageBox msgBox;
QCheckBox *cb = new QCheckBox("Don't show this again ?"); QCheckBox *cb;
if (!event->spontaneous() || !isVisible()) if (!event->spontaneous() || !isVisible())
return; return;
if (trayIcon->isVisible() and this->settings.value("CloseCheckbox").toBool() == false) if (trayIcon->isVisible() and this->settings.value("CloseCheckbox").toBool() == false)
{ {
msgBox.setWindowTitle("RsyncUI"); cb = new QCheckBox("Don't show this again ?");
msgBox.setWindowTitle(a.applicationName());
msgBox.setInformativeText(tr("The program will keep running in the " msgBox.setInformativeText(tr("The program will keep running in the "
"system tray. To terminate the program, " "system tray. To terminate the program, "
"choose <b>Quit</b> in the context menu " "choose <b>Quit</b> in the context menu "
@ -275,7 +276,7 @@ void MainWindow::closeEvent (QCloseEvent *event)
} }
// Populate treeview with list of files // Populate treeview with list of files
void MainWindow::populateTree(QTreeWidgetItem * parent) void MainWindow::populateTree()
{ {
QString path; QString path;
@ -290,8 +291,11 @@ void MainWindow::populateTree(QTreeWidgetItem * parent)
if (validateServer(this->connexion.server)) if (validateServer(this->connexion.server))
{ {
// server is validated, scanning directory // server is validated, scanning directory
path = ui->listWidget->currentItem()->text().section('\n', 0, 0) + "/"; path = this->connexion.service + "/";
scanDir(this->connexion.server, this->connexion.port, parent, path); while (this->rescan)
{
scanDir(this->connexion.server, this->connexion.port, nullptr, path);
}
} }
// Restoring cursor // Restoring cursor
QGuiApplication::restoreOverrideCursor(); QGuiApplication::restoreOverrideCursor();
@ -299,12 +303,15 @@ void MainWindow::populateTree(QTreeWidgetItem * parent)
} }
// Populate Listview with list of services // Populate Listview with list of services
void MainWindow::populateList() void MainWindow::populateList(int item)
{ {
QString server; QString server;
QString service;
QStringList hidden;
int port; int port;
int i;
server = ui->khistorycombobox->currentText(); server = ui->khistorycombobox->itemText(item);
port = ui->portEdit->text().toUInt(); port = ui->portEdit->text().toUInt();
if ((server != this->connexion.server) or (port != this->connexion.port)) if ((server != this->connexion.server) or (port != this->connexion.port))
{ {
@ -350,10 +357,75 @@ void MainWindow::populateList()
} }
} }
this->settings.endGroup(); this->settings.endGroup();
this->settings.beginGroup("Hidden/" + server);
hidden = this->settings.allKeys();
if (hidden.count() > 0)
{
for (i = 0; i < hidden.size(); i++)
{
service = hidden[i];
//TODO detect if service is already present
if (testServicePresence(service, false))
{
ui->listWidget->addItem(service + "\n\t");
}
}
}
this->settings.endGroup();
QGuiApplication::restoreOverrideCursor(); //setting cursor to default QGuiApplication::restoreOverrideCursor(); //setting cursor to default
} }
} }
// Test if service is already present on the server
bool MainWindow::testServicePresence(QString service, bool askPassword)
{
QString cmd;
QStringList param;
QString line;
QString errorRsync;
QStringList v;
QProcess *myProcess;
bool returnValue = false;
int loop =0;
bool r = false;
cmd = "/usr/bin/rsync";
param << "--contimeout=10" << "-nq" << "--port=" + QString::number(this->connexion.port) << this->connexion.server + "::" + service;
myProcess = new QProcess(this);
myProcess->setProcessChannelMode(QProcess::MergedChannels);
myProcess->start(cmd, param);
myProcess->waitForStarted();
myProcess->write("\n");
//myProcess->waitForFinished(12000);
while(myProcess->waitForReadyRead(10000))
{
while(1)
{
// line empty then buffer is empty so returning to wait new datas
line = QString::fromUtf8(myProcess->readLine());
if (line.isEmpty())
{
break;
}
if (line.contains("auth failed"))
{
if (askPassword == true and loop >=2 and r == true)
{
r = getUserPassword(&this->connexion);
loop++;
}
returnValue = true;
}
}
}
if (myProcess->exitCode() == 0)
{
returnValue = true;
}
myProcess->close();
return returnValue;
}
//list services of the rsync server //list services of the rsync server
void MainWindow::listServices() void MainWindow::listServices()
{ {
@ -367,7 +439,7 @@ void MainWindow::listServices()
bool flag = false; bool flag = false;
cmd = "/usr/bin/rsync"; cmd = "/usr/bin/rsync";
param << "--contimeout=10" << "--port=" + QString::number(this->connexion.port) << this->connexion.server + "::"; param << "--contimeout=20" << "--port=" + QString::number(this->connexion.port) << this->connexion.server + "::";
myProcess = new QProcess(this); myProcess = new QProcess(this);
myProcess->start(cmd, param); myProcess->start(cmd, param);
@ -406,17 +478,27 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
{ {
QString cmd; QString cmd;
QStringList param; QStringList param;
QStringList sizeA;
QString line; QString line;
QString size; QString size;
QString fullsize;
QString filename; QString filename;
QString fileType;
QString date;
QString dirName = "";
QProcess * myProcess; QProcess * myProcess;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
bool isDir = false; bool isDir = false;
bool flag = false; bool flag = false;
bool readOk = false; bool readOk = false;
bool passwdOk = false;
int nChild = 0; int nChild = 0;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); bool r;
static uint looping;
QStringList dirs;
myProcess = new QProcess(this); myProcess = new QProcess(this);
myProcess->setProcessChannelMode(QProcess::MergedChannels);
if (parent != nullptr) if (parent != nullptr)
{ {
@ -435,10 +517,11 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
} }
myProcess->setProcessEnvironment(env); myProcess->setProcessEnvironment(env);
cmd = "rsync"; cmd = "rsync";
param << "--contimeout=10" << "--port=" + QString::number(portN) << server + "::" + path; param << "--contimeout=20" << "--port=" + QString::number(portN) << server + "::" + path;
myProcess->start(cmd, param); myProcess->start(cmd, param);
this->rescan = true;
// waiting for response of the server with a timeout of 10 seconds // waiting for response of the server with a timeout of 10 seconds
do do
@ -455,12 +538,45 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
flag = true; flag = true;
break; break;
} }
if (line.contains("auth failed"))
{
myProcess->readAllStandardOutput();
r = getUserPassword(&this->connexion);
if (looping <= 1)
{
this->rescan = true;
looping++;
}else
{
this->rescan = false;
looping = 0;
QMessageBox::warning(
this,
a.applicationName(),
tr("Authentication failed" )
);
}
return false;
}
// extracting name, size and is dir/file // extracting name, size and is dir/file
line = line.simplified(); line = line.simplified();
size = line.section(" ", 1, 1);
filename = line.section(" ", 4); filename = line.section(" ", 4);
if (filename != '.') if (filename != '.')
{ {
size = line.section(" ", 1, 1);
fullsize = size;
fullsize.remove(",");
sizeA = size.split(',');
if (sizeA.count() <= 1)
{
size = sizeA.at(0) + " " + UnitText[0] + " ";
}else
{
myProcess->setProcessEnvironment(env);
size = sizeA.at(0) + "," + sizeA.at(1).left(2) + " " + UnitText[sizeA.count()-1] + " ";
}
if (line[0] == "d") if (line[0] == "d")
{ {
isDir = true; isDir = true;
@ -468,15 +584,26 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
{ {
isDir = false; isDir = false;
} }
if (parent != NULL)
date = line.section(' ', 2, 2);
fileType = getFileType(filename);
if (!path.isEmpty())
{ {
//adding item to tree if (path.endsWith('/'))
addTreeChild(parent, filename, size, isDir);
}else
{ {
//adding item to tree (as directory) path.chop(1);
addTreeRoot(filename, size, isDir);
} }
dirs = path.split('/');
dirName = dirs[dirs.size()-1];
}
addTreeItem(filename, size, fullsize, fileType, date, isDir, dirName, parent);
if (passwdOk == false and !this->connexion.password.isEmpty())
{
this->settings.setValue("Passwords/" + this->connexion.server + "/" + this->connexion.service + "/" + this->connexion.user, true);
setPassword(this->connexion.user, this->connexion.password);
this->settings.sync();
}
this->rescan = false;
} }
} }
flag = false; flag = false;
@ -488,7 +615,7 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
{ {
QMessageBox::warning( QMessageBox::warning(
this, this,
"RsyncUI", a.applicationName(),
tr("The processus does'nt respond: ") + myProcess->errorString()); tr("The processus does'nt respond: ") + myProcess->errorString());
} }
} }
@ -499,7 +626,7 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
testRsyncReturn(this, myProcess); testRsyncReturn(this, myProcess);
myProcess->close(); myProcess->close();
} }
return 0; return false;
} }
// Verify if server address is IP address // Verify if server address is IP address
@ -515,7 +642,7 @@ bool MainWindow::isIpAddress(QString server)
for (auto element : r) for (auto element : r)
{ {
elementN = element.toInt(&ok); elementN = element.toInt(&ok);
if (elementN < 0 or elementN > 255 or ok == false) if ((elementN < 0) or (elementN > 255) or ok == false)
{ {
return false; return false;
} }
@ -574,7 +701,7 @@ bool MainWindow::validateServer(QString server)
// server-s address not valid // server-s address not valid
QMessageBox::warning( QMessageBox::warning(
this, this,
"RsyncUI", a.applicationName(),
tr("server does not exists" ) tr("server does not exists" )
); );
} }
@ -583,69 +710,86 @@ bool MainWindow::validateServer(QString server)
} }
// slot activated when combobox is changed // slot activated when combobox is changed
void MainWindow::on_khistorycombobox_currentIndexChanged(int i) void MainWindow::on_khistorycombobox_currentIndexChanged(int item)
{ {
this->connexion.comboboxChanged = true; this->connexion.comboboxChanged = true;
populateList(); populateList(item);
} }
// slot activated when button connection is clicked // slot activated when button connection is clicked
void MainWindow::on_connectButton_clicked() void MainWindow::on_connectButton_clicked()
{ {
populateList(); populateList(ui->khistorycombobox->currentIndex());
} }
// add a dir in treeview // add parent in treeview
QTreeWidgetItem * MainWindow::addTreeRoot(QString name, QString fileSize, bool isDir) void MainWindow::addTreeItem(QString name, QString fileSize, QString fullsize, QString type, QString date, bool isDir=false, QString dirName="", QTreeWidgetItem *parent=nullptr)
{ {
QTreeWidgetItem *treeItem = new QTreeWidgetItem(ui->treeWidget); QFont font;
QTreeWidgetItem *treeItem;
if (parent != nullptr)
{
treeItem = new QTreeWidgetItem();
}else
{
treeItem = new QTreeWidgetItem(ui->treeWidget);
}
// item is a file
if (QFile::exists(this->downloading.savePath + "/" + name) or QFile::exists(this->downloading.savePath + "/" + dirName + "/" + name))
{
QBrush b (Qt::green);
treeItem->setForeground(0, b);
treeItem->setFont(0, font);
}else if (this->settings.contains(name))
{
QBrush b (Qt::red);
treeItem->setForeground(0, b);
treeItem->setFont(0, font);
}
if (isDir == true) if (isDir == true)
{ {
// item is a dir // item is a dir
treeItem->setText(1, tr("Dir")); treeItem->setText(1, tr("Dir"));
treeItem->setIcon(0, QIcon::fromTheme("folder"));
}else }else
{ {
// item is a file this->settings.beginGroup("Downloaded/");
treeItem->setText(1,tr("File")); this->settings.endGroup();
treeItem->setText(1,type);
} }
treeItem->setText(0, name); treeItem->setText(0, name);
treeItem->setText(2, fileSize); treeItem->setText(2, fileSize);
treeItem->setText(3, date);
treeItem->setText(4, fullsize);
return treeItem; treeItem->setTextAlignment(2, Qt::AlignRight);
}
// add a file in treeview if (parent != nullptr)
QTreeWidgetItem * MainWindow::addTreeChild(QTreeWidgetItem *parent, QString name, QString fileSize, bool isDir)
{
QTreeWidgetItem *treeItem = new QTreeWidgetItem();
if (isDir == true)
{ {
// item is a dir
treeItem->setText(1, tr("Dir"));
}else
{
// item is a file
treeItem->setText(1,("File"));
}
treeItem->setText(0, name);
treeItem->setText(2, fileSize);
// QTreeWidgetItem::addChild(QTreeWidgetItem * child) // QTreeWidgetItem::addChild(QTreeWidgetItem * child)
parent->addChild(treeItem); parent->addChild(treeItem);
return treeItem; }
} }
// Slot acivated when a service in the list is clicked // Slot activated when a service in the list is clicked
void MainWindow::on_listWidget_clicked() void MainWindow::on_listWidget_clicked()
{
this->connexion.service = ui->listWidget->currentItem()->text().section("\n", 0 ,0);
ui->treeWidget->clear();
preparePopulateTree();
}
void MainWindow::preparePopulateTree()
{ {
QString str; QString str;
QStringList logins; QStringList logins;
this->rescan = true; this->rescan = true;
this->connexion.user = nullptr; this->connexion.user = nullptr;
this->connexion.password = nullptr; this->connexion.service = ui->listWidget->currentItem()->text().section("\n", 0 ,0); this->connexion.password = nullptr;
str = "Folder/" + this->connexion.server + "/" + this->connexion.service; str = "Folder/" + this->connexion.server + "/" + this->connexion.service;
// if service exists in settings for this server // if service exists in settings for this server
if (this->settings.contains(str)) if (this->settings.contains(str))
@ -653,45 +797,76 @@ void MainWindow::on_listWidget_clicked()
// setting savePath from settings // setting savePath from settings
this->downloading.savePath = this->settings.value(str).toString(); this->downloading.savePath = this->settings.value(str).toString();
} }
this->settings.beginGroup("Passwords/" + this->connexion.server + "/" + this->connexion.service);
logins = this->settings.allKeys(); //getUserPassword(&this->connexion);
//TODO choose login
if (logins.count() != 0) populateTree();
{
this->connexion.user = logins[0];
this->connexion.password = this->settings.value(logins[0]).toString();
}
this->settings.endGroup();
populateTree(NULL);
} }
// get password and user login // get password and user login
// if object = false ==> searching from connexion object // if object = false ==> searching from connexion object
// else searching from downloading object // else searching from downloading object
bool MainWindow::getUserPassword(bool object = false) bool MainWindow::getUserPassword(Connexion * object)
{ {
QStringList logins; QStringList logins;
bool returnValue; QString login = "";
QString password = "";
QString server;
QString service;
int c;
if (object == false) bool returnValue = false;
{ bool ok = false;
this->settings.beginGroup("Passwords/" + this->connexion.server + "/" + this->connexion.service);
}else server = object->server;
{ service = object->service;
this->settings.beginGroup("Passwords/" + this->downloading.server + "/" + this->downloading.service);
} object->user = "";
object->password = "";
this->settings.beginGroup("Passwords/" + server + "/" + service);
logins = this->settings.allKeys(); logins = this->settings.allKeys();
//TODO choose login in case of multiples logins c = logins.count();
if (logins.count() != 0) if ( c != 1)
{ {
this->downloading.user = logins[0]; //choose login in case of multiples logins
this->downloading.password = this->settings.value(logins[0]).toString(); login = QInputDialog::getItem(this,
returnValue = true; "RsincUI",
tr("Select the user you want to connect with or enter a new one"),
logins,
0,
true,
&ok,
Qt::Popup,
Qt::ImhNoPredictiveText
);
if (ok and !login.isEmpty())
{
if (!logins.contains(login))
{
password = QInputDialog::getText(this,
a.applicationName() + tr(" Request"),
tr("Enter password"), QLineEdit::Password,
"", &ok, Qt::Popup,
Qt::ImhNoPredictiveText);
if (!ok or password.isEmpty())
{
password = "";
returnValue = false;
}
}else }else
{ {
this->downloading.user = nullptr; password = getPassword(login);
this->downloading.password = nullptr; returnValue = true;
returnValue = false; }
object->user = login;
object->password = password;
}
}else
{
object->user = logins.at(0);
object->password = getPassword(object->user);
returnValue = true;
} }
this->settings.endGroup(); this->settings.endGroup();
return returnValue; return returnValue;
@ -700,8 +875,7 @@ bool MainWindow::getUserPassword(bool object = false)
//Slot activated when a file is clicked in the treeview //Slot activated when a file is clicked in the treeview
void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadDir) void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadDir)
{ {
QFuture<void> future; //#QFileDialog dialog;
QFileDialog dialog;
QTreeWidgetItem * itemR; QTreeWidgetItem * itemR;
QString path; QString path;
QString str; QString str;
@ -709,11 +883,22 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
int sizeFromRsync; int sizeFromRsync;
itemR = item; itemR = item;
this->rescan = true;
// assembling path from treewidget // assembling path from treewidget
path = item->text(0); path = item->text(0);
sizeFromRsync = item->text(2).remove(',').toUInt(); sizeFromRsync = item->text(4).toUInt();
while(itemR->parent() != NULL)
{
itemR = itemR->parent();
// concatening parent to path
path.prepend(itemR->text(0) + "/");
};
cout << item->text(1).toStdString() <<endl;
if (item->text(1) != tr("Dir") or downloadDir == true)
{
// exists saving path in settings ? // exists saving path in settings ?
str = "Folder/" + this->connexion.server + "/" + this->connexion.service; str = "Folder/" + this->connexion.server + "/" + this->connexion.service;
if(!this->settings.contains(str)) if(!this->settings.contains(str))
@ -729,25 +914,17 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
this->downloading.savePath = this->settings.value(str).toString(); this->downloading.savePath = this->settings.value(str).toString();
} }
while(itemR->parent() != NULL)
{
itemR = itemR->parent();
// concatening parent to path
path.prepend(itemR->text(0) + "/");
};
QFileInfo info(this->downloading.savePath + "/" + path);
if (item->text(1) == tr("File") or downloadDir == true)
{
// Item is a file // Item is a file
// searching if file exists in savepath // searching if file exists in savepath
if (QFile::exists(this->downloading.savePath + "/" + path)) if (QFile::exists(this->downloading.savePath + "/" + path))
{ {
QFileInfo info(this->downloading.savePath + "/" + path);
if (info.size() < sizeFromRsync) if (info.size() < sizeFromRsync)
{ {
reply = QMessageBox::question( reply = QMessageBox::question(
this, this,
"RsyncUI", a.applicationName(),
tr("File is partially downloaded. Do you want to resume download ? if no, the file will be deleted from destination directory"), tr("File is partially downloaded. Do you want to resume download ? if no, the file will be deleted from destination directory"),
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,
QMessageBox::Cancel); QMessageBox::Cancel);
@ -764,7 +941,7 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
{ {
reply = QMessageBox::question( reply = QMessageBox::question(
this, this,
"RsyncUI", a.applicationName(),
tr("File is already downloaded. Do you want to reload it ? The old file will be deleted"), tr("File is already downloaded. Do you want to reload it ? The old file will be deleted"),
QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes|QMessageBox::No,
QMessageBox::No); QMessageBox::No);
@ -801,16 +978,21 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
{ {
QMessageBox::warning( QMessageBox::warning(
this, this,
"RsyncUI", a.applicationName(),
tr("File is already downloading" ) tr("File is already downloading" )
); );
} }
}else }else
{ {
//Item is a Directory //Item is a Directory
while (this->rescan)
{
scanDir(this->connexion.server, this->connexion.port, item, this->connexion.service + "/" + path +"/"); scanDir(this->connexion.server, this->connexion.port, item, this->connexion.service + "/" + path +"/");
item->setExpanded(true); item->setExpanded(true);
} }
}
if (config.autosaveCheckbox->checkState() == Qt::Checked) if (config.autosaveCheckbox->checkState() == Qt::Checked)
{ {
saveDownloadList(); saveDownloadList();
@ -823,11 +1005,11 @@ void MainWindow::startDownloading()
ui->progressBar->setValue(0); ui->progressBar->setValue(0);
ui->progressBar->show(); ui->progressBar->show();
getUserPassword(false); //getUserPassword();
//QtConcurrent::run(&this->downloadO, &downloadFile::download, this); //QtConcurrent::run(&this->downloadO, &downloadFile::download, this);
this->download(); this->download();
this->trayIcon->showMessage("RsyncUI", tr("Starting downloading\n") + this->downloading.path, QSystemTrayIcon::Information); this->trayIcon->showMessage(a.applicationName(), tr("Starting downloading\n") + this->downloading.path, QSystemTrayIcon::Information);
} }
// Slot stopping download // Slot stopping download
@ -843,40 +1025,59 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus)
QString str; QString str;
int pos; int pos;
QString aborted = tr("finished"); QString aborted = tr("finished");
QMessageBox::StandardButton reply;
bool retry = false;
// test if process crashed // test if process crashed
if (exitStatus == QProcess::CrashExit) if (exitStatus == QProcess::CrashExit)
{ {
QMessageBox::warning( QMessageBox::warning(
NULL, NULL,
"RsyncUI", a.applicationName(),
tr("Rsync process crashed")); tr("Rsync process crashed"));
} }
//test result code of command (if 20 then command stopped by user) //test result code of command (if 20 then command stopped by user)
if (exitCode != 0 and exitCode != 20) if (exitCode != 0 and this->stopDlAsked != true)
{ {
// displaying warning with exit code if (exitCode == 20)
QMessageBox::warning(
NULL,
"RsyncUI",
rsyncErrorStrings[exitCode]);
}else if (exitCode == 20)
{ {
aborted = tr("stopped by user"); aborted = tr("stopped by user");
}else if (exitCode == 5) // password asked }else if (exitCode == 5) // password asked
{ {
loginDialog.show(); getUserPassword(&this->downloading);
retry = true;
} }
this->trayIcon->showMessage("RsyncUI", tr("Download ") + aborted + "\n" + this->downloading.path, QSystemTrayIcon::Information); // displaying warning with exit code
reply = QMessageBox::warning(
this,
a.applicationName(),
rsyncErrorStrings[exitCode] + tr("\nDo you want to retry?"),
QMessageBox::Yes|QMessageBox::No,
QMessageBox::Yes);
if (reply == QMessageBox::Yes)
{
retry = true;
}
}
this->stopDlAsked = false;
this->trayIcon->showMessage(a.applicationName(), tr("Download ") + aborted + "\n" + this->downloading.path, QSystemTrayIcon::Information);
// disconnecting signals to slots // disconnecting signals to slots
disconnect(this->downloading.process, 0, 0, 0); disconnect(this->downloading.process, 0, 0, 0);
// reset variables and window // reset variables and window, close process
this->downloading.process->close(); this->downloading.process->close();
ui->progressBar->hide(); ui->progressBar->hide();
if (retry == false)
{
QString filename = ui->listDownload->item(0)->text();
pos = filename.contains(" => ");
filename.resize(pos);
this->settings.setValue("Downloaded/" + ui->listDownload->item(0)->text(), true);
delete ui->listDownload->takeItem(0); delete ui->listDownload->takeItem(0);
}
this->downloading.clear(); this->downloading.clear();
// Some downloads staying in queue // Some downloads staying in queue
@ -890,8 +1091,11 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus)
pos = path.lastIndexOf(" => "); pos = path.lastIndexOf(" => ");
this->downloading.server = path.midRef(pos+4).toString(); this->downloading.server = path.midRef(pos+4).toString();
path.resize(pos); path.resize(pos);
this->downloading.port = this->settings.value("connexion/server/" + this->downloading.server).toInt();
this->downloading.path = path; this->downloading.path = path;
getUserPassword(true);
//getUserPassword(true);
testServicePresence(this->downloading.service, true);
// savepath exists in settings ? // savepath exists in settings ?
str = "Folder/" + this->downloading.server + "/" + this->downloading.service; str = "Folder/" + this->downloading.server + "/" + this->downloading.service;
@ -899,14 +1103,14 @@ void MainWindow::downloadFinished(int exitCode, QProcess::ExitStatus exitStatus)
{ {
// setting savepath from saved settings // setting savepath from saved settings
this->downloading.savePath = this->settings.value(str).toString(); this->downloading.savePath = this->settings.value(str).toString();
sleep(2);
startDownloading(); startDownloading();
}else }else
{ {
// no save path // no save path
if(!on_DefaultSaveFolder_triggered()) if(!on_DefaultSaveFolder_triggered())
{ {
cout << "Error no save path so deleting download"; cout << "Error no save path so removing download";
//downloadFinished();
return; return;
} }
} }
@ -928,13 +1132,14 @@ void MainWindow::on_listDownload_itemClicked(QListWidgetItem *item)
// first line clicked on download list // first line clicked on download list
reply = QMessageBox::question( reply = QMessageBox::question(
this, this,
"RsyncUI", a.applicationName(),
tr("Do you want to stop downloading and delete this file from download queue ?"), tr("Do you want to stop downloading and delete this file from download queue ?"),
QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes|QMessageBox::No,
QMessageBox::No); QMessageBox::No);
if (reply == QMessageBox::Yes) if (reply == QMessageBox::Yes)
{ {
// stopping download // stopping download
this->stopDlAsked = true;
emit (stopDownloading(this->downloading.process)); emit (stopDownloading(this->downloading.process));
} }
}else }else
@ -942,7 +1147,7 @@ void MainWindow::on_listDownload_itemClicked(QListWidgetItem *item)
// not first line on download list // not first line on download list
reply = QMessageBox::question( reply = QMessageBox::question(
this, this,
"RsyncUI", a.applicationName(),
tr("Do you want to delete this file from download queue ?"), tr("Do you want to delete this file from download queue ?"),
QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes|QMessageBox::No,
QMessageBox::No); QMessageBox::No);
@ -951,7 +1156,6 @@ void MainWindow::on_listDownload_itemClicked(QListWidgetItem *item)
// removing line from download list // removing line from download list
ui->listDownload->removeItemWidget(item); ui->listDownload->removeItemWidget(item);
delete item; delete item;
} }
} }
if (config.autosaveCheckbox->checkState() == Qt::Checked) if (config.autosaveCheckbox->checkState() == Qt::Checked)
@ -1032,7 +1236,7 @@ bool MainWindow::on_DefaultSaveFolder_triggered()
{ {
QMessageBox::warning( QMessageBox::warning(
NULL, NULL,
"RsyncUI", a.applicationName(),
tr("Since the save path is linked to service, you need to select a service before you can select a folder")); tr("Since the save path is linked to service, you need to select a service before you can select a folder"));
return false; return false;
} }
@ -1144,7 +1348,7 @@ void MainWindow::loadDownloadList()
} }
// clear object downloading // clear object downloading
void Downloading::clear() void Connexion::clear()
{ {
this->path.clear(); this->path.clear();
this->server.clear(); this->server.clear();
@ -1170,7 +1374,7 @@ void MainWindow::on_actionDownload_triggered()
{ {
QMessageBox::warning( QMessageBox::warning(
this, this,
"RsyncUI", a.applicationName(),
errorString, errorString,
QMessageBox::Ok, QMessageBox::Ok,
QMessageBox::Ok); QMessageBox::Ok);
@ -1188,27 +1392,25 @@ void MainWindow::on_actionExit_triggered()
quitApp(); quitApp();
} }
void MainWindow::on_loginBox_accepted()
{
if (!loginD.loginEdit->text().isEmpty())
{
this->connexion.user = loginD.loginEdit->text();
if (!loginD.passwordEdit->text().isEmpty())
{
this->connexion.password = loginD.passwordEdit->text();
this->settings.setValue("Passwords/" + this->connexion.server + "/" + this->connexion.service + "/" + this->connexion.user, this->connexion.password);
this->settings.sync();
if (this->rescan == true)
{
this->rescan = false;
populateTree(NULL);
}
}
}
}
void MainWindow::setDlSpeed(QString speed) void MainWindow::setDlSpeed(QString speed)
{ {
speed.squeeze(); speed.squeeze();
} }
void MainWindow::on_actionHiddenService_triggered()
{
QInputDialog hiddenFolderDialog;
bool ok;
QString text = QInputDialog::getText(this, a.applicationName() + tr(" Request"),
tr("Hidden service name"), QLineEdit::Normal,
"test", &ok);
if (ok && !text.isEmpty())
{
this->connexion.service = text;
this->settings.setValue("Hidden/" + this->connexion.server + '/' + text, true);
ui->listWidget->addItem(text + "\n\t");
preparePopulateTree();
}
}

View File

@ -5,9 +5,9 @@
#include "ui_mainwindow.h" #include "ui_mainwindow.h"
#include "ui_configuration.h" #include "ui_configuration.h"
#include "ui_about.h" #include "ui_about.h"
#include "ui_login.h"
#include "downloadfile.h" #include "downloadfile.h"
#include "tools.h" #include "tools.h"
#include "password.h"
#include <QMainWindow> #include <QMainWindow>
#include <string> #include <string>
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
@ -25,8 +25,6 @@
#include <cstdio> #include <cstdio>
#include <QMessageBox> #include <QMessageBox>
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <QFuture>
#include <qtconcurrentrun.h>
#include <QFileDialog> #include <QFileDialog>
#include <QThread> #include <QThread>
#include <QProgressDialog> #include <QProgressDialog>
@ -58,12 +56,18 @@ class Connexion
public: public:
int bandwidthLimit = 0; int bandwidthLimit = 0;
int bandwidthLimitUnit; int bandwidthLimitUnit;
int contimeout = 20;
QString server; QString server;
QString service; QString service;
QString path;
QString savePath;
QString user; QString user;
QString password; QString password;
QProcess * process = nullptr;
int port = 873; int port = 873;
bool comboboxChanged; bool comboboxChanged;
bool quit = false;
void clear();
}; };
class Downloading class Downloading
@ -84,8 +88,7 @@ class Downloading
class About class About
{ {
public: public:
QString title = "RsyncUI"; QString version;
QString version = "2.6";
QString author = "Daniel TARTAVEL-JEANNOT"; QString author = "Daniel TARTAVEL-JEANNOT";
QString licence = "GPL_V3"; QString licence = "GPL_V3";
QString description; QString description;
@ -101,30 +104,33 @@ class MainWindow : public QMainWindow
Ui::MainWindow *ui; Ui::MainWindow *ui;
MainWindow(QWidget *parent = nullptr); MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
// passwdManager;
QProgressDialog *progress; QProgressDialog *progress;
Connexion connexion; Connexion connexion;
Downloading downloading; Connexion downloading;
QSettings settings; QSettings settings;
About about; About about;
QDialog Configuration; QDialog Configuration;
Ui::Configuration config; Ui::Configuration config;
QDialog aboutDialog; QDialog aboutDialog;
Ui::windowAbout AboutW; Ui::windowAbout AboutW;
QDialog loginDialog;
Ui::LoginDialog loginD;
std::vector <QString> serversList; std::vector <QString> serversList;
QSystemTrayIcon * trayIcon; QSystemTrayIcon * trayIcon;
QString icon = "/usr/share/icons/RsyncUI.png"; QString icon = "/usr/share/icons/RsyncUI.png";
bool rescan = false; bool rescan = false;
bool stopDlAsked;
QList<QString> bwUnitText { QList<QString> UnitText
"KB", {
"MB", tr("B"),
"TB", tr("KB"),
"GB", tr("MB"),
"PB" tr("GB"),
tr("TB"),
tr("PB")
}; };
QList<QChar> bwUnitChar{ QList<QChar> bwUnitChar
{
'K', 'K',
'M', 'M',
'T', 'T',
@ -143,13 +149,12 @@ class MainWindow : public QMainWindow
}; };
void displayTree(); void displayTree();
void populateTree(QTreeWidgetItem * parent); void populateTree();
void populateList(); void populateList(int);
void listServices(); void listServices();
bool validateServer(QString server); bool validateServer(QString server);
bool isIpAddress(QString server); bool isIpAddress(QString server);
QTreeWidgetItem * addTreeRoot(QString name, QString description, bool isDir); void addTreeItem(QString name, QString fileSize, QString fullsize, QString type, QString date, bool isDir, QString dirName, QTreeWidgetItem *parent);
QTreeWidgetItem * addTreeChild(QTreeWidgetItem *parent, QString name, QString size, bool isDir);
bool scanDir(QString server, int portN, QTreeWidgetItem *parent = NULL, QString path = "" ); bool scanDir(QString server, int portN, QTreeWidgetItem *parent = NULL, QString path = "" );
void startDownloading(); void startDownloading();
void loadSettings(); void loadSettings();
@ -162,7 +167,11 @@ class MainWindow : public QMainWindow
void hideWindow(); void hideWindow();
void showWindow(); void showWindow();
void init(); void init();
bool getUserPassword(bool); bool getUserPassword(Connexion *);
void preparePopulateTree();
bool testServicePresence(QString, bool=false);
void passwordStore (QString account, QString password);
QString passwordGet (QString account);
private slots: private slots:
@ -172,10 +181,6 @@ class MainWindow : public QMainWindow
void downloadFinished(int exitCode, QProcess::ExitStatus exitStatus); void downloadFinished(int exitCode, QProcess::ExitStatus exitStatus);
// void downloadProcessError(QProcess::ProcessError error);
void downloadProcessStderr();
void readRsyncOutput(); void readRsyncOutput();
void stoppingDownload(); void stoppingDownload();
@ -196,8 +201,6 @@ class MainWindow : public QMainWindow
void on_actionDownload_triggered(); void on_actionDownload_triggered();
//void downloadingErrorSlot(QString);
void on_comboBox_currentIndexChanged(int index); void on_comboBox_currentIndexChanged(int index);
void on_buttonBox_accepted(); void on_buttonBox_accepted();
@ -212,7 +215,7 @@ class MainWindow : public QMainWindow
void setDlSpeed(QString speed); void setDlSpeed(QString speed);
void on_loginBox_accepted(); void on_actionHiddenService_triggered();
signals: signals:
void stopDownloading(QProcess *); void stopDownloading(QProcess *);
@ -220,7 +223,7 @@ signals:
void speed(QString); void speed(QString);
void finishedSignal(bool = true); void finishedSignal(bool = true);
void fileName(QString); void fileName(QString);
//void errorSignal(QString); void passwordReady();
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -325,6 +325,9 @@
<property name="inputMethodHints"> <property name="inputMethodHints">
<set>Qt::ImhNoAutoUppercase</set> <set>Qt::ImhNoAutoUppercase</set>
</property> </property>
<property name="placeholderText">
<string>Filter...</string>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -399,6 +402,7 @@
<bool>false</bool> <bool>false</bool>
</attribute> </attribute>
<addaction name="DefaultSaveFolder"/> <addaction name="DefaultSaveFolder"/>
<addaction name="actionHiddenService"/>
<addaction name="action_Settings"/> <addaction name="action_Settings"/>
<addaction name="actionAbout"/> <addaction name="actionAbout"/>
<addaction name="actionAbout_Qt"/> <addaction name="actionAbout_Qt"/>
@ -466,6 +470,15 @@
<string>Ctrl+Q</string> <string>Ctrl+Q</string>
</property> </property>
</action> </action>
<action name="actionHiddenService">
<property name="icon">
<iconset theme="folder-open">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>hidden service</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>

55
password.cpp Normal file
View File

@ -0,0 +1,55 @@
//#include "mainwindow.h"
#include "password.h"
#include <qt5keychain/keychain.h>
#include <qt5keychain/qkeychain_export.h>
#include <QSettings>
using namespace std;
extern QApplication a;
QString appName = "RsyncUI";
static QSettings sett{appName, appName};
void setPassword(QString account, QString pass)
{
QKeychain::WritePasswordJob write(appName);
write.setSettings(&sett);
// write.setAutoDelete(false);
write.setKey(account);
write.setTextData(pass);
QEventLoop loop;
write.connect(&write, &QKeychain::WritePasswordJob::finished, &loop, &QEventLoop::quit);
write.start();
loop.exec();
if(write.error())
cout << "Error writing key1. Error: " << write.errorString().toStdString();
}
QString getPassword(const QString& name)
{
QKeychain::ReadPasswordJob readPass(appName);
readPass.setSettings(&sett);
// readPass.setAutoDelete(false);
readPass.setKey(name);
QEventLoop loop;
readPass.connect(&readPass, &QKeychain::ReadPasswordJob::finished, &loop, &QEventLoop::quit);
readPass.start();
loop.exec();
if(readPass.error())
{
cout << "KeyHandler~Error reading decrypt Pass. Error: " + readPass.errorString() . toStdString() << endl;
return "";
}
else
{
QString data = readPass.textData();
return data;
}
}

13
password.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef PASSWORD_H
#define PASSWORD_H
#include "mainwindow.h"
#include <qt5keychain/keychain.h>
#include <qt5keychain/qkeychain_export.h>
extern QApplication a;
void setPassword(QString account, QString pass);
QString getPassword(const QString& name);
#endif // PASSWORD_H

View File

@ -6,69 +6,32 @@ using namespace std;
#define WRITE 1 #define WRITE 1
extern QMap<int, QString> rsyncErrorStrings; extern QMap<int, QString> rsyncErrorStrings;
extern QApplication a;
//Take a string and explode it in array
// s => string to explode
// c => character separator
// n => number of results in array, the last is the rest of string to end
const vector<string> explode(const string& s, const char& c, int n = 0)
{
string buff;
vector<string> v;
size_t pos = 0;
size_t ppos = 0;
int i = 0;
while (i < n - 1)
{
pos = s.find(c, ppos);
if (pos != string::npos)
{
buff = s.substr(ppos, pos - ppos);
if (buff != "")
{
i++;
v.push_back(s.substr(ppos, pos - ppos));
}
ppos = pos + 1;
}else
{
break;
}
}
if (ppos < s.size())
{
v.push_back(s.substr(ppos));
}
return v;
}
// test return code of rsync // test return code of rsync
// return true in case of error
bool testRsyncReturn(MainWindow * w, QProcess * myProcess) bool testRsyncReturn(MainWindow * w, QProcess * myProcess)
{ {
if (myProcess->exitStatus() != 0) if (myProcess->exitStatus() != 0 and w->stopDlAsked != true)
{ {
cout << "rsync error: " << myProcess->error() << " : " << myProcess->errorString().toStdString() << endl;
QMessageBox::warning( QMessageBox::warning(
NULL, w,
"RsyncUI", a.applicationName(),
myProcess->errorString(), myProcess->errorString(),
QMessageBox::Ok, QMessageBox::Ok,
QMessageBox::Ok); QMessageBox::Ok);
return true; return true;
}else if (myProcess->exitCode() == 5)
{
w->loginDialog.show();
}else if (myProcess->exitCode() != 0)
{
QMessageBox::warning(
NULL,
"RsyncUI",
rsyncErrorStrings[myProcess->exitCode()],
QMessageBox::Ok,
QMessageBox::Ok);
return true;
} }
w->stopDlAsked = false;
return false; return false;
} }
QString getFileType(QString filename)
{
QMimeDatabase db;
QMimeType mime = db.mimeTypeForFile(filename);
QString returnValue = mime.name().section('/',0 ,0);
return returnValue;
}

View File

@ -1,7 +1,6 @@
#ifndef TOOLS_H #ifndef TOOLS_H
#define TOOLS_H #define TOOLS_H
#include "mainwindow.h"
#include <string> #include <string>
#include <vector> #include <vector>
#include <array> #include <array>
@ -9,15 +8,16 @@
#include <QMap> #include <QMap>
#include <QTranslator> #include <QTranslator>
#include <QProcess> #include <QProcess>
#include <QMimeDatabase>
#include <QMimeType>
using namespace std; using namespace std;
const vector<string> explode(const string& s, const char& c, int n);
FILE * popen2(array<string,8> argv, string type, int & pid); FILE * popen2(array<string,8> argv, string type, int & pid);
int pclose2(FILE * fp, pid_t pid); int pclose2(FILE * fp, pid_t pid);
bool testRsyncReturn(MainWindow *, QProcess *); bool testRsyncReturn(MainWindow *, QProcess *);
QString getFileType(QString finename);
#endif // TOOLS_H #endif // TOOLS_H

8
version.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef VERSION_H
#define VERSION_H
#include <QString>
QString version = "2.11.5";
#endif // VERSION_H