#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 #include #include #include using namespace std; bool display = false; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); ui->ktreewidgetsearchline->setTreeWidget(ui->treeWidget); ui->ktreewidgetsearchline->setCaseSensitivity(Qt::CaseInsensitive); ui->treeWidget->setHeaderLabels({tr("Path"), tr("Size")} ); ui->progressBar->hide(); populateList(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::populateTree() { string server; string port; int portN; stringstream ss; vector path; server.assign(ui->khistorycombobox->currentText().toStdString()); port.assign(ui->portEdit->text().toStdString()); ss << port; ss >> portN; if (!server.empty() and !port.empty() and portN < 65536) { if (validateServer(server)) { ui->treeWidget->cursor().setShape(Qt::WaitCursor); path = explode(ui->listWidget->currentItem()->text().toStdString(), '\n', 2); scanDir(server, portN, NULL, path[0].append("/") ); ui->treeWidget->cursor().setShape(Qt::ArrowCursor); } } } void MainWindow::populateList() { string server; string port; int portN; stringstream ss; server.assign(ui->khistorycombobox->currentText().toStdString()); port.assign(ui->portEdit->text().toStdString()); ss << port; ss >> portN; if (!server.empty() and !port.empty() and portN < 65536) { if (validateServer(server)) { ui->centralwidget->cursor().setShape(Qt::WaitCursor); listServices(server, portN); ui->centralwidget->cursor().setShape(Qt::ArrowCursor); } } } void MainWindow::listServices(string server, int portN) { char cmd[4096]; string line; string errorRsync; vector v; char service[4096]; sprintf(cmd, "rsync --contimeout=10 -P \"%s::\" --port %d ", server.c_str(), portN ); redi::ipstream in(cmd, redi::pstreams::pstdout | redi::pstreams::pstderr); while (getline(in.out(), line)) { cout << "stdout: " << line << endl; boost::replace_all(line," ",""); boost::replace_all(line, "\t", " - "); v = explode(line, ' ', 3 ); sprintf(service, "%s\n\t%s", v[0].c_str(), v[2].c_str()); ui->listWidget->addItem(service); } } void MainWindow::scanDir(string server, int portN, QTreeWidgetItem *parent, string path) { char cmd[4096]; string line; string errorRsync; vector v; QTreeWidgetItem * item; char npath[4096]; sprintf(cmd, "rsync --contimeout=10 -P \"%s::%s\" --port %d ", server.c_str(), path.c_str(), portN ); redi::ipstream in(cmd, redi::pstreams::pstdout | redi::pstreams::pstderr); while (getline(in.out(), line)) { v = explode(line, ' ', 5); if (v.size() == 5) { if (v[4].at(0) != '.' and (v[0].at(0) == '-' or v[0].at(0) == 'd')) { if (parent != NULL) { item = addTreeChild(parent,QString::fromStdString(v[4]), QString::fromStdString(v[1])); }else { item = addTreeRoot(QString::fromStdString(v[4]), QString::fromStdString(v[1])); } if (v[0].at(0) == 'd') { sprintf(npath, "%s%s/", path.c_str(), v[4].c_str()); scanDir(server, portN, item, npath); } } } } // if reading stdout stopped at EOF then reset the state: if (in.eof() && in.fail()) in.clear(); // read child's stderr while (getline(in.err(), line)) { cout << "stderr: " << line << endl; errorRsync.append(line); errorRsync.append("\n"); } if ( !errorRsync.empty()) { QMessageBox::warning( this, "RsyncUI", errorRsync.c_str()); } } bool MainWindow::isIpAddress(string server) { bool returnCode = false; vector r; stringstream ss; int elementN; r = explode(server, '.'); if (r.size() == 4) { for (auto element : r) { ss << element; ss >> elementN; if (elementN >0 and elementN < 256) { returnCode &= true; } } } return returnCode; } bool MainWindow::validateServer(string server) { char cmd[512]; string line; string errorDig; bool flag = false; sprintf(cmd, "dig %s", server.c_str()); redi::ipstream in(cmd, redi::pstreams::pstdout | redi::pstreams::pstderr); while (getline(in.out(), line)) { cout << "stdout: " << line << '\n'; if (line.find(";; ANSWER SECTION:") != string::npos) { flag = true; } } // if reading stdout stopped at EOF then reset the state: if (in.eof() && in.fail()) in.clear(); // read child's stderr while (std::getline(in.err(), line)) { cout << "stderr: " << line << '\n'; errorDig.append(line); errorDig.append("\n"); } if ( !errorDig.empty()) { QMessageBox::warning( this, "RsyncUI", errorDig.c_str() ); } if ( flag == false) { flag = isIpAddress(server); QMessageBox::warning( this, "RsyncUI", tr("server does not exists" ) ); } return flag; } void MainWindow::displayTree() { populateTree(); } void MainWindow::on_khistorycombobox_returnPressed() { populateList(); } /*void MainWindow::on_portEdit_userTextChanged() { populateTree(); }*/ void MainWindow::on_portEdit_returnPressed() { populateList(); } void MainWindow::on_khistorycombobox_textActivated() { populateList(); } void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column) { } void MainWindow::on_treeWidget_customContextMenuRequested() { } void MainWindow::on_actionDownload_triggered() { } QTreeWidgetItem * MainWindow::addTreeRoot(QString name, QString fileSize) { // QTreeWidgetItem(QTreeWidget * parent, int type = Type) QTreeWidgetItem *treeItem = new QTreeWidgetItem(ui->treeWidget); // QTreeWidgetItem::setText(int column, const QString & text) treeItem->setText(0, name); treeItem->setText(1, fileSize); return treeItem; } QTreeWidgetItem * MainWindow::addTreeChild(QTreeWidgetItem *parent, QString name, QString fileSize) { // QTreeWidgetItem(QTreeWidget * parent, int type = Type) QTreeWidgetItem *treeItem = new QTreeWidgetItem(); // QTreeWidgetItem::setText(int column, const QString & text) treeItem->setText(0, name); treeItem->setText(1, fileSize); // QTreeWidgetItem::addChild(QTreeWidgetItem * child) parent->addChild(treeItem); return treeItem; } void MainWindow::on_listWidget_clicked(const QModelIndex &index) { populateTree(); } void MainWindow::on_listDownload_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { cout << current->text().toStdString() << endl; } void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column) { string path; QFuture future; QFutureWatcher watcher; QString savePath; QFileDialog dialog; QString dirPath; /*int p[2]; if (pipe(p) < 0) { return; }*/ dirPath = getenv("HOME"); dirPath.append("/Vidéos/"); savePath = dialog.getExistingDirectory(this, tr("Choose directory to save file"), dirPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); downloadFile downloadO; //QProgressDialog progress("Downloading file ...", "Abort Download", 0, 100, this); ui->progressBar->setWindowModality(Qt::WindowModal); ui->progressBar->setValue(0); ui->progressBar->show(); connect(&watcher, &QFutureWatcherBase::finished, ui->progressBar, &QProgressBar::hide); connect(&downloadO, &downloadFile::progressSignal, ui->progressBar, &QProgressBar::setValue); future = QtConcurrent::run(&this->MyObject, &downloadFile::download, savePath, this); watcher.setFuture(future); }