Skip to content

Commit 2631768

Browse files
author
Rainer Keller
committed
Add command to restart current application
Task-number: QTEE-931 Change-Id: I0ad4246750142289cca2a4cbf853211a60538362 Reviewed-by: Laszlo Agocs <[email protected]>
1 parent 866aa6f commit 2631768

File tree

3 files changed

+53
-20
lines changed

3 files changed

+53
-20
lines changed

main.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ static void usage()
6262
"--print-debug Print debug messages to stdout on Android\n"
6363
"--version Print version information\n"
6464
"--detach Start application as usual, then go into background\n"
65+
"--restart Restart the current running application\n"
6566
"--help, -h, -help Show this help\n"
6667
);
6768
}
@@ -158,6 +159,11 @@ static void stop()
158159
connectSocket("stop");
159160
}
160161

162+
static void restart()
163+
{
164+
connectSocket("restart");
165+
}
166+
161167
static int openServer(QTcpServer *s, Utils::PortList &range)
162168
{
163169
while (range.hasMore()) {
@@ -173,7 +179,7 @@ static int findFirstFreePort(Utils::PortList &range)
173179
return openServer(&s, range);
174180
}
175181

176-
static bool parseConfigFile(Config *config, const QString &fileName)
182+
bool parseConfigFile(Config *config, const QString &fileName)
177183
{
178184
QFile f(fileName);
179185

@@ -211,7 +217,7 @@ static bool parseConfigFile(Config *config, const QString &fileName)
211217
return true;
212218
}
213219

214-
static bool parseConfigFileDirectory(Config *config, const QString &dirName)
220+
bool parseConfigFileDirectory(Config *config, const QString &dirName)
215221
{
216222
QDir d(dirName);
217223
if (d.exists()) {
@@ -227,7 +233,6 @@ static bool parseConfigFileDirectory(Config *config, const QString &dirName)
227233
return true;
228234
}
229235

230-
231236
static bool removeDefault()
232237
{
233238
if (QFile::exists(B2QT_PREFIX)) {
@@ -309,10 +314,6 @@ int main(int argc, char **argv)
309314
if (!parseConfigFile(&config, "/etc/appcontroller.conf"))
310315
fprintf(stderr, "Failed to parse config file.\n");
311316

312-
// Parse temporary config files
313-
parseConfigFileDirectory(&config, "/var/lib/b2qt/appcontroller.conf.d");
314-
parseConfigFileDirectory(&config, "/tmp/b2qt/appcontroller.conf.d");
315-
316317
while (!args.isEmpty()) {
317318
const QString arg(args.takeFirst());
318319

@@ -371,6 +372,9 @@ int main(int argc, char **argv)
371372
return 0;
372373
} else if (arg == "--detach") {
373374
detach = true;
375+
} else if (arg == "--restart") {
376+
restart();
377+
return 0;
374378
} else if (arg == "--help" || arg == "-help" || arg == "-h") {
375379
usage();
376380
return 0;

process.cpp

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <QTcpSocket>
3131
#include <errno.h>
3232

33+
bool parseConfigFileDirectory(Config *config, const QString &dirName);
3334
static int pipefd[2];
3435

3536
static void signalhandler(int)
@@ -90,13 +91,13 @@ Process::Process()
9091
, mDebuggee(0)
9192
, mDebug(false)
9293
, mStdoutFd(1)
94+
, mBeingRestarted(false)
9395
{
9496
mProcess->setProcessChannelMode(QProcess::SeparateChannels);
9597
connect(mProcess, &QProcess::readyReadStandardError, this, &Process::readyReadStandardError);
9698
connect(mProcess, &QProcess::readyReadStandardOutput, this, &Process::readyReadStandardOutput);
9799
connect(mProcess, (void (QProcess::*)(int, QProcess::ExitStatus))&QProcess::finished, this, &Process::finished);
98100
connect(mProcess, (void (QProcess::*)(QProcess::ProcessError))&QProcess::error, this, &Process::error);
99-
connect(mProcess, (void (QProcess::*)(int, QProcess::ExitStatus))&QProcess::finished, qApp, &QCoreApplication::quit);
100101

101102
if (pipe2(pipefd, O_CLOEXEC) != 0)
102103
qWarning("Could not create pipe");
@@ -195,7 +196,8 @@ void Process::error(QProcess::ProcessError error)
195196
printf("Unknown error\n");
196197
break;
197198
}
198-
qApp->quit();
199+
if (!mBeingRestarted)
200+
qApp->quit();
199201
}
200202

201203
void Process::finished(int exitCode, QProcess::ExitStatus exitStatus)
@@ -204,28 +206,41 @@ void Process::finished(int exitCode, QProcess::ExitStatus exitStatus)
204206
printf("Process exited with exit code %d\n", exitCode);
205207
else
206208
printf("Process stopped\n");
209+
if (!mBeingRestarted) {
210+
qDebug() << "quit";
211+
qApp->quit();
212+
}
207213
}
208214

209-
void Process::startup(QStringList args)
215+
void Process::startup()
210216
{
211217
#ifdef Q_OS_ANDROID
212218
QProcessEnvironment pe = interactiveProcessEnvironment();
213219
#else
214220
QProcessEnvironment pe = QProcessEnvironment::systemEnvironment();
215221
#endif
222+
QStringList args = mStartupArguments;
223+
mBeingRestarted = false;
224+
225+
Config actualConfig = mConfig;
226+
227+
// Parse temporary config files
228+
// This needs to be done on every startup because those files are expected to change.
229+
parseConfigFileDirectory(&actualConfig, "/var/lib/b2qt/appcontroller.conf.d");
230+
parseConfigFileDirectory(&actualConfig, "/tmp/b2qt/appcontroller.conf.d");
216231

217-
foreach (const QString &key, mConfig.env.keys()) {
232+
foreach (const QString &key, actualConfig.env.keys()) {
218233
if (!pe.contains(key)) {
219-
qDebug() << key << mConfig.env.value(key);
220-
pe.insert(key, mConfig.env.value(key));
234+
qDebug() << key << actualConfig.env.value(key);
235+
pe.insert(key, actualConfig.env.value(key));
221236
}
222237
}
223-
if (!mConfig.base.isEmpty())
224-
pe.insert(QLatin1String("B2QT_BASE"), mConfig.base);
225-
if (!mConfig.platform.isEmpty())
226-
pe.insert(QLatin1String("B2QT_PLATFORM"), mConfig.platform);
238+
if (!actualConfig.base.isEmpty())
239+
pe.insert(QLatin1String("B2QT_BASE"), actualConfig.base);
240+
if (!actualConfig.platform.isEmpty())
241+
pe.insert(QLatin1String("B2QT_PLATFORM"), actualConfig.platform);
227242

228-
args.append(mConfig.args);
243+
args.append(actualConfig.args);
229244

230245
mProcess->setProcessEnvironment(pe);
231246
mBinary = args.first();
@@ -236,7 +251,8 @@ void Process::startup(QStringList args)
236251

237252
void Process::start(const QStringList &args)
238253
{
239-
startup(args);
254+
mStartupArguments = args;
255+
startup();
240256
}
241257

242258
void Process::stop()
@@ -260,6 +276,14 @@ void Process::stop()
260276
mProcess->kill();
261277
}
262278

279+
void Process::restart()
280+
{
281+
printf("Restarting application\n");
282+
mBeingRestarted = true;
283+
stop();
284+
startup();
285+
}
286+
263287
void Process::incomingConnection(int i)
264288
{
265289
int fd = accept(i, NULL, NULL);
@@ -287,6 +311,8 @@ void Process::incomingConnection(int i)
287311

288312
if (command == "stop")
289313
stop();
314+
else if (command == "restart")
315+
restart();
290316
else
291317
stop();
292318
}

process.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class Process : public QObject
6060
void setStdoutFd(qintptr stdoutFd);
6161
public slots:
6262
void stop();
63+
void restart();
6364
private slots:
6465
void readyReadStandardError();
6566
void readyReadStandardOutput();
@@ -68,14 +69,16 @@ private slots:
6869
void incomingConnection(int);
6970
private:
7071
void forwardProcessOutput(qintptr fd, const QByteArray &data);
71-
void startup(QStringList);
72+
void startup();
7273
QProcessEnvironment interactiveProcessEnvironment() const;
7374
QProcess *mProcess;
7475
int mDebuggee;
7576
bool mDebug;
7677
Config mConfig;
7778
QString mBinary;
7879
qintptr mStdoutFd;
80+
QStringList mStartupArguments;
81+
bool mBeingRestarted;
7982
};
8083

8184
#endif // PROCESS_H

0 commit comments

Comments
 (0)