diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui.cpp | 21 | ||||
-rw-r--r-- | src/gui.h | 3 | ||||
-rw-r--r-- | src/main.cpp | 26 |
3 files changed, 41 insertions, 9 deletions
diff --git a/src/gui.cpp b/src/gui.cpp index 02925ad..67f961c 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -13,6 +13,8 @@ #include <QJsonArray> #include <QCloseEvent> +#include <signal.h> + static QString STATE_COPYING("COPYING"); // Still busy copying original file, new chunks are only accepted in already copied range static QString STATE_WAITING_FOR_UPLOAD_DONE("WAITING_FOR_UPLOAD_DONE"); // Copying done, just waiting for new chunks until client signals that it's done static QString STATE_WAITING_FOR_COPYING_DONE("WAITING_FOR_COPYING_DONE"); // Copying not done, but dnbd3-fuse already told us it's done, wait for copying @@ -21,16 +23,17 @@ static QString STATE_PROCESSING("PROCESSING"); // Hashing, renaming, creating DB static QString STATE_ERROR("ERROR"); static QString STATE_COMPLETELY_DONE("COMPLETELY_DONE"); -Gui::Gui(const char *urlbase, const char *uuid, QWidget *parent) +Gui::Gui(const QString &urlbase, const QString &uuid, int dnbd3pid, QWidget *parent) : QDialog(parent) , _nam(new QNetworkAccessManager(this)) - , _urlStatus(QString(urlbase).append("status/").append(uuid)) - , _urlAbort(QString(urlbase).append("abort/").append(uuid)) - , _urlFinish(QString(urlbase).append("finish/").append(uuid)) + , _urlStatus(urlbase + QLatin1String("status/") + uuid) + , _urlAbort(urlbase + QLatin1String("abort/") + uuid) + , _urlFinish(urlbase + QLatin1String("finish/") + uuid) , _denyInteraction(false) , _allowClose(false) , _tmrStatus(new QTimer(this)) , _status(nullptr) + , _dnbd3pid(dnbd3pid) { _nam->setAutoDeleteReplies(true); _nam->setTransferTimeout(5000); @@ -162,14 +165,18 @@ void Gui::pushedCancel(bool) } if (_denyInteraction) return; + if (_remoteState == STATE_COMPLETELY_DONE) { + _btnAbort->setEnabled(false); + return; + } if (_remoteState != STATE_ERROR) { int ret = QMessageBox::question(this, tr("Bestätigung"), tr("Wollen Sie diesen Bearbeitungsvorgang wirklich abbrechen?")); if (ret == QMessageBox::No) return; } - if (_remoteState == STATE_COMPLETELY_DONE) { - _btnAbort->setEnabled(false); - return; + if (_dnbd3pid != 0 && _dnbd3pid != -1) { + // SIGQUIT tells dnbd3-fuse to stop uploading + ::kill(_dnbd3pid, SIGQUIT); } _denyInteraction = true; QNetworkReply *reply = _nam->post(QNetworkRequest(_urlAbort), QByteArray()); @@ -16,7 +16,7 @@ class Gui : public QDialog { Q_OBJECT public: - explicit Gui(const char *urlbase, const char *uuid, QWidget *parent = nullptr); + explicit Gui(const QString &urlbase, const QString &uuid, int dnbd3pid, QWidget *parent = nullptr); ~Gui(); protected: @@ -40,6 +40,7 @@ private: QTimer *_tmrStatus; QHash<QString, Progress*> _items; QLabel *_status; + int _dnbd3pid; }; #endif diff --git a/src/main.cpp b/src/main.cpp index 310d2a3..51c9899 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,35 @@ #include "gui.h" #include <QApplication> +#include <QCommandLineOption> +#include <QCommandLineParser> int main(int argc, char **argv) { QApplication app(argc, argv); - Gui window("http://10.4.9.57/cow/", "uuuuuuid"); + QCommandLineParser parser; + parser.setApplicationDescription(QObject::tr("CoW-GUI for dnbd3-fuse sessions")); + parser.addHelpOption(); + QCommandLineOption sessionOption(QStringList() << QLatin1String("session") << QLatin1String("s"), + QObject::tr("Session ID to use when talking to server"), + QLatin1String("sessionid")); + QCommandLineOption urlOption(QStringList() << QLatin1String("url") << QLatin1String("u"), + QObject::tr("URL base of server to talk to"), + QLatin1String("url")); + QCommandLineOption pidOption(QStringList() << QLatin1String("pid") << QLatin1String("p"), + QObject::tr("PID of dnbd3-fuse, so we can cancel the upload via SIGQUIT on abort"), + QLatin1String("pid")); + parser.addOption(sessionOption); + parser.addOption(urlOption); + parser.addOption(pidOption); + parser.process(app); + + if (!parser.isSet(sessionOption) || !parser.isSet(urlOption) || !parser.isSet(pidOption)) { + parser.showHelp(); + return 1; + } + + Gui window(parser.value(urlOption), parser.value(sessionOption), parser.value(pidOption).toInt()); window.show(); return QGuiApplication::exec(); |