Compare commits

...

21 Commits

Author SHA1 Message Date
470b88f422 version 2.13.2 2025-03-24 00:52:46 +08:00
a235d2f745 sauvegarde 2025-03-21 13:44:27 +01:00
00e428c5b6 version 2.13.1 2024-10-19 12:30:10 +02:00
a766bffd85 added 'suspend' button 2024-10-19 12:29:49 +02:00
200006e50f version 2.13 2024-10-18 22:41:30 +02:00
029be91dc8 added 'suspend' button 2024-10-18 22:39:09 +02:00
fe3e68d205 version 2.12.10 2024-10-18 15:56:52 +02:00
51021023fc same bug 2024-10-18 15:56:33 +02:00
8ccab25a98 version 2.12.9 2024-10-18 15:52:26 +02:00
74e2283aa0 resolved bug with space in filename 2024-10-18 15:52:13 +02:00
67fb0a4b7e version 2.12.8 2024-10-18 12:03:40 +02:00
317a6b8010 same bug 2024-10-18 12:03:30 +02:00
e278a58aae version 2.12.7 2024-10-18 11:31:49 +02:00
afe4c6e9c9 resolved blocking bug when double-click on an item in file treeview 2024-10-18 11:31:44 +02:00
fb126c8b66 version 2.12.6 2024-10-14 18:31:09 +02:00
571da3d8a3 Corrected:\n- bug on ipv6\n- bug on saving settings 2024-10-14 18:30:12 +02:00
7d59b24df0 version 2.12.5 2024-09-17 21:39:59 +02:00
d07905eff0 adding debug 2024-09-17 21:39:31 +02:00
631ab3819e version 2.12.4 2024-09-15 17:30:48 +02:00
c805c47bbc added verification on port number 2024-09-15 17:30:16 +02:00
9bf749aefd - now select directory show the current directory for the server and service 2024-09-11 15:08:28 +02:00
15 changed files with 1582 additions and 1343 deletions

View File

@ -31,20 +31,20 @@ 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: Services cachés 2éme icône: Services cachés
- Permet de configurer un service caché. - Permet de configurer un service caché.
Il faut donner le nom du service et le mot de passe si besoin. Il faut donner le nom du service et le mot de passe si besoin.
3ème icône: Paramètres de l'application 3ème icône: Paramètres de l'application
- Limite de bande passante - Limite de bande passante
Permet de limiter le débit de téléchargement en Ko, Mo, Go, To et Po. Permet de limiter le débit de téléchargement en Ko, Mo, Go, To et Po.
Si la valeur est 0 alors pas de limite de la vitesse de téléchargement. Si la valeur est 0 alors pas de limite de la vitesse de téléchargement.
- Affichage de la barre d'outils - Affichage de la barre d'outils
Permet de choisir le style d'affichage des icônes de la barre d'outils Permet de choisir le style d'affichage des icônes de la barre d'outils
- 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 4è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 5ème icône: À propos de QT
5ème icône: Quitter 6ème icône: Quitter
Permet de quitter le programme. Permet de quitter le programme.

View File

@ -54,7 +54,7 @@ INSTALLS += icon
DISTFILES += \ DISTFILES += \
RsyncUI.desktop RsyncUI.desktop
lang.path = /languages/ lang.path = /languages/fr_FR/LC_MESSAGES/
lang.path = /usr/share/locale/ lang.path = /usr/share/locale/
lang.files = languages/* lang.files = languages/*
documentation.path = /usr/share/doc/RsyncUI documentation.path = /usr/share/doc/RsyncUI

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 9.0.1, 2024-08-29T01:07:20. --> <!-- Written by QtCreator 9.0.1, 2024-09-10T18:35:52. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>

View File

@ -2,7 +2,7 @@
Name: rsyncui Name: rsyncui
Summary: Client for rsync server Summary: Client for rsync server
Version: 2.12.3 Version: 2.13.2
Release: %mkrel 1 Release: %mkrel 1
License: GPLv3 License: GPLv3
Group: Networking/Remote access Group: Networking/Remote access

Binary file not shown.

View File

@ -242,7 +242,7 @@ a file de téléchargement</translation>
<translation>Po</translation> <translation>Po</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="63"/> <location filename="mainwindow.cpp" line="71"/>
<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;
@ -259,120 +259,130 @@ Cliquez sur un fichier pour le supprimer de la file et une fenêtre de confirmat
&lt;h3&gt;Barre d&apos;outils&lt;/h3&gt; &lt;h3&gt;Barre d&apos;outils&lt;/h3&gt;
&lt;b&gt;1er icône: Changer le dossier de destination&lt;/b&gt;&lt;br&gt; &lt;b&gt;1er icône: Changer le dossier de destination&lt;/b&gt;&lt;br&gt;
Permet de changer le dossier de téléchargement par défaut pour chaque service de chaque serveur.&lt;br&gt; Permet de changer le dossier de téléchargement par défaut pour chaque service de chaque serveur.&lt;br&gt;
&lt;b&gt;2ème icône: Services cachés&lt;/b&gt;&lt;br&gt; &lt;b&gt;2ème icône: Services cachés&lt;/b&gt;&lt;br&gt;
- Permet de configurer un service caché.&lt;br&gt; - Permet de configurer un service caché.&lt;br&gt;
Il faut donner le nom du service et le mot de passe si besoin.&lt;br&gt; Il faut donner le nom du service et le mot de passe si besoin.&lt;br&gt;
&lt;b&gt;3ème icône: Paramètres de l&apos;application&lt;/b&gt;&lt;br&gt; &lt;b&gt;3ème icône: Paramètres de l&apos;application&lt;/b&gt;&lt;br&gt;
Limite de bande passante: permet de limiter le débit de téléchargement en Ko, Mo, Go, To et Po.&lt;br&gt; Limite de bande passante: permet de limiter le débit de téléchargement en Ko, Mo, Go, To et Po.&lt;br&gt;
Si la valeur est 0 alors pas de limite de la vitesse de téléchargement.&lt;br&gt; Si la valeur est 0 alors pas de limite de la vitesse de téléchargement.&lt;br&gt;
- Affichage de la barre d&apos;outils&lt;br&gt; - Affichage de la barre d&apos;outils&lt;br&gt;
Permet de choisir le style d&apos;affichage des icônes de la barre d&apos;outils&lt;br&gt; Permet de choisir le style d&apos;affichage des icônes de la barre d&apos;outils&lt;br&gt;
- Enregistrement automatique&lt;br&gt; - Enregistrement automatique&lt;br&gt;
Enregistre automatiquement la liste des téléchargements en cours.(activé par défaut)&lt;br&gt; Enregistre automatiquement la liste des téléchargements en cours.(activé par défaut)&lt;br&gt;
&lt;b&gt;3ème icône: À propos&lt;/b&gt;&lt;br&gt; &lt;b&gt;4ème icône: À propos&lt;/b&gt;&lt;br&gt;
affiche les propriétés de l&apos;application, ainsi que l&apos;aide.&lt;br&gt; affiche les propriétés de l&apos;application, ainsi que l&apos;aide.&lt;br&gt;
&lt;b&gt;4ème icône: À propos de QT&lt;/b&gt;&lt;br&gt; &lt;b&gt;5ème icône: À propos de QT&lt;/b&gt;&lt;br&gt;
affiche les propriétés de QT&lt;br&gt; affiche les propriétés de QT&lt;br&gt;
&lt;b&gt;5ème icône: Quitter&lt;/b&gt;&lt;br&gt; &lt;b&gt;6ème icône: Quitter&lt;/b&gt;&lt;br&gt;
Permet de quitter le programme</translation> Permet de quitter le programme</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="72"/> <location filename="mainwindow.cpp" line="80"/>
<source>Path</source> <source>Path</source>
<translation>Chemin</translation> <translation>Chemin</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="72"/> <location filename="mainwindow.cpp" line="80"/>
<source>Size</source> <source>Size</source>
<translation>Taille</translation> <translation>Taille</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="72"/> <location filename="mainwindow.cpp" line="80"/>
<source>Type</source> <source>Type</source>
<translation>Type</translation> <translation>Type</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="72"/> <location filename="mainwindow.cpp" line="80"/>
<source>Date</source> <source>Date</source>
<translation>Date</translation> <translation>Date</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="87"/> <location filename="mainwindow.cpp" line="95"/>
<source>KB/s</source> <source>KB/s</source>
<translation>Ko/s</translation> <translation>Ko/s</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="87"/> <location filename="mainwindow.cpp" line="95"/>
<source>MB/s</source> <source>MB/s</source>
<translation>Mo/s</translation> <translation>Mo/s</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="87"/> <location filename="mainwindow.cpp" line="95"/>
<source>GB/s</source> <source>GB/s</source>
<translation>Go/s</translation> <translation>Go/s</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="87"/> <location filename="mainwindow.cpp" line="95"/>
<source>TB/s</source> <source>TB/s</source>
<translation>To/s</translation> <translation>To/s</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="87"/> <location filename="mainwindow.cpp" line="95"/>
<source>PB/s</source> <source>PB/s</source>
<translation>Po/s</translation> <translation>Po/s</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="131"/> <location filename="mainwindow.cpp" line="138"/>
<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="133"/> <location filename="mainwindow.cpp" line="140"/>
<source>Delete</source> <source>Delete</source>
<translation>Effacer</translation> <translation>Effacer</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="165"/> <location filename="mainwindow.cpp" line="172"/>
<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="232"/> <location filename="mainwindow.cpp" line="239"/>
<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="238"/> <location filename="mainwindow.cpp" line="245"/>
<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="280"/> <location filename="mainwindow.cpp" line="287"/>
<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="657"/> <location filename="mainwindow.cpp" line="670"/>
<source>Authentication failed</source> <source>Authentication failed</source>
<translation>Mauvais mot de passe ou utilisateur</translation> <translation>Mauvais mot de passe ou utilisateur</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="716"/> <location filename="mainwindow.cpp" line="729"/>
<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>
<location filename="mainwindow.cpp" line="834"/>
<source>Bad port number, correct it</source>
<translation>Numéro de port incorrect, corrigez le.</translation>
</message>
<message>
<location filename="mainwindow.cpp" line="1386"/>
<source>You need to select a service before you can select a folder</source>
<translation>Vous devez sélectionner un service pour pouvoir sélectionner un dossier</translation>
</message>
<message> <message>
<source>server does not exists</source> <source>server does not exists</source>
<translation type="vanished">Le serveur n&apos;existe pas</translation> <translation type="vanished">Le serveur n&apos;existe pas</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="852"/> <location filename="mainwindow.cpp" line="872"/>
<location filename="mainwindow.cpp" line="1006"/> <location filename="mainwindow.cpp" line="1026"/>
<source>Dir</source> <source>Dir</source>
<translation>dossier</translation> <translation>dossier</translation>
</message> </message>
@ -381,51 +391,51 @@ Voulez-vous vraiment sortir ?</translation>
<translation type="vanished">Doc</translation> <translation type="vanished">Doc</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="1035"/> <location filename="mainwindow.cpp" line="1055"/>
<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="1054"/> <location filename="mainwindow.cpp" line="1074"/>
<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="1089"/> <location filename="mainwindow.cpp" line="1109"/>
<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="1124"/> <location filename="mainwindow.cpp" line="1144"/>
<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="1141"/> <location filename="mainwindow.cpp" line="1161"/>
<source>finished</source> <source>finished</source>
<translation>Terminé</translation> <translation>Terminé</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="1151"/> <location filename="mainwindow.cpp" line="1171"/>
<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="1162"/> <location filename="mainwindow.cpp" line="1182"/>
<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="1173"/> <location filename="mainwindow.cpp" line="1193"/>
<source> <source>
Do you want to retry?</source> Do you want to retry?</source>
<translation> <translation>
Voulez-vous -essayer?</translation> Voulez-vous -essayer?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="1182"/> <location filename="mainwindow.cpp" line="1202"/>
<source>Download </source> <source>Download </source>
<translation>Téléchargement </translation> <translation>Téléchargement </translation>
</message> </message>
@ -434,73 +444,72 @@ Voulez-vous ré-essayer?</translation>
<translation type="vanished">Requête RsyncUI</translation> <translation type="vanished">Requête RsyncUI</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="1545"/> <location filename="mainwindow.cpp" line="1566"/>
<source>Hidden service name</source> <source>Hidden service name</source>
<translation>Nom du servcice caché</translation> <translation>Nom du servcice caché</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="58"/> <location filename="mainwindow.cpp" line="66"/>
<source>Version</source> <source>Version</source>
<translation>Version</translation> <translation>Version</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="57"/> <location filename="mainwindow.cpp" line="65"/>
<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="59"/> <location filename="mainwindow.cpp" line="67"/>
<source>Licence</source> <source>Licence</source>
<translation>License</translation> <translation>License</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="60"/> <location filename="mainwindow.cpp" line="68"/>
<source>Author</source> <source>Author</source>
<translation>Auteur</translation> <translation>Auteur</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="61"/> <location filename="mainwindow.cpp" line="69"/>
<source>EMail</source> <source>EMail</source>
<translation>Courriel</translation> <translation>Courriel</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="62"/> <location filename="mainwindow.cpp" line="70"/>
<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="934"/> <location filename="mainwindow.cpp" line="954"/>
<source>Select the user you want to connect with or enter a new one</source> <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> <translation>Choisissez l&apos;utilisateur avec lequel vous voulez vous connecter ou entrez en un nouveau</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="947"/> <location filename="mainwindow.cpp" line="967"/>
<location filename="mainwindow.cpp" line="1544"/> <location filename="mainwindow.cpp" line="1565"/>
<source> Request</source> <source> Request</source>
<translation> Requête de mot de passe</translation> <translation> Requête de mot de passe</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="948"/> <location filename="mainwindow.cpp" line="968"/>
<source>Enter password</source> <source>Enter password</source>
<translation>Entrez votre mot de passe</translation> <translation>Entrez votre mot de passe</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="1365"/>
<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 type="vanished">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="1370"/> <location filename="mainwindow.cpp" line="1394"/>
<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="1255"/> <location filename="mainwindow.cpp" line="1275"/>
<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="1270"/> <location filename="mainwindow.cpp" line="1290"/>
<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>
@ -543,87 +552,87 @@ Voulez-vous ré-essayer?</translation>
<context> <context>
<name>QTranslator</name> <name>QTranslator</name>
<message> <message>
<location filename="mainwindow.cpp" line="17"/> <location filename="mainwindow.cpp" line="25"/>
<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="18"/> <location filename="mainwindow.cpp" line="26"/>
<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="19"/> <location filename="mainwindow.cpp" line="27"/>
<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="20"/> <location filename="mainwindow.cpp" line="28"/>
<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="21"/> <location filename="mainwindow.cpp" line="29"/>
<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="22"/> <location filename="mainwindow.cpp" line="30"/>
<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="23"/> <location filename="mainwindow.cpp" line="31"/>
<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="24"/> <location filename="mainwindow.cpp" line="32"/>
<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="25"/> <location filename="mainwindow.cpp" line="33"/>
<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="26"/> <location filename="mainwindow.cpp" line="34"/>
<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="27"/> <location filename="mainwindow.cpp" line="35"/>
<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="28"/> <location filename="mainwindow.cpp" line="36"/>
<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="29"/> <location filename="mainwindow.cpp" line="37"/>
<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="30"/> <location filename="mainwindow.cpp" line="38"/>
<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="31"/> <location filename="mainwindow.cpp" line="39"/>
<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="32"/> <location filename="mainwindow.cpp" line="40"/>
<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="33"/> <location filename="mainwindow.cpp" line="41"/>
<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

@ -52,7 +52,7 @@ void MainWindow::download()
{ {
info(DEBUGMACRO, "Adding user to server (user@server"); info(DEBUGMACRO, "Adding user to server (user@server");
this->downloading.user = this->connexion.user; this->downloading.user = this->connexion.user;
server = this->connexion.user + "@" + this->downloading.server; server = this->connexion.user + "@" + "[" + this->downloading.server + "]";
env.insert("RSYNC_PASSWORD", this->downloading.password); // Add an environment variable env.insert("RSYNC_PASSWORD", this->downloading.password); // Add an environment variable
this->downloading.process->setProcessEnvironment(env); this->downloading.process->setProcessEnvironment(env);
} }
@ -64,7 +64,7 @@ void MainWindow::download()
param << "--bwlimit=" + QString::number(this->connexion.bandwidthLimit) + bwUnitChar[this->connexion.bandwidthLimitUnit]; param << "--bwlimit=" + QString::number(this->connexion.bandwidthLimit) + bwUnitChar[this->connexion.bandwidthLimitUnit];
} }
ipversion = validateServer(server); ipversion = validateServer(&server);
if (downloading.ipversion == 4 || downloading.ipversion == 6) if (downloading.ipversion == 4 || downloading.ipversion == 6)
{ {
@ -74,7 +74,7 @@ void MainWindow::download()
param << "--port" << QString::number(this->downloading.port).trimmed(); param << "--port" << QString::number(this->downloading.port).trimmed();
param << "-aXP"; param << "-aXP";
param << "[" + server + "]::" + this->downloading.service.trimmed() + "/" + this->downloading.path.trimmed() << this->downloading.savePath.trimmed() + "/"; param << "[" + server + "]::" + this->downloading.service.trimmed() + "/" + preparePath(this->downloading.path) << preparePath(this->downloading.savePath) + "/";
info(DEBUGMACRO, cmd + " " + param.join(" ")); info(DEBUGMACRO, cmd + " " + param.join(" "));
@ -102,6 +102,7 @@ void MainWindow::readRsyncOutput()
{ {
list.clear(); list.clear();
line = QString::fromUtf8(this->downloading.process->readLine()); line = QString::fromUtf8(this->downloading.process->readLine());
info(DEBUGMACRO, "downloading progress : " + line);
if (line.isEmpty()) if (line.isEmpty())
{ {
break; break;

View File

@ -1,6 +1,7 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "tools.h" #include "tools.h"
#include <QTranslator> #include <QTranslator>
#include <QHostInfo>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -29,5 +30,6 @@ int main(int argc, char *argv[])
MainWindow w; MainWindow w;
info(DEBUGMACRO, "RsyncUI begining"); info(DEBUGMACRO, "RsyncUI begining");
w.show(); w.show();
return a.exec(); return a.exec();
} }

View File

@ -7,12 +7,9 @@
#include "tools.h" #include "tools.h"
#include "password.h" #include "password.h"
#include <kcombobox.h> #include <kcombobox.h>
#include <signal.h>
/* #include <QTextStream>
#include <klineedit.h> #include <QHostInfo>
#include <khistorycombobox.h>
#include <kcompletion.h>
*/
using namespace std; using namespace std;
@ -323,7 +320,7 @@ void MainWindow::populateTree()
info(DEBUGMACRO, "Validating server"); info(DEBUGMACRO, "Validating server");
// validating server's address // validating server's address
this->connexion.ipversion = validateServer(this->connexion.server); this->connexion.ipversion = validateServer(&this->connexion.server);
if (this->connexion.ipversion != 0) if (this->connexion.ipversion != 0)
{ {
// server is validated, scanning directory // server is validated, scanning directory
@ -350,18 +347,22 @@ void MainWindow::populateList(QString server, uint port)
info(DEBUGMACRO, "populateList() => Populating list of services"); info(DEBUGMACRO, "populateList() => Populating list of services");
info(DEBUGMACRO, "port: " + QString::number(port) + " - server: " + server); info(DEBUGMACRO, "port: " + QString::number(port) + " - server: " + server);
if (server.isEmpty()) if (server.isEmpty())
{ {
ui->listWidget->clear(); ui->listWidget->clear();
ui->treeWidget->clear(); ui->treeWidget->clear();
return; return;
} }
if ((server != this->connexion.server))
if (server != this->connexion.server)
{ {
// Determine version of Ip Protocol // Determine version of Ip Protocol
info(DEBUGMACRO, "Server changed"); info(DEBUGMACRO, "Server changed");
this->connexion.ipversion = validateServer(&server);
this->connexion.server = server; this->connexion.server = server;
if (port != false) if (port != false)
{ {
this->connexion.port = port; this->connexion.port = port;
@ -370,13 +371,14 @@ void MainWindow::populateList(QString server, uint port)
QGuiApplication::setOverrideCursor(Qt::WaitCursor); QGuiApplication::setOverrideCursor(Qt::WaitCursor);
// verify if server is in history // verify if server is in history
this->settings.beginGroup("connexion/server"); this->settings.beginGroup("connexion/Servers");
if (this->settings.contains(server)) if (this->settings.contains(server))
{ {
this->settings.beginGroup(server);
info(DEBUGMACRO, "Server configuration exists in settings"); info(DEBUGMACRO, "Server configuration exists in settings");
// server is in history => setting port value // server is in history => setting port value
port = this->settings.value(server).toUInt(); port = this->settings.value("port").toUInt();
this->connexion.ipversion = this->settings.value("ipversion").toUInt(); this->connexion.ipversion = this->settings.value("ipversion").toUInt();
ui->portEdit->setText(QString::number(port)); ui->portEdit->setText(QString::number(port));
this->connexion.port = port; this->connexion.port = port;
@ -384,8 +386,10 @@ void MainWindow::populateList(QString server, uint port)
ok = true; ok = true;
//display list of services //display list of services
//listServices(); // TODO clear in listServices //listServices(); // TODO clear in listServices
this->settings.endGroup();
} }
this->settings.endGroup(); this->settings.endGroup();
this->settings.endGroup();
} }
if (port != this->connexion.port) if (port != this->connexion.port)
{ {
@ -400,8 +404,8 @@ void MainWindow::populateList(QString server, uint port)
{ {
if (this->connexion.ipversion == 0) if (this->connexion.ipversion == 0)
{ {
this->connexion.ipversion = validateServer(server); this->connexion.ipversion = validateServer(&server);
info(DEBUGMACRO, QString::number(this->connexion.ipversion)); info(DEBUGMACRO, "IP version : " + QString::number(this->connexion.ipversion));
} }
if (this->connexion.ipversion != 0) if (this->connexion.ipversion != 0)
@ -411,17 +415,27 @@ void MainWindow::populateList(QString server, uint port)
info(DEBUGMACRO,"Saving server configuration in settings"); info(DEBUGMACRO,"Saving server configuration in settings");
// storing serverURL and port in settings // storing serverURL and port in settings
this->settings.setValue(server, port); this->settings.beginGroup("connnexion");
this->settings.setValue(server, this->connexion.ipversion); this->settings.beginGroup("Servers");
this->settings.beginGroup(server);
this->settings.setValue("port", port);
this->settings.setValue("ipversion", this->connexion.ipversion);
this->settings.endGroup();
this->settings.endGroup();
this->settings.endGroup();
this->settings.sync(); this->settings.sync();
this->downloading.server = server; this->downloading.server = server;
this->downloading.port = port;
this->downloading.ipversion = this->connexion.ipversion; this->downloading.ipversion = this->connexion.ipversion;
// storing in history of combobox // storing in history of combobox
ui->khistorycombobox->addToHistory(server); ui->khistorycombobox->addToHistory(server);
// load and display rsync services of the rsync server // load and display rsync services of the rsync server
}else
{
info(DEBUGMACRO, "ERROR : Unknown IP version");
} }
}else }else
{ {
@ -429,7 +443,8 @@ void MainWindow::populateList(QString server, uint port)
} }
listServices(); listServices();
this->settings.beginGroup("Hidden/" + server); this->settings.beginGroup("Hidden");
this->settings.beginGroup(server);
hidden = this->settings.allKeys(); hidden = this->settings.allKeys();
if (hidden.count() > 0) if (hidden.count() > 0)
{ {
@ -444,6 +459,7 @@ void MainWindow::populateList(QString server, uint port)
} }
} }
this->settings.endGroup(); this->settings.endGroup();
this->settings.endGroup();
// clearing listview // clearing listview
ui->treeWidget->clear(); ui->treeWidget->clear();
QGuiApplication::restoreOverrideCursor(); //setting cursor to default QGuiApplication::restoreOverrideCursor(); //setting cursor to default
@ -471,7 +487,7 @@ bool MainWindow::testServerPresence(QString service, bool askPassword)
{ {
param << "-" + QString::number(this->connexion.ipversion); param << "-" + QString::number(this->connexion.ipversion);
} }
param << "--contimeout=10" << "-nq" << "--port=" + QString::number(this->connexion.port) << + "[" + this->connexion.server + "]::" + service; param << "--contimeout=10" << "-nq" << "--port=" + QString::number(this->connexion.port) << + "[" + this->connexion.server + "]::" + preparePath(service);
myProcess = new QProcess(this); myProcess = new QProcess(this);
myProcess->setProcessChannelMode(QProcess::MergedChannels); myProcess->setProcessChannelMode(QProcess::MergedChannels);
myProcess->start(cmd, param); myProcess->start(cmd, param);
@ -509,7 +525,7 @@ bool MainWindow::testServerPresence(QString service, bool askPassword)
//list services of the rsync server //list services of the rsync server
void MainWindow::listServices() void MainWindow::listServices()
{ {
QString cmd; QString cmd = "/usr/bin/rsync";
QStringList param; QStringList param;
QString line; QString line;
QString errorRsync; QString errorRsync;
@ -524,7 +540,6 @@ void MainWindow::listServices()
// clearing listwidget // clearing listwidget
ui->listWidget->clear(); ui->listWidget->clear();
cmd = "/usr/bin/rsync";
if (this->connexion.ipversion == 0) if (this->connexion.ipversion == 0)
{ {
this->connexion.ipversion = whatIpVersion(this->connexion.server); this->connexion.ipversion = whatIpVersion(this->connexion.server);
@ -538,7 +553,12 @@ void MainWindow::listServices()
{ {
param << "-" + QString::number(this->connexion.ipversion).trimmed(); param << "-" + QString::number(this->connexion.ipversion).trimmed();
server = "[" + this->connexion.server + "]"; server = "[" + this->connexion.server + "]";
}else
{
error(tr("Error : Unknown IP version"));
return;
} }
param << "--contimeout=20" << "--port=" + QString::number(this->connexion.port) << server + "::"; param << "--contimeout=20" << "--port=" + QString::number(this->connexion.port) << server + "::";
myProcess = new QProcess(this); myProcess = new QProcess(this);
@ -561,7 +581,7 @@ void MainWindow::listServices()
flag = true; flag = true;
break; break;
} }
info(DEBUGMACRO, "extracting services inforamtions"); info(DEBUGMACRO, "extracting services informations");
// extracting name and comment of the service // extracting name and comment of the service
v = line.split("\t"); v = line.split("\t");
v[0].replace(" ", ""); v[0].replace(" ", "");
@ -583,7 +603,7 @@ void MainWindow::listServices()
// connect to rsync server to get list of files // connect to rsync server to get list of files
bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString path) bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString path)
{ {
QString cmd; QString cmd = "rsync";
QStringList param; QStringList param;
QStringList sizeA; QStringList sizeA;
QString line; QString line;
@ -593,6 +613,7 @@ bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString
QString fileType; QString fileType;
QString date; QString date;
QString dirName = ""; QString dirName = "";
QString user;
QProcess * myProcess; QProcess * myProcess;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
bool isDir = false; bool isDir = false;
@ -603,9 +624,12 @@ bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString
static uint looping; static uint looping;
QStringList dirs; QStringList dirs;
QString server = connexion->server; QString server = connexion->server;
bool ret = false;
info(DEBUGMACRO, "scandir() => connect to rsync server to get list of files"); info(DEBUGMACRO, "scandir() => connect to rsync server to get list of files");
ui->listWidget->setCursor(Qt::WaitCursor);
myProcess = new QProcess(this); myProcess = new QProcess(this);
myProcess->setProcessChannelMode(QProcess::MergedChannels); myProcess->setProcessChannelMode(QProcess::MergedChannels);
@ -615,24 +639,26 @@ bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString
} }
if (nChild == 0) if (nChild == 0)
{ {
if (!connexion->user.isEmpty())
{
server.prepend(connexion->user + "@");
env.insert("RSYNC_PASSWORD", connexion->password); // Add an environment variable
}else
{
server.prepend("anonymous@");
env.insert("RSYNC_PASSWORD", "anonymous"); // Add an environment variable
}
myProcess->setProcessEnvironment(env); myProcess->setProcessEnvironment(env);
info(DEBUGMACRO, "ipversion => " + QString::number(connexion->ipversion)); info(DEBUGMACRO, "ipversion => " + QString::number(connexion->ipversion));
cmd = "rsync";
if(this->connexion.ipversion == 4 || this->connexion.ipversion == 6) if(this->connexion.ipversion == 4 || this->connexion.ipversion == 6)
{ {
param << "-" + QString::number(connexion->ipversion).trimmed(); param << "-" + QString::number(connexion->ipversion).trimmed();
} }
param << "--contimeout=20" << "--port=" + QString::number(connexion->port) << "[" + server + "]::" + path;
if (!connexion->user.isEmpty())
{
user = connexion->user + "@";
env.insert("RSYNC_PASSWORD", connexion->password); // Add an environment variable
}else
{
user = "anonymous@";
env.insert("RSYNC_PASSWORD", "anonymous"); // Add an environment variable
}
param << "--contimeout=20" << "--port=" + QString::number(connexion->port) << user + "[" + server + "]::" + preparePath(path) ;
info(DEBUGMACRO, cmd + " " + param.join(" ")); info(DEBUGMACRO, cmd + " " + param.join(" "));
@ -733,37 +759,59 @@ bool MainWindow::scanDir(Connexion * connexion, QTreeWidgetItem *parent, QString
}while(readOk); }while(readOk);
// buffer empty go to waiting new datas // buffer empty go to waiting new datas
testRsyncReturn(this, myProcess); ret = testRsyncReturn(this, myProcess);
myProcess->close(); myProcess->close();
} }
return false; ui->listWidget->setCursor(Qt::ArrowCursor);
return ret;
} }
// validate address server // validate address server
uint MainWindow::validateServer(QString server) uint MainWindow::validateServer(QString *server)
{ {
QString cmd; QString cmd;
QStringList param; QStringList param;
QString line; QString line;
QProcess * myProcess; QProcess * myProcess;
QStringList responseList; QStringList responseList;
QFile fileHandle("/etc/hosts");
uint ipversion; uint ipversion = 0;
int answerFound = 0; int answerFound = 0;
int queryPos = 0; int queryPos = 0;
QHostAddress serverAddress;
info(DEBUGMACRO, "ValidateServer() => Validating server address"); info(DEBUGMACRO, "ValidateServer() => Validating server address");
ipversion = whatIpVersion(server); //if (ipversion == 0) // not an Ip address, perhaps a server name
//{
if (ipversion == 0) // not an Ip address, perhaps a server name serverAddress = searchHosts(*server);
if (!serverAddress.isNull())
{ {
server->clear();
server->append(serverAddress.toString());
info(DEBUGMACRO, "Server address : " + *server);
}else
{
if (!serverAddress.setAddress(*server))
{
info(DEBUGMACRO, "Digging server name"); info(DEBUGMACRO, "Digging server name");
cmd = "dig"; cmd = "dig";
param << "-t A"; // IP V4 query param << server->trimmed() ;
param << "-t AAAA"; // IP V6 query if (ipversion == IPV4)
param << server.trimmed() ; {
param << "A"; // IP V4 query
}else if (ipversion == IPV6)
{
param << "AAAA"; // IP V6 query
}else
{
error("Protocol is not IPV4 or IPV6 !!");
}
info(DEBUGMACRO, cmd + " " + param.join(" ")); info(DEBUGMACRO, cmd + " " + param.join(" "));
@ -783,7 +831,7 @@ uint MainWindow::validateServer(QString server)
break; break;
}else }else
{ {
answerFound = line.indexOf(";; ANSWER SECTION:") +19; answerFound = line.indexOf(";; ANSWER SECTION:") + 19;
info(DEBUGMACRO, "Position of answer line is : " + QString::number(answerFound)); info(DEBUGMACRO, "Position of answer line is : " + QString::number(answerFound));
if (answerFound != -1) if (answerFound != -1)
@ -797,12 +845,11 @@ uint MainWindow::validateServer(QString server)
info(DEBUGMACRO, "line is:\n" + line); info(DEBUGMACRO, "line is:\n" + line);
responseList = line.split(QRegExp("\\s+")); responseList = line.split(QRegExp("\\s+"));
info(DEBUGMACRO, "ip Address is => " + responseList.at(4)); info(DEBUGMACRO, "ip Address is => " + responseList.at(4));
if(responseList.at(3) == "A") if (serverAddress.setAddress(responseList.at(4)))
{ {
return 4; //error ("Address " + responseList.at(4) + " is bad");
}else if(responseList.at(3) == "AAAA") server->clear();
{ server->append(serverAddress.toString());
return 6;
} }
} }
} }
@ -811,23 +858,37 @@ uint MainWindow::validateServer(QString server)
} }
myProcess->close(); myProcess->close();
} }
info(DEBUGMACRO, "Returning ip version: " + QString::number(ipversion)); }
return ipversion;
return 0; info(DEBUGMACRO, "Returning ip version: " + QString::number(ipversion));
//ipversion = whatIpVersion(*server);
ipversion = serverAddress.protocol();
return (ipversion==IPV4?4:6);
} }
// slot activated when button connection is clicked // slot activated when button connection is clicked
void MainWindow::on_connectButton_clicked() void MainWindow::on_connectButton_clicked()
{ {
QString server; QString server;
uint port; uint port;
//uint ipversion;
info(DEBUGMACRO, "on_connectButton_clicked() => Connexion button clicked"); info(DEBUGMACRO, "on_connectButton_clicked() => Connexion button clicked");
server = ui->khistorycombobox->currentText();
port = ui->portEdit->text().toUInt(); port = ui->portEdit->text().toUInt();
if (port > 0 and port < 65535)
{
server = ui->khistorycombobox->currentText();
//ipversion = validateServer(&server);
populateList(server, port); populateList(server, port);
}else
{
error(tr("Bad port number, correct it"));
ui->portEdit->clear();
ui->portEdit->setFocus();
}
} }
// add parent in treeview // add parent in treeview
@ -867,7 +928,8 @@ void MainWindow::addTreeItem(QString name, QString fileSize, QString fullsize, Q
}else }else
{ {
// item is a file // item is a file
this->settings.beginGroup("Downloaded/"); this->settings.beginGroup("Downloaded");
//TODO add to settings
this->settings.endGroup(); this->settings.endGroup();
treeItem->setText(1,type); treeItem->setText(1,type);
} }
@ -992,6 +1054,7 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
QString str; QString str;
QMessageBox::StandardButton reply; QMessageBox::StandardButton reply;
int sizeFromRsync; int sizeFromRsync;
bool ret = false;
info(DEBUGMACRO, "on_treeWidget_itemClicked() => Slot activated when a file is clicked in the treeview"); info(DEBUGMACRO, "on_treeWidget_itemClicked() => Slot activated when a file is clicked in the treeview");
@ -1022,23 +1085,26 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
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))
{ {
info(DEBUGMACRO, "saving path do not exists, asking for it");
// saving path do not exists, asking for it // saving path do not exists, asking for it
if(!on_DefaultSaveFolder_triggered()) if(!on_DefaultSaveFolder_triggered())
{ {
cout << "no directory selectioned, ignoring download request" << endl; info(DEBUGMACRO, "no directory selectioned, ignoring download request");
this->treeviewClicked = false; this->treeviewClicked = false;
return; return;
} }
}else }else
{ {
this->downloading.savePath = this->settings.value(str).toString(); this->downloading.savePath = this->settings.value(str).toString();
info(DEBUGMACRO, "saving folder : " + this->downloading.savePath);
} }
// Item is a file // Item is a file
// searching if file exists in savepath // searching if file exists in savepath
info(DEBUGMACRO, "searching if file exists in savepath");
if (QFile::exists(this->downloading.savePath + "/" + path)) if (QFile::exists(this->downloading.savePath + "/" + path))
{ {
info(DEBUGMACRO, "file exists in savepath");
QFileInfo fileinfo(this->downloading.savePath + "/" + path); QFileInfo fileinfo(this->downloading.savePath + "/" + path);
if (fileinfo.size() < sizeFromRsync) if (fileinfo.size() < sizeFromRsync)
{ {
@ -1082,9 +1148,11 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
if(ui->listDownload->findItems(path, Qt::MatchStartsWith).empty()) if(ui->listDownload->findItems(path, Qt::MatchStartsWith).empty())
{ {
// is there a downloading process ? // is there a downloading process ?
info(DEBUGMACRO, "is there a downloading process ?");
if (this->downloading.process == nullptr) if (this->downloading.process == nullptr)
{ {
// no downloading process launching it // no downloading process launching it
info(DEBUGMACRO, "no downloading process launching it");
this->downloading.path = path; this->downloading.path = path;
this->downloading.server = this->connexion.server; this->downloading.server = this->connexion.server;
this->downloading.port = this->connexion.port; this->downloading.port = this->connexion.port;
@ -1093,8 +1161,8 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
// wait 1 second to process start // wait 1 second to process start
//sleep(1); //sleep(1);
} }
info(DEBUGMACRO, "Downloading process exist, adding download to download list");
// Adding download in download list // Adding download to download list
str = path + " => " + this->connexion.server + "/" + this->connexion.service; str = path + " => " + this->connexion.server + "/" + this->connexion.service;
ui->listDownload->addItem(str); ui->listDownload->addItem(str);
}else }else
@ -1104,21 +1172,32 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
}else }else
{ {
//Item is a Directory //Item is a Directory
info(DEBUGMACRO, "Item is a Directory");
if (item->isExpanded() == false) if (item->isExpanded() == false)
{ {
while (this->rescan) info(DEBUGMACRO, "Item is not expanded");
//if (this->rescan)
//{
info(DEBUGMACRO, "Re-scanning path: " + this->connexion.service + "/" + path +"/");
ret = scanDir(&this->connexion, item, this->connexion.service + "/" + path +"/");
if(!ret)
{ {
scanDir(&this->connexion, item, this->connexion.service + "/" + path +"/");
item->setExpanded(true); item->setExpanded(true);
} }
//}
}else
{
item->setExpanded(false);
} }
} }
if (config.autosaveCheckbox->checkState() == Qt::Checked) if (config.autosaveCheckbox->checkState() == Qt::Checked)
{ {
info(DEBUGMACRO, "Saving download list");
saveDownloadList(); saveDownloadList();
} }
info(DEBUGMACRO, "Exiting");
this->treeviewClicked = false; this->treeviewClicked = false;
} }
@ -1221,7 +1300,7 @@ 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.port = this->settings.value("connexion/Servers/" + this->downloading.server + "/port").toInt();
this->downloading.path = path; this->downloading.path = path;
//getUserPassword(true); //getUserPassword(true);
@ -1315,7 +1394,7 @@ void MainWindow::loadSettings()
// loading connexion settings // loading connexion settings
// loading servers history // loading servers history
info(DEBUGMACRO, "Restoring server combobox history"); info(DEBUGMACRO, "Restoring server combobox history");
this->settings.beginGroup("connexion/server"); this->settings.beginGroup("connexion/Servers");
QStringList servers = this->settings.allKeys(); QStringList servers = this->settings.allKeys();
this->settings.endGroup(); this->settings.endGroup();
ui->khistorycombobox->insertItems(1,this->settings.value("kHistoryComboBox").toStringList()); ui->khistorycombobox->insertItems(1,this->settings.value("kHistoryComboBox").toStringList());
@ -1369,28 +1448,29 @@ bool MainWindow::on_DefaultSaveFolder_triggered()
QFileDialog dialog; QFileDialog dialog;
QString folder; QString folder;
QString path; QString path;
QString dir;
info(DEBUGMACRO, "on_DefaultSaveFolder_triggered() => Activated when menu 'change folder' is clicked"); info(DEBUGMACRO, "on_DefaultSaveFolder_triggered() => Activated when menu 'change folder' is clicked");
// if service not selected display a message // if service not selected display a message
if (this->connexion.service.isEmpty()) if (this->connexion.service.isEmpty() or this->connexion.server.isEmpty())
{ {
warning(tr("Since the save path is linked to service, you need to select a service before you can select a folder")); warning(tr("You need to select a service before you can select a folder"));
return false; return false;
} }
// Asking for directory to save files // Asking for directory to save files
path = dialog.getExistingDirectory(this, tr("Choose folder where to save file"), QDir::homePath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (!path.isEmpty())
{
this->downloading.savePath = path;
if (!this->connexion.service.isEmpty() and !this->connexion.server.isEmpty())
{
// saving save path in settings
folder = "Folder/" + this->connexion.server + "/" + this->connexion.service; folder = "Folder/" + this->connexion.server + "/" + this->connexion.service;
path = this->settings.value(folder).toString();
info(DEBUGMACRO, "Path = " + path);
dir = dialog.getExistingDirectory(this, tr("Choose folder where to save file"), path, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (!dir.isEmpty())
{
this->downloading.savePath = dir;
// saving save path in settings
this->settings.setValue(folder, this->downloading.savePath); this->settings.setValue(folder, this->downloading.savePath);
this->settings.sync(); this->settings.sync();
}
}else }else
{ {
return false; return false;
@ -1481,7 +1561,7 @@ void MainWindow::loadDownloadList()
path.resize(pos); path.resize(pos);
pos = path.lastIndexOf(" => "); pos = path.lastIndexOf(" => ");
this->downloading.server = path.midRef(pos+4).toString(); this->downloading.server = path.midRef(pos+4).toString();
this->downloading.port = this->settings.value("connexion/server/" + this->downloading.server).toInt(); this->downloading.port = this->settings.value("connexion/Servers/" + this->downloading.server+ "/port").toInt();
path.resize(pos); path.resize(pos);
this->downloading.path = path; this->downloading.path = path;
str = "Folder/" + this->downloading.server + "/" + this->downloading.service; str = "Folder/" + this->downloading.server + "/" + this->downloading.service;
@ -1565,3 +1645,69 @@ void MainWindow::on_actionHiddenService_triggered()
preparePopulateTree(); preparePopulateTree();
} }
} }
void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
(void) item;
(void) column;
}
void MainWindow::on_treeWidget_doubleClicked(const QModelIndex &index)
{
(void) index;
}
void MainWindow::on_actionPause_downloads_triggered()
{
quint64 processID = this->downloading.process->processId();
QString fileStr = "/proc/" + QString::number(processID) + "/task/" + QString::number(processID) + "/children";
static QMessageBox msgBox;
//msgBox = new QMessageBox(this);
msgBox.setIcon( QMessageBox::Warning );
msgBox.setText("Download suspended");
//QPushButton *btnCancel = msgBox->addButton( "Cancel", QMessageBox::RejectRole );
//msgBox.setAttribute(Qt::WA_DeleteOnClose); // delete pointer after close
msgBox.setModal(false);
info (DEBUGMACRO, "downloading state : " + QString::fromUtf8((this->downloading.paused==0)?"running":"paused"));
info (DEBUGMACRO, "Downloading process ID : " + QString::number(processID));
info (DEBUGMACRO, fileStr);
QFile file(fileStr);
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::information(0, "error", file.errorString());
}
QTextStream in(&file);
QString children = in.readLine();
info (DEBUGMACRO, "Child process is : " + children);
if (this->downloading.paused)
{
info(DEBUGMACRO, "resuming Download");
if (kill(children.toLongLong(), SIGCONT))
{
info(DEBUGMACRO, "resuming failed : " + QString::number(errno));
}
if (msgBox.isVisible())
{
msgBox.close();
}
this->downloading.paused = false;
}else
{
info(DEBUGMACRO, "pausing Download");
if (kill(children.toLongLong(), SIGTSTP))
{
info(DEBUGMACRO, "resuming failed : " + QString::number(errno));
}
msgBox.show();
this->downloading.paused = true;
}
}

View File

@ -66,6 +66,7 @@ class Connexion
uint port = 873; uint port = 873;
bool quit = false; bool quit = false;
void clear(); void clear();
bool paused = false;
}; };
class Downloading class Downloading
@ -81,6 +82,8 @@ class Downloading
int port = 873; int port = 873;
QProcess * process = nullptr; QProcess * process = nullptr;
bool quit = false; bool quit = false;
bool paused = false;
void clear(); void clear();
}; };
@ -154,7 +157,7 @@ class MainWindow : public QMainWindow
void populateTree(); void populateTree();
void populateList(QString server, uint port); void populateList(QString server, uint port);
void listServices(); void listServices();
uint validateServer(QString server); uint validateServer(QString * server);
void addTreeItem(QString name, QString fileSize, QString fullsize, QString type, QString date, bool isDir, QString dirName, QTreeWidgetItem *parent); void addTreeItem(QString name, QString fileSize, QString fullsize, QString type, QString date, bool isDir, QString dirName, QTreeWidgetItem *parent);
bool scanDir(Connexion * connexion, QTreeWidgetItem *parent = NULL, QString path = "" ); bool scanDir(Connexion * connexion, QTreeWidgetItem *parent = NULL, QString path = "" );
void startDownloading(); void startDownloading();
@ -219,6 +222,12 @@ class MainWindow : public QMainWindow
//void on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column); //void on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
void on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
void on_treeWidget_doubleClicked(const QModelIndex &index);
void on_actionPause_downloads_triggered();
signals: signals:
void stopDownloading(QProcess *); void stopDownloading(QProcess *);
void progressSignal(int); void progressSignal(int);

View File

@ -159,13 +159,13 @@
<set>Qt::ImhPreferNumbers</set> <set>Qt::ImhPreferNumbers</set>
</property> </property>
<property name="inputMask"> <property name="inputMask">
<string/> <string notr="true"/>
</property> </property>
<property name="text"> <property name="text">
<string comment="numéro"/> <string notr="true" comment="numéro"/>
</property> </property>
<property name="maxLength"> <property name="maxLength">
<number>6</number> <number>5</number>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@ -407,6 +407,7 @@
<addaction name="actionAbout"/> <addaction name="actionAbout"/>
<addaction name="actionAbout_Qt"/> <addaction name="actionAbout_Qt"/>
<addaction name="actionExit"/> <addaction name="actionExit"/>
<addaction name="actionPause_downloads"/>
</widget> </widget>
<action name="DefaultSaveFolder"> <action name="DefaultSaveFolder">
<property name="icon"> <property name="icon">
@ -479,6 +480,20 @@
<string>hidden service</string> <string>hidden service</string>
</property> </property>
</action> </action>
<action name="actionPause_downloads">
<property name="icon">
<iconset theme="media-playback-pause"/>
</property>
<property name="text">
<string>Stop/resume downloads</string>
</property>
<property name="toolTip">
<string>Stop/resume downloading </string>
</property>
<property name="shortcut">
<string>P</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>

View File

@ -1,6 +1,8 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "tools.h" #include "tools.h"
#include "password.h" #include "password.h"
#include <QTextStream>
#include <QHostAddress>
using namespace std; using namespace std;
@ -53,15 +55,31 @@ QString getFileType(QString filename)
return returnValue; return returnValue;
} }
QString preparePath(QString path)
{
return path.trimmed().replace(' ', "\ ");
}
int whatIpVersion(QString ipAddress) int whatIpVersion(QString ipAddress)
{ {
QStringList fieldList; QStringList fieldList;
ulong field; // ulong field;
uint i; // uint i;
uint ipversion;
QHostAddress serverAddress;
info(DEBUGMACRO, "ipVersion of server at " + ipAddress); info(DEBUGMACRO, "ipVersion of server at " + ipAddress);
fieldList = ipAddress.split(":"); if (!serverAddress.setAddress(ipAddress))
{
error ("Address " + ipAddress + " is bad");
}
ipversion = serverAddress.protocol();
return (ipversion==IPV4?4:6);
/*fieldList = ipAddress.split(":");
if (fieldList.count() == 8) if (fieldList.count() == 8)
{ {
for (i=0;i<8;i++) for (i=0;i<8;i++)
@ -88,8 +106,41 @@ int whatIpVersion(QString ipAddress)
} }
info(DEBUGMACRO, "Address is ip V4"); info(DEBUGMACRO, "Address is ip V4");
return 4; return 4;
}*/
}
QHostAddress searchHosts(QString server)
{
QString line = "";
QStringList hosts;
QFile fileHandle("/etc/hosts");
QHostAddress serverAddress;
info(DEBUGMACRO, "reading /etc/hosts");
if (!fileHandle.open(QIODevice::ReadOnly))
{
QMessageBox::information(0,MainWindow::tr("Error"), fileHandle.errorString());
}else
{
QTextStream in(&fileHandle);
while(!in.atEnd())
{
line = in.readLine();
hosts = line.split(QRegularExpression("\\s+"));
if (hosts.contains(server))
{
//if (!serverAddress.isNull()) // and serverAddress.protocol() == QAbstractSocket::IPv4Protocol)
//{
if (!serverAddress.setAddress(hosts.first()))
{
error("Error setting address " + hosts.first());
} }
return 0; //}
}
}
}
return serverAddress;
} }
void warning(QString message) void warning(QString message)

View File

@ -3,6 +3,10 @@
#define DEBUGMACRO QString(__FILE__) + "->" + QString(Q_FUNC_INFO) + ": " + QString::number(__LINE__) + " -" #define DEBUGMACRO QString(__FILE__) + "->" + QString(Q_FUNC_INFO) + ": " + QString::number(__LINE__) + " -"
#define IPV4 0
#define IPV6 1
#include <QHostAddress>
#include <string> #include <string>
#include <vector> #include <vector>
#include <array> #include <array>
@ -22,5 +26,7 @@ int whatIpVersion(QString server);
void warning(QString message); void warning(QString message);
void error(QString message); void error(QString message);
void info(QString debugHeader, QString message); void info(QString debugHeader, QString message);
QString preparePath(QString path);
QHostAddress searchHosts(QString server);
#endif // TOOLS_H #endif // TOOLS_H

View File

@ -3,6 +3,6 @@
#include <QString> #include <QString>
QString version = "2.12.3"; QString version = "2.13.2";
#endif // VERSION_H #endif // VERSION_H