summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Keller <rainer.keller@theqtcompany.com>2015-06-03 09:39:13 +0200
committerRainer Keller <rainer.keller@theqtcompany.com>2015-06-08 17:05:10 +0300
commit2631768b484176836694ec4afdb81ef31886c142 (patch)
tree4862e2dbb3ea171fbe64475cf012587d00524034
parent866aa6f727c096feada0f1d39cce44ca660ad787 (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.cpp18
-rw-r--r--process.cpp50
-rw-r--r--process.h5
3 files changed, 53 insertions, 20 deletions
diff --git a/main.cpp b/main.cpp
index 06bf501..08be98c 100644
--- a/main.cpp
+++ b/main.cpp
@@ -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();
}
diff --git a/process.h b/process.h
index d175dd3..105d051 100644
--- a/process.h
+++ b/process.h
@@ -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