#include "mainwindow.h" #include "ui_mainwindow.h" #include "downloadfile.h" #include "tools.h" #include #include #include #include #include #include #include #include //#include #include #include #include #include #include using namespace std; // Initialization de la class downloadFile::downloadFile() { } //Slot activated when download is cancelled void MainWindow::cancelled(QProcess * process) { bool n = 0; process->terminate(); n = process->waitForFinished(30000); if (n == false) { process->close(); } } // launch a rsync processus downloading a file void MainWindow::download() { QString cmd; QStringList param; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QString server = downloading.server; this->downloading.process = new QProcess(this); if (!this->downloading.user.isEmpty()) { this->downloading.user = this->connexion.user; server = this->connexion.user + "@" + this->downloading.server; env.insert("RSYNC_PASSWORD", this->downloading.password); // Add an environment variable this->downloading.process->setProcessEnvironment(env); } // Populating array with command and parameters for rsync cmd = "rsync"; if (this->connexion.bandwidthLimit != 0) { param << "--bwlimit=" + QString::number(this->connexion.bandwidthLimit) + bwUnitChar[this->connexion.bandwidthLimitUnit]; } if (downloading.ipversion == 4 || downloading.ipversion == 6) { param << "-" + QString::number(downloading.ipversion); } param << "--port" << QString::number(this->downloading.port); param << "-aXP "; param << server + "::" + this->downloading.service + "/" + this->downloading.path << this->downloading.savePath + "/"; qInfo("%s %s", cmd.toStdString().c_str(), param.join(" ").toStdString().c_str() ); 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(errorOccurred(QProcess::ProcessError error)), this, SLOT(downloadProcessError(QProcess::ProcessError error))); //connect(this->downloading.process, SIGNAL(readyReadStandardError()), this, SLOT(downloadProcessStderr())); connect(this->downloading.process, SIGNAL(readyReadStandardOutput()), this, SLOT(readRsyncOutput())); } void MainWindow::readRsyncOutput() { QString line; bool flag = false; int value; int pos; static QString dlSpeed; QStringList list; static QString filename; int i; int listSize; while(!flag) { list.clear(); line = QString::fromUtf8(this->downloading.process->readLine()); if (line.isEmpty()) { flag = true; break; }else { pos = line.indexOf("%"); if (pos != -1) { line = line.simplified(); list = line.split(" "); listSize = list.count() / 4; for (i = 0; i < listSize; i++) { value = list.at(i *4 + 1).chopped(1).toInt(); dlSpeed = list.at(i * 4 + 2); /*line.resize(pos); pos = line.lastIndexOf(' '); if (pos != -1) { line.remove(0, pos); value = line.toInt();*/ // sending progress to Main window emit progressSignal(value); emit fileName(filename + " %p%" + "\t " + dlSpeed); } }else { if (!line.contains("receiving")) { filename = line.remove(QChar('\n'), Qt::CaseInsensitive); emit fileName(filename + " %p%\t " + dlSpeed); } } } } }