Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 02e1e63

Browse filesBrowse files
committed
reworked how blocking controls are managed
1 parent c254f90 commit 02e1e63
Copy full SHA for 02e1e63

File tree

Expand file treeCollapse file tree

15 files changed

+96
-72
lines changed
Filter options
Expand file treeCollapse file tree

15 files changed

+96
-72
lines changed

‎examples/service/EchoControl/controlwidget.cpp

Copy file name to clipboardExpand all lines: examples/service/EchoControl/controlwidget.cpp
+5-4Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,16 @@ void ControlWidget::on_loadButton_clicked()
5353
ui->backendComboBox->setEnabled(false);
5454
ui->nameLineEdit->setEnabled(false);
5555

56-
if(_control->supportFlags().testFlag(ServiceControl::SupportsBlockingNonBlocking)) {
56+
if(_control->supportFlags().testFlag(ServiceControl::SupportsSetBlocking)) {
5757
ui->bLockingCheckBox->setEnabled(true);
58-
ui->bLockingCheckBox->setChecked(_control->isBlocking());
59-
} else if(_control->supportFlags().testFlag(ServiceControl::SupportsBlocking))
58+
ui->bLockingCheckBox->setChecked(_control->blocking() == ServiceControl::Blocking);
59+
} else if(_control->blocking() == ServiceControl::Blocking)
6060
ui->bLockingCheckBox->setChecked(true);
61-
else if(_control->supportFlags().testFlag(ServiceControl::SupportsNonBlocking))
61+
else if(_control->blocking() == ServiceControl::NonBlocking)
6262
ui->bLockingCheckBox->setChecked(false);
6363
else
6464
ui->bLockingCheckBox->setCheckState(Qt::PartiallyChecked);
65+
6566
if(_control->supportFlags().testFlag(ServiceControl::SupportsGetAutostart))
6667
ui->enabledCheckBox->setChecked(_control->isAutostartEnabled());
6768
if(_control->supportFlags().testFlag(ServiceControl::SupportsSetAutostart))

‎src/imports/service/plugins.qmltypes

Copy file name to clipboardExpand all lines: src/imports/service/plugins.qmltypes
+14-7Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,15 +186,13 @@ Module {
186186
"SupportsReload": 16,
187187
"SupportsGetAutostart": 32,
188188
"SupportsSetAutostart": 64,
189-
"SupportsBlocking": 128,
190-
"SupportsNonBlocking": 256,
189+
"SupportsSetBlocking": 128,
190+
"SupportsSetEnabled": 256,
191191
"SupportsStatus": 512,
192192
"SupportsCustomCommands": 1024,
193-
"SupportsDisable": 2048,
194193
"SupportsStartStop": 3,
195194
"SupportsPauseResume": 12,
196-
"SupportsAutostart": 96,
197-
"SupportsBlockingNonBlocking": 384
195+
"SupportsAutostart": 96
198196
}
199197
}
200198
Enum {
@@ -212,19 +210,27 @@ Module {
212210
"ServiceErrored": 9
213211
}
214212
}
213+
Enum {
214+
name: "BlockMode"
215+
values: {
216+
"Undetermined": 0,
217+
"Blocking": 1,
218+
"NonBlocking": 2
219+
}
220+
}
215221
Property { name: "backend"; type: "string"; isReadonly: true }
216222
Property { name: "serviceId"; type: "string"; isReadonly: true }
217223
Property {
218224
name: "supportFlags"
219225
type: "QtService::ServiceControl::SupportFlags"
220226
isReadonly: true
221227
}
222-
Property { name: "blocking"; type: "bool" }
228+
Property { name: "blocking"; type: "BlockMode"; isReadonly: true }
223229
Property { name: "error"; type: "string"; isReadonly: true }
224230
Property { name: "enabled"; type: "bool" }
225231
Signal {
226232
name: "blockingChanged"
227-
Parameter { name: "blocking"; type: "bool" }
233+
Parameter { name: "blocking"; type: "BlockMode" }
228234
}
229235
Signal {
230236
name: "errorChanged"
@@ -240,6 +246,7 @@ Module {
240246
Method { name: "disableAutostart"; type: "bool" }
241247
Method {
242248
name: "setBlocking"
249+
type: "bool"
243250
Parameter { name: "blocking"; type: "bool" }
244251
}
245252
Method { name: "clearError" }

‎src/plugins/servicebackends/android/androidservicecontrol.cpp

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/android/androidservicecontrol.cpp
+6-2Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ ServiceControl::SupportFlags AndroidServiceControl::supportFlags() const
1717
{
1818
return SupportsStartStop |
1919
SupportsCustomCommands |
20-
SupportsNonBlocking |
21-
SupportsDisable;
20+
SupportsSetEnabled;
2221
}
2322

2423
bool AndroidServiceControl::serviceExists() const
@@ -105,6 +104,11 @@ QVariant AndroidServiceControl::callGenericCommand(const QByteArray &kind, const
105104
return ServiceControl::callGenericCommand(kind, args);
106105
}
107106

107+
ServiceControl::BlockMode AndroidServiceControl::blocking() const
108+
{
109+
return NonBlocking;
110+
}
111+
108112
bool AndroidServiceControl::start()
109113
{
110114
if(!serviceExists())

‎src/plugins/servicebackends/android/androidservicecontrol.h

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/android/androidservicecontrol.h
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class AndroidServiceControl : public QtService::ServiceControl
2020
bool serviceExists() const override;
2121
bool isEnabled() const override;
2222
QVariant callGenericCommand(const QByteArray &kind, const QVariantList &args) override;
23+
BlockMode blocking() const override;
2324

2425
public Q_SLOTS:
2526
bool start() override;

‎src/plugins/servicebackends/launchd/launchdservicecontrol.cpp

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/launchd/launchdservicecontrol.cpp
+1-2Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ ServiceControl::SupportFlags LaunchdServiceControl::supportFlags() const
2222
{
2323
return SupportsStartStop |
2424
SupportsCustomCommands |
25-
SupportsNonBlocking |
26-
SupportsDisable;
25+
SupportsSetEnabled;
2726
}
2827

2928
bool LaunchdServiceControl::serviceExists() const

‎src/plugins/servicebackends/standard/standardservicecontrol.cpp

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/standard/standardservicecontrol.cpp
+6-12Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ ServiceControl::ServiceStatus StandardServiceControl::status() const
5050
}
5151
}
5252

53+
ServiceControl::BlockMode StandardServiceControl::blocking() const
54+
{
55+
return NonBlocking;
56+
}
57+
5358
QVariant StandardServiceControl::callGenericCommand(const QByteArray &kind, const QVariantList &args)
5459
{
5560
Q_UNUSED(args)
@@ -133,18 +138,7 @@ bool StandardServiceControl::stop()
133138
auto hadConsole = FreeConsole();
134139
if(AttachConsole(static_cast<DWORD>(pid))) {
135140
if(SetConsoleCtrlHandler(nullptr, true)) {
136-
if(GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0)) {
137-
for(auto i = 0; i < 10; i++) {
138-
if(status() == ServiceRunning)
139-
QThread::msleep(500);
140-
else {
141-
ok = true;
142-
break;
143-
}
144-
}
145-
if(!ok)
146-
setError(tr("Service did not stop yet"));
147-
} else
141+
if(!GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0))
148142
setError(tr("Failed to send stop signal with error: %1").arg(qt_error_string(GetLastError())));
149143
SetConsoleCtrlHandler(nullptr, false);
150144
} else

‎src/plugins/servicebackends/standard/standardservicecontrol.h

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/standard/standardservicecontrol.h
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class StandardServiceControl : public QtService::ServiceControl
1515
SupportFlags supportFlags() const override;
1616
bool serviceExists() const override;
1717
ServiceStatus status() const override;
18+
BlockMode blocking() const override;
1819

1920
QVariant callGenericCommand(const QByteArray &kind, const QVariantList &args) override;
2021

‎src/plugins/servicebackends/systemd/systemdservicecontrol.cpp

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/systemd/systemdservicecontrol.cpp
+19-3Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ ServiceControl::SupportFlags SystemdServiceControl::supportFlags() const
2323
SupportsAutostart |
2424
SupportsStatus |
2525
SupportsCustomCommands |
26-
SupportsBlockingNonBlocking;
26+
SupportsSetBlocking;
2727
}
2828

2929
bool SystemdServiceControl::serviceExists() const
@@ -135,6 +135,11 @@ bool SystemdServiceControl::isAutostartEnabled() const
135135
return runSystemctl("is-enabled") == EXIT_SUCCESS;
136136
}
137137

138+
ServiceControl::BlockMode SystemdServiceControl::blocking() const
139+
{
140+
return _blocking ? Blocking : NonBlocking;
141+
}
142+
138143
QVariant SystemdServiceControl::callGenericCommand(const QByteArray &kind, const QVariantList &args)
139144
{
140145
QStringList sArgs;
@@ -174,6 +179,16 @@ bool SystemdServiceControl::disableAutostart()
174179
return runSystemctl("disable") == EXIT_SUCCESS;
175180
}
176181

182+
bool SystemdServiceControl::setBlocking(bool blocking)
183+
{
184+
if(_blocking == blocking)
185+
return true;
186+
187+
_blocking = blocking;
188+
emit blockingChanged(this->blocking());
189+
return true;
190+
}
191+
177192
QString SystemdServiceControl::serviceName() const
178193
{
179194
const static QRegularExpression regex(QStringLiteral(R"__((.+)\.(?:service|socket|device|mount|automount|swap|target|path|timer|slice|scope))__"));
@@ -205,7 +220,7 @@ int SystemdServiceControl::runSystemctl(const QByteArray &command, const QString
205220
args.append(QString::fromUtf8(command));
206221
if(!noPrepare) {
207222
args.append(serviceId());
208-
if(!isBlocking())
223+
if(!_blocking)
209224
args.append(QStringLiteral("--no-block"));
210225
}
211226
args.append(extraArgs);
@@ -217,9 +232,10 @@ int SystemdServiceControl::runSystemctl(const QByteArray &command, const QString
217232
process.setProcessChannelMode(QProcess::ForwardedErrorChannel);
218233

219234
process.start(QProcess::ReadOnly);
220-
if(process.waitForFinished(isBlocking() ? -1 : 2500)) {//non-blocking calls should finish within two seconds
235+
if(process.waitForFinished(_blocking ? -1 : 2500)) {//non-blocking calls should finish within two seconds
221236
if(outData)
222237
*outData = process.readAllStandardOutput();
238+
223239
if(process.exitStatus() == QProcess::NormalExit)
224240
return process.exitCode();
225241
else {

‎src/plugins/servicebackends/systemd/systemdservicecontrol.h

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/systemd/systemdservicecontrol.h
+4-1Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,26 @@ class SystemdServiceControl : public QtService::ServiceControl
1515
bool serviceExists() const override;
1616
ServiceStatus status() const override;
1717
bool isAutostartEnabled() const override;
18+
BlockMode blocking() const override;
1819

1920
QVariant callGenericCommand(const QByteArray &kind, const QVariantList &args) override;
2021

21-
public slots:
22+
public Q_SLOTS:
2223
bool start() override;
2324
bool stop() override;
2425
bool restart() override;
2526
bool reload() override;
2627
bool enableAutostart() override;
2728
bool disableAutostart() override;
29+
bool setBlocking(bool blocking) override;
2830

2931
protected:
3032
QString serviceName() const override;
3133

3234
private:
3335
mutable bool _existsRefBase = false;
3436
mutable bool *_exists = nullptr;
37+
bool _blocking = true;
3538

3639
int runSystemctl(const QByteArray &command,
3740
const QStringList &extraArgs = {},

‎src/plugins/servicebackends/windows/windowsservicecontrol.cpp

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/windows/windowsservicecontrol.cpp
+6-2Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@ ServiceControl::SupportFlags WindowsServiceControl::supportFlags() const
2121
return SupportsStartStop |
2222
SupportsPauseResume |
2323
SupportsAutostart |
24-
SupportsNonBlocking |
2524
SupportsStatus |
2625
SupportsCustomCommands |
27-
SupportsDisable;
26+
SupportsSetEnabled;
2827
}
2928

3029
bool WindowsServiceControl::serviceExists() const
@@ -116,6 +115,11 @@ bool WindowsServiceControl::isEnabled() const
116115
}
117116
}
118117

118+
ServiceControl::BlockMode WindowsServiceControl::blocking() const
119+
{
120+
return NonBlocking;
121+
}
122+
119123
QVariant WindowsServiceControl::callGenericCommand(const QByteArray &kind, const QVariantList &args)
120124
{
121125
if(kind == "command") {

‎src/plugins/servicebackends/windows/windowsservicecontrol.h

Copy file name to clipboardExpand all lines: src/plugins/servicebackends/windows/windowsservicecontrol.h
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class WindowsServiceControl : public QtService::ServiceControl
1717
ServiceStatus status() const override;
1818
bool isAutostartEnabled() const override;
1919
bool isEnabled() const override;
20+
BlockMode blocking() const override;
2021
QVariant callGenericCommand(const QByteArray &kind, const QVariantList &args) override;
2122

2223
public Q_SLOTS:

‎src/service/servicecontrol.cpp

Copy file name to clipboardExpand all lines: src/service/servicecontrol.cpp
+10-22Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,29 +40,25 @@ QString ServiceControl::serviceIdFromName(const QString &backend, const QString
4040

4141
ServiceControl *ServiceControl::create(const QString &backend, QString serviceId, QObject *parent)
4242
{
43-
auto control = ServicePrivate::createControl(backend, std::move(serviceId), parent);
44-
// set the correct default value
45-
if(control)
46-
control->d->blocking = control->supportFlags().testFlag(SupportsBlocking);
47-
return control;
43+
return ServicePrivate::createControl(backend, std::move(serviceId), parent);
4844
}
4945

5046
ServiceControl *ServiceControl::create(const QString &backend, QString serviceId, QString serviceNameOverride, QObject *parent)
5147
{
52-
auto control = create(backend, std::move(serviceId), parent);
48+
auto control = ServicePrivate::createControl(backend, std::move(serviceId), parent);
5349
if(control)
5450
control->d->serviceName = std::move(serviceNameOverride);
5551
return control;
5652
}
5753

5854
ServiceControl *ServiceControl::createFromName(const QString &backend, const QString &serviceName, QObject *parent)
5955
{
60-
return create(backend, serviceIdFromName(backend, serviceName), parent);
56+
return ServicePrivate::createControl(backend, serviceIdFromName(backend, serviceName), parent);
6157
}
6258

6359
ServiceControl *ServiceControl::createFromName(const QString &backend, const QString &serviceName, const QString &domain, QObject *parent)
6460
{
65-
return create(backend, serviceIdFromName(backend, serviceName, domain), parent);
61+
return ServicePrivate::createControl(backend, serviceIdFromName(backend, serviceName, domain), parent);
6662
}
6763

6864
ServiceControl::ServiceControl(QString &&serviceId, QObject *parent) :
@@ -77,9 +73,9 @@ QString ServiceControl::serviceId() const
7773
return d->serviceId;
7874
}
7975

80-
bool ServiceControl::isBlocking() const
76+
ServiceControl::BlockMode ServiceControl::blocking() const
8177
{
82-
return d->blocking;
78+
return Undetermined;
8379
}
8480

8581
QString ServiceControl::error() const
@@ -135,7 +131,7 @@ bool ServiceControl::stop()
135131

136132
bool ServiceControl::restart()
137133
{
138-
if(supportFlags().testFlag(SupportsBlocking) && d->blocking) {
134+
if(blocking() == Blocking) {
139135
auto ok = stop();
140136
if(ok)
141137
ok = start();
@@ -181,18 +177,10 @@ bool ServiceControl::disableAutostart()
181177
return false;
182178
}
183179

184-
void ServiceControl::setBlocking(bool blocking)
180+
bool ServiceControl::setBlocking(bool blocking)
185181
{
186-
if (d->blocking == blocking)
187-
return;
188-
189-
if(blocking && !supportFlags().testFlag(SupportsBlocking))
190-
return;
191-
if(!blocking && !supportFlags().testFlag(SupportsNonBlocking))
192-
return;
193-
194-
d->blocking = blocking;
195-
emit blockingChanged(d->blocking, {});
182+
Q_UNUSED(blocking)
183+
return false;
196184
}
197185

198186
void ServiceControl::clearError()

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.