1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
#ifndef CLI_APPLICATION_H
#define CLI_APPLICATION_H
#include "./args.h"
#include <syncthingconnector/syncthingconnection.h>
#include <syncthingconnector/syncthingconnectionsettings.h>
#include <QObject>
#include <tuple>
namespace Cli {
enum class OperationType { Status, PauseResume, WaitForIdle };
struct RelevantDir {
explicit RelevantDir(const Data::SyncthingDir *dir = nullptr, const QString &subDir = QString());
operator bool() const;
void notifyAboutRescan() const;
const Data::SyncthingDir *dirObj;
QString subDir;
};
inline RelevantDir::RelevantDir(const Data::SyncthingDir *dir, const QString &subDir)
: dirObj(dir)
, subDir(subDir)
{
}
inline RelevantDir::operator bool() const
{
return dirObj != nullptr;
}
class Application : public QObject {
Q_OBJECT
public:
explicit Application();
~Application() override;
int exec(int argc, const char *const *argv);
private Q_SLOTS:
void handleStatusChanged(Data::SyncthingStatus newStatus);
void handleResponse();
void handleError(
const QString &message, Data::SyncthingErrorCategory category, int networkError, const QNetworkRequest &request, const QByteArray &response);
void findRelevantDirsAndDevs(OperationType operationType);
bool findPwd();
private:
int loadConfig();
bool waitForConnected();
bool waitForConfig();
bool waitForConfigAndStatus();
void requestLog(const ArgumentOccurrence &);
void requestShutdown(const ArgumentOccurrence &);
void requestRestart(const ArgumentOccurrence &);
void requestRescan(const ArgumentOccurrence &occurrence);
void requestRescanAll(const ArgumentOccurrence &);
void requestPauseResume(bool pause);
void printDir(const RelevantDir &relevantDir) const;
void printDev(const Data::SyncthingDev *dev) const;
void printStatus(const ArgumentOccurrence &);
static void printLog(const std::vector<Data::SyncthingLogEntry> &logEntries);
void printConfig(const ArgumentOccurrence &);
void editConfig(const ArgumentOccurrence &);
QByteArray editConfigViaEditor() const;
QByteArray editConfigViaScript() const;
void waitForIdle(const ArgumentOccurrence &);
bool checkWhetherIdle() const;
void checkPwdOperationPresent(const ArgumentOccurrence &occurrence);
void printPwdStatus(const ArgumentOccurrence &occurrence);
void requestRescanPwd(const ArgumentOccurrence &occurrence);
void requestPausePwd(const ArgumentOccurrence &occurrence);
void requestResumePwd(const ArgumentOccurrence &occurrence);
void initDirCompletion(Argument &arg, const ArgumentOccurrence &);
void initDevCompletion(Argument &arg, const ArgumentOccurrence &);
RelevantDir findDirectory(const QString &dirIdentifier);
Args m_args;
Data::SyncthingConnectionSettings m_settings;
Data::SyncthingConnection m_connection;
size_t m_expectedResponse;
bool m_preventDisconnect;
bool m_callbacksInvoked;
bool m_requiresMainEventLoop;
std::vector<RelevantDir> m_relevantDirs;
std::vector<const Data::SyncthingDev *> m_relevantDevs;
RelevantDir m_pwd;
QByteArray m_dirCompletion;
QByteArray m_devCompletion;
int m_generalTimeout;
int m_idleDuration;
int m_idleTimeout;
bool m_argsRead;
};
} // namespace Cli
#endif // CLI_APPLICATION_H
|