Compare commits

..

5 Commits
2.11.6 ... 2.12

Author SHA1 Message Date
916cbc6d5b version 2.12 2023-10-11 21:40:01 +02:00
cf0216e02a bugs resolution 2023-10-10 23:14:31 +02:00
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
9 changed files with 101 additions and 126 deletions

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, 2023-04-26T19:42:50. --> <!-- Written by QtCreator 9.0.1, 2023-05-01T14:24:07. -->
<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.11.6 Version: 2.12
Release: %mkrel 1 Release: %mkrel 1
License: GPLv3 License: GPLv3
Group: Networking/Remote access Group: Networking/Remote access

View File

@ -61,13 +61,12 @@ void MainWindow::download()
param << "-aXP"; param << "-aXP";
param << this->downloading.server + "::" + this->downloading.service + "/" + this->downloading.path << this->downloading.savePath + "/"; param << this->downloading.server + "::" + this->downloading.service + "/" + this->downloading.path << this->downloading.savePath + "/";
this->downloading.process->start(cmd, param);
connect(this->downloading.process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(downloadFinished(int, QProcess::ExitStatus))); connect(this->downloading.process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(downloadFinished(int, QProcess::ExitStatus)));
//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);
} }
void MainWindow::readRsyncOutput() void MainWindow::readRsyncOutput()

View File

@ -242,36 +242,37 @@ 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)
{
cb = new QCheckBox("Don't show this again ?");
msgBox.setWindowTitle(a.applicationName());
msgBox.setInformativeText(tr("The program will keep running in the "
"system tray. To terminate the program, "
"choose <b>Quit</b> in the context menu "
"of the system tray entry."));
msgBox.addButton(QMessageBox::Ok);
//msgBox.addButton(QMessageBox::No);
// msgBox.setDefaultButton(QMessageBox::Yes);
msgBox.setCheckBox(cb);
msgBox.exec();
msgBox.clickedButton();
// if response is yes then loading list
if (cb->isChecked())
{ {
msgBox.setWindowTitle(a.applicationName()); this->settings.setValue("CloseCheckbox", true);
msgBox.setInformativeText(tr("The program will keep running in the " }
"system tray. To terminate the program, " hide();
"choose <b>Quit</b> in the context menu "
"of the system tray entry."));
msgBox.addButton(QMessageBox::Ok);
//msgBox.addButton(QMessageBox::No);
// msgBox.setDefaultButton(QMessageBox::Yes);
msgBox.setCheckBox(cb);
msgBox.exec();
msgBox.clickedButton();
// if response is yes then loading list
if (cb->isChecked())
{
this->settings.setValue("CloseCheckbox", true);
}
hide();
//event->accept(); //event->accept();
event->ignore(); event->ignore();
} }
} }
// Populate treeview with list of files // Populate treeview with list of files
@ -310,7 +311,13 @@ void MainWindow::populateList(int item)
int port; int port;
int i; int i;
server = ui->khistorycombobox->itemText(item); if (item == -1)
{
server = ui->khistorycombobox->currentText();
}else
{
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))
{ {
@ -484,6 +491,7 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
QString filename; QString filename;
QString fileType; QString fileType;
QString date; QString date;
QString dirName = "";
QProcess * myProcess; QProcess * myProcess;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
bool isDir = false; bool isDir = false;
@ -491,8 +499,8 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
bool readOk = false; bool readOk = false;
bool passwdOk = false; bool passwdOk = false;
int nChild = 0; int nChild = 0;
bool r;
static uint looping; static uint looping;
QStringList dirs;
myProcess = new QProcess(this); myProcess = new QProcess(this);
myProcess->setProcessChannelMode(QProcess::MergedChannels); myProcess->setProcessChannelMode(QProcess::MergedChannels);
@ -538,7 +546,7 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
if (line.contains("auth failed")) if (line.contains("auth failed"))
{ {
myProcess->readAllStandardOutput(); myProcess->readAllStandardOutput();
r = getUserPassword(&this->connexion); getUserPassword(&this->connexion);
if (looping <= 1) if (looping <= 1)
{ {
this->rescan = true; this->rescan = true;
@ -556,7 +564,7 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
return false; return false;
} }
// extracting name, size and if is dir/file // extracting name, size and is dir/file
line = line.simplified(); line = line.simplified();
filename = line.section(" ", 4); filename = line.section(" ", 4);
if (filename != '.') if (filename != '.')
@ -569,8 +577,8 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
{ {
size = sizeA.at(0) + " " + UnitText[0] + " "; size = sizeA.at(0) + " " + UnitText[0] + " ";
}else }else
{ myProcess->setProcessEnvironment(env); {
myProcess->setProcessEnvironment(env);
size = sizeA.at(0) + "," + sizeA.at(1).left(2) + " " + UnitText[sizeA.count()-1] + " "; size = sizeA.at(0) + "," + sizeA.at(1).left(2) + " " + UnitText[sizeA.count()-1] + " ";
} }
@ -581,9 +589,19 @@ bool MainWindow::scanDir(QString server, int portN, QTreeWidgetItem *parent, QSt
{ {
isDir = false; isDir = false;
} }
date = line.section(' ', 2, 2); date = line.section(' ', 2, 2);
fileType = getFileType(filename); fileType = getFileType(filename);
addTreeItem(filename, size, fullsize, fileType, date, isDir, parent); if (!path.isEmpty())
{
if (path.endsWith('/'))
{
path.chop(1);
}
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()) if (passwdOk == false and !this->connexion.password.isEmpty())
{ {
this->settings.setValue("Passwords/" + this->connexion.server + "/" + this->connexion.service + "/" + this->connexion.user, true); this->settings.setValue("Passwords/" + this->connexion.server + "/" + this->connexion.service + "/" + this->connexion.user, true);
@ -710,9 +728,9 @@ void MainWindow::on_connectButton_clicked()
} }
// add parent in treeview // add parent in treeview
void MainWindow::addTreeItem(QString name, QString fileSize, QString fullsize, QString type, QString date, bool isDir=false, QTreeWidgetItem *parent=nullptr) void MainWindow::addTreeItem(QString name, QString fileSize, QString fullsize, QString type, QString date, bool isDir=false, QString dirName="", QTreeWidgetItem *parent=nullptr)
{ {
QFont * font = new QFont(); QFont font;
QTreeWidgetItem *treeItem; QTreeWidgetItem *treeItem;
if (parent != nullptr) if (parent != nullptr)
@ -722,6 +740,20 @@ void MainWindow::addTreeItem(QString name, QString fileSize, QString fullsize, Q
{ {
treeItem = new QTreeWidgetItem(ui->treeWidget); 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
@ -729,23 +761,8 @@ void MainWindow::addTreeItem(QString name, QString fileSize, QString fullsize, Q
treeItem->setIcon(0, QIcon::fromTheme("folder")); treeItem->setIcon(0, QIcon::fromTheme("folder"));
}else }else
{ {
// item is a file this->settings.beginGroup("Downloaded/");
if (QFile::exists(this->downloading.savePath + "/" + name)) this->settings.endGroup();
{
QBrush b (Qt::green);
treeItem->setForeground(0, b);
treeItem->setFont(0, *font);
}else
{
this->settings.beginGroup("Downloaded/");
if (this->settings.contains(name))
{
QBrush b (Qt::red);
treeItem->setForeground(0, b);
treeItem->setFont(0, *font);
}
this->settings.endGroup();
}
treeItem->setText(1,type); treeItem->setText(1,type);
} }
treeItem->setText(0, name); treeItem->setText(0, name);
@ -870,6 +887,12 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
QMessageBox::StandardButton reply; QMessageBox::StandardButton reply;
int sizeFromRsync; int sizeFromRsync;
if (treeviewClicked == true)
{
return;
}
treeviewClicked = true;
itemR = item; itemR = item;
this->rescan = true; this->rescan = true;
@ -894,7 +917,7 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
// 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"; cout << "no directory selectioned, ignoring download request" << endl;
return; return;
} }
}else }else
@ -973,11 +996,14 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
}else }else
{ {
//Item is a Directory //Item is a Directory
while (this->rescan) if (item->isExpanded() == false)
{ {
scanDir(this->connexion.server, this->connexion.port, item, this->connexion.service + "/" + path +"/"); while (this->rescan)
item->setExpanded(true); {
scanDir(this->connexion.server, this->connexion.port, item, this->connexion.service + "/" + path +"/");
item->setExpanded(true);
}
} }
} }
@ -985,6 +1011,7 @@ void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, bool downloadD
{ {
saveDownloadList(); saveDownloadList();
} }
treeviewClicked = false;
} }
// Launch the thread which download the file // Launch the thread which download the file
@ -1401,3 +1428,10 @@ void MainWindow::on_actionHiddenService_triggered()
preparePopulateTree(); preparePopulateTree();
} }
} }
void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
cout << "double-clicked" << endl;
}

View File

@ -119,16 +119,19 @@ class MainWindow : public QMainWindow
QString icon = "/usr/share/icons/RsyncUI.png"; QString icon = "/usr/share/icons/RsyncUI.png";
bool rescan = false; bool rescan = false;
bool stopDlAsked; bool stopDlAsked;
bool treeviewClicked;
QList<QString> UnitText { QList<QString> UnitText
{
tr("B"), tr("B"),
tr("KB"), tr("KB"),
tr("MB"), tr("MB"),
tr("GB"), tr("GB"),
tr("TB"), tr("TB"),
tr("PB") tr("PB")
}; };
QList<QChar> bwUnitChar{ QList<QChar> bwUnitChar
{
'K', 'K',
'M', 'M',
'T', 'T',
@ -152,7 +155,7 @@ class MainWindow : public QMainWindow
void listServices(); void listServices();
bool validateServer(QString server); bool validateServer(QString server);
bool isIpAddress(QString server); bool isIpAddress(QString server);
void addTreeItem(QString name, QString fileSize, QString fullsize, QString type, QString date, bool isDir, QTreeWidgetItem *parent); void addTreeItem(QString name, QString fileSize, QString fullsize, QString type, QString date, bool isDir, QString dirName, QTreeWidgetItem *parent);
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();
@ -199,8 +202,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();
@ -217,6 +218,8 @@ class MainWindow : public QMainWindow
void on_actionHiddenService_triggered(); void on_actionHiddenService_triggered();
void on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
signals: signals:
void stopDownloading(QProcess *); void stopDownloading(QProcess *);
void progressSignal(int); void progressSignal(int);

View File

@ -10,26 +10,4 @@ extern QApplication a;
void setPassword(QString account, QString pass); void setPassword(QString account, QString pass);
QString getPassword(const QString& name); QString getPassword(const QString& name);
/*class Password : QObject
{
public:
QString appName;
QKeychain::WritePasswordJob * passwdJob;
QKeychain::ReadPasswordJob * readPass;
MainWindow * mw;
QString password;
QSettings passwdSettings{a.applicationName(),a.applicationName()};
Password();
~Password();
void store(QString, QString);
QString read(QString);
bool remove(QString);
private slots:
void storeFinished();
void readFinished();
};*/
#endif // PASSWORD_H #endif // PASSWORD_H

View File

@ -8,42 +8,6 @@ using namespace std;
extern QMap<int, QString> rsyncErrorStrings; extern QMap<int, QString> rsyncErrorStrings;
extern QApplication a; 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 // return true in case of error
bool testRsyncReturn(MainWindow * w, QProcess * myProcess) bool testRsyncReturn(MainWindow * w, QProcess * myProcess)

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>
@ -14,8 +13,6 @@
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);

View File

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