diff options
author | Rainer Keller <rainer.keller@theqtcompany.com> | 2015-06-03 09:39:13 +0200 |
---|---|---|
committer | Rainer Keller <rainer.keller@theqtcompany.com> | 2015-06-08 17:05:10 +0300 |
commit | 2631768b484176836694ec4afdb81ef31886c142 (patch) | |
tree | 4862e2dbb3ea171fbe64475cf012587d00524034 | |
parent | 866aa6f727c096feada0f1d39cce44ca660ad787 (diff) |
Add command to restart current application
Task-number: QTEE-931
Change-Id: I0ad4246750142289cca2a4cbf853211a60538362
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
-rw-r--r-- | main.cpp | 18 | ||||
-rw-r--r-- | process.cpp | 50 | ||||
-rw-r--r-- | process.h | 5 |
3 files changed, 53 insertions, 20 deletions
@@ -62,6 +62,7 @@ static void usage() "--print-debug Print debug messages to stdout on Android\n" "--version Print version information\n" "--detach Start application as usual, then go into background\n" + "--restart Restart the current running application\n" "--help, -h, -help Show this help\n" ); } @@ -158,6 +159,11 @@ static void stop() connectSocket("stop"); } +static void restart() +{ + connectSocket("restart"); +} + static int openServer(QTcpServer *s, Utils::PortList &range) { while (range.hasMore()) { @@ -173,7 +179,7 @@ static int findFirstFreePort(Utils::PortList &range) return openServer(&s, range); } -static bool parseConfigFile(Config *config, const QString &fileName) +bool parseConfigFile(Config *config, const QString &fileName) { QFile f(fileName); @@ -211,7 +217,7 @@ static bool parseConfigFile(Config *config, const QString &fileName) return true; } -static bool parseConfigFileDirectory(Config *config, const QString &dirName) +bool parseConfigFileDirectory(Config *config, const QString &dirName) { QDir d(dirName); if (d.exists()) { @@ -227,7 +233,6 @@ static bool parseConfigFileDirectory(Config *config, const QString &dirName) return true; } - static bool removeDefault() { if (QFile::exists(B2QT_PREFIX)) { @@ -309,10 +314,6 @@ int main(int argc, char **argv) if (!parseConfigFile(&config, "/etc/appcontroller.conf")) fprintf(stderr, "Failed to parse config file.\n"); - // Parse temporary config files - parseConfigFileDirectory(&config, "/var/lib/b2qt/appcontroller.conf.d"); - parseConfigFileDirectory(&config, "/tmp/b2qt/appcontroller.conf.d"); - while (!args.isEmpty()) { const QString arg(args.takeFirst()); @@ -371,6 +372,9 @@ int main(int argc, char **argv) return 0; } else if (arg == "--detach") { detach = true; + } else if (arg == "--restart") { + restart(); + return 0; } else if (arg == "--help" || arg == "-help" || arg == "-h") { usage(); return 0; diff --git a/process.cpp b/process.cpp index ce699c0..64bbc13 100644 --- a/process.cpp +++ b/process.cpp @@ -30,6 +30,7 @@ #include <QTcpSocket> #include <errno.h> +bool parseConfigFileDirectory(Config *config, const QString &dirName); static int pipefd[2]; static void signalhandler(int) @@ -90,13 +91,13 @@ Process::Process() , mDebuggee(0) , mDebug(false) , mStdoutFd(1) + , mBeingRestarted(false) { mProcess->setProcessChannelMode(QProcess::SeparateChannels); connect(mProcess, &QProcess::readyReadStandardError, this, &Process::readyReadStandardError); connect(mProcess, &QProcess::readyReadStandardOutput, this, &Process::readyReadStandardOutput); connect(mProcess, (void (QProcess::*)(int, QProcess::ExitStatus))&QProcess::finished, this, &Process::finished); connect(mProcess, (void (QProcess::*)(QProcess::ProcessError))&QProcess::error, this, &Process::error); - connect(mProcess, (void (QProcess::*)(int, QProcess::ExitStatus))&QProcess::finished, qApp, &QCoreApplication::quit); if (pipe2(pipefd, O_CLOEXEC) != 0) qWarning("Could not create pipe"); @@ -195,7 +196,8 @@ void Process::error(QProcess::ProcessError error) printf("Unknown error\n"); break; } - qApp->quit(); + if (!mBeingRestarted) + qApp->quit(); } void Process::finished(int exitCode, QProcess::ExitStatus exitStatus) @@ -204,28 +206,41 @@ void Process::finished(int exitCode, QProcess::ExitStatus exitStatus) printf("Process exited with exit code %d\n", exitCode); else printf("Process stopped\n"); + if (!mBeingRestarted) { + qDebug() << "quit"; + qApp->quit(); + } } -void Process::startup(QStringList args) +void Process::startup() { #ifdef Q_OS_ANDROID QProcessEnvironment pe = interactiveProcessEnvironment(); #else QProcessEnvironment pe = QProcessEnvironment::systemEnvironment(); #endif + QStringList args = mStartupArguments; + mBeingRestarted = false; + + Config actualConfig = mConfig; + + // Parse temporary config files + // This needs to be done on every startup because those files are expected to change. + parseConfigFileDirectory(&actualConfig, "/var/lib/b2qt/appcontroller.conf.d"); + parseConfigFileDirectory(&actualConfig, "/tmp/b2qt/appcontroller.conf.d"); - foreach (const QString &key, mConfig.env.keys()) { + foreach (const QString &key, actualConfig.env.keys()) { if (!pe.contains(key)) { - qDebug() << key << mConfig.env.value(key); - pe.insert(key, mConfig.env.value(key)); + qDebug() << key << actualConfig.env.value(key); + pe.insert(key, actualConfig.env.value(key)); } } - if (!mConfig.base.isEmpty()) - pe.insert(QLatin1String("B2QT_BASE"), mConfig.base); - if (!mConfig.platform.isEmpty()) - pe.insert(QLatin1String("B2QT_PLATFORM"), mConfig.platform); + if (!actualConfig.base.isEmpty()) + pe.insert(QLatin1String("B2QT_BASE"), actualConfig.base); + if (!actualConfig.platform.isEmpty()) + pe.insert(QLatin1String("B2QT_PLATFORM"), actualConfig.platform); - args.append(mConfig.args); + args.append(actualConfig.args); mProcess->setProcessEnvironment(pe); mBinary = args.first(); @@ -236,7 +251,8 @@ void Process::startup(QStringList args) void Process::start(const QStringList &args) { - startup(args); + mStartupArguments = args; + startup(); } void Process::stop() @@ -260,6 +276,14 @@ void Process::stop() mProcess->kill(); } +void Process::restart() +{ + printf("Restarting application\n"); + mBeingRestarted = true; + stop(); + startup(); +} + void Process::incomingConnection(int i) { int fd = accept(i, NULL, NULL); @@ -287,6 +311,8 @@ void Process::incomingConnection(int i) if (command == "stop") stop(); + else if (command == "restart") + restart(); else stop(); } @@ -60,6 +60,7 @@ public: void setStdoutFd(qintptr stdoutFd); public slots: void stop(); + void restart(); private slots: void readyReadStandardError(); void readyReadStandardOutput(); @@ -68,7 +69,7 @@ private slots: void incomingConnection(int); private: void forwardProcessOutput(qintptr fd, const QByteArray &data); - void startup(QStringList); + void startup(); QProcessEnvironment interactiveProcessEnvironment() const; QProcess *mProcess; int mDebuggee; @@ -76,6 +77,8 @@ private: Config mConfig; QString mBinary; qintptr mStdoutFd; + QStringList mStartupArguments; + bool mBeingRestarted; }; #endif // PROCESS_H |