rsyncui/downloadfile.cpp

88 lines
2.0 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "downloadfile.h"
#include "tools.h"
#include <pstreams/pstream.h>
#include <sstream>
#include <string>
#include <cstring>
#include <iostream>
#include <stdio.h>
#include <QMessageBox>
#include <vector>
#include <boost/algorithm/string/replace.hpp>
#include <memory>
#include <stdexcept>
#include <array>
#include <unistd.h>
#include <sys/types.h>
using namespace std;
downloadFile::downloadFile()
{
}
void downloadFile::cancelled(int pid)
{
if (kill(pid, SIGTERM) == -1)
{
//TODO gestion erreur kill
}
}
void downloadFile::download(MainWindow *mw)
{
string line;
string errorRsync;
int pos;
array<string, 7> argv;
stringstream output;
vector<string> v;
int value;
char buffer[4096];
argv[0] = "/usr/bin/rsync";
argv[1] = "--bwlimit=" + mw->connexion.bandwidthLimit;
argv[2] = "--port=" + to_string(mw->connexion.port);
argv[3] = "-P";
argv[4] = mw->connexion.server + "::" + mw->downloading.service + "/" + mw->downloading.path;
argv[5] = mw->downloading.savePath + "/";
//unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd "r"), pclose);
FILE * fp = popen2(argv, "r", mw->downloading.pid);
if (!fp)
{
throw runtime_error("popen2() failed!");
return;
}
while (fgets(buffer, 4096, fp) != nullptr)
{
if (this->canceled == true)
{
return;
}
line = buffer;
//cout << line << endl;
pos = line.find('%');
if (pos != -1)
{
line.erase(pos);
pos = line.find_last_of(' ');
if (pos != -1)
{
line.erase(0, pos);
value = stoi(line);
//cout << value << endl;
emit progressSignal(value);
}
}
}
pclose2(fp, mw->downloading.pid);
emit progressSignal(100);
emit finishedSignal(true);
//cout << path << endl;
}