1 /*
2 SPDX-FileCopyrightText: 2015 Eike Hein <hein@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "systementry.h"
8
9 #include <QDBusConnection>
10 #include <QDBusInterface>
11 #include <QDBusPendingCall>
12
13 #include <KAuthorized>
14 #include <KConfigGroup>
15 #include <KLocalizedString>
16 #include <KSharedConfig>
17 #include <kworkspace.h>
18 #include <sessionmanagement.h>
19
20 int SystemEntry::s_instanceCount = 0;
21 SessionManagement *SystemEntry::s_sessionManagement = nullptr;
22
SystemEntry(AbstractModel * owner,Action action)23 SystemEntry::SystemEntry(AbstractModel *owner, Action action)
24 : AbstractEntry(owner)
25 , m_action(action)
26 , m_valid(false)
27 , m_initialized(false)
28 {
29 refresh();
30 ++s_instanceCount;
31 m_initialized = true;
32 }
33
SystemEntry(AbstractModel * owner,const QString & id)34 SystemEntry::SystemEntry(AbstractModel *owner, const QString &id)
35 : AbstractEntry(owner)
36 , m_action(NoAction)
37 , m_valid(false)
38 , m_initialized(false)
39 {
40 if (id == QLatin1String("lock-screen")) {
41 m_action = LockSession;
42 } else if (id == QLatin1String("logout")) {
43 m_action = LogoutSession;
44 } else if (id == QLatin1String("save-session")) {
45 m_action = SaveSession;
46 } else if (id == QLatin1String("switch-user")) {
47 m_action = SwitchUser;
48 } else if (id == QLatin1String("suspend")) {
49 m_action = Suspend;
50 } else if (id == QLatin1String("hibernate")) {
51 m_action = Hibernate;
52 } else if (id == QLatin1String("reboot")) {
53 m_action = Reboot;
54 } else if (id == QLatin1String("shutdown")) {
55 m_action = Shutdown;
56 }
57
58 refresh();
59 ++s_instanceCount;
60 m_initialized = true;
61 }
62
~SystemEntry()63 SystemEntry::~SystemEntry()
64 {
65 --s_instanceCount;
66
67 if (!s_instanceCount) {
68 delete s_sessionManagement;
69 s_sessionManagement = nullptr;
70 }
71 }
72
action() const73 SystemEntry::Action SystemEntry::action() const
74 {
75 return m_action;
76 }
77
refresh()78 void SystemEntry::refresh()
79 {
80 if (!s_sessionManagement) {
81 s_sessionManagement = new SessionManagement();
82 }
83
84 bool valid = false;
85
86 switch (m_action) {
87 case LockSession: {
88 valid = s_sessionManagement->canLock();
89 QObject::connect(s_sessionManagement, &SessionManagement::canLockChanged, this, &SystemEntry::refresh);
90 break;
91 }
92 case LogoutSession: {
93 valid = s_sessionManagement->canLogout();
94 QObject::connect(s_sessionManagement, &SessionManagement::canLogoutChanged, this, &SystemEntry::refresh);
95 break;
96 }
97 case SaveSession: {
98 valid = s_sessionManagement->canSaveSession();
99 QObject::connect(s_sessionManagement, &SessionManagement::canSaveSessionChanged, this, &SystemEntry::refresh);
100 break;
101 }
102 case SwitchUser: {
103 valid = s_sessionManagement->canSwitchUser();
104 QObject::connect(s_sessionManagement, &SessionManagement::canSwitchUserChanged, this, &SystemEntry::refresh);
105 break;
106 }
107 case Suspend: {
108 valid = s_sessionManagement->canSuspend();
109 QObject::connect(s_sessionManagement, &SessionManagement::canSuspendChanged, this, &SystemEntry::refresh);
110 break;
111 }
112 case Hibernate: {
113 valid = s_sessionManagement->canHibernate();
114 QObject::connect(s_sessionManagement, &SessionManagement::canHibernateChanged, this, &SystemEntry::refresh);
115 break;
116 }
117 case Reboot: {
118 valid = s_sessionManagement->canReboot();
119 QObject::connect(s_sessionManagement, &SessionManagement::canRebootChanged, this, &SystemEntry::refresh);
120 break;
121 }
122 case Shutdown: {
123 valid = s_sessionManagement->canShutdown();
124 QObject::connect(s_sessionManagement, &SessionManagement::canShutdownChanged, this, &SystemEntry::refresh);
125 break;
126 }
127 default:
128 break;
129 }
130
131 if (m_valid != valid) {
132 m_valid = valid;
133
134 if (m_initialized) {
135 emit isValidChanged();
136 }
137 }
138 }
139
isValid() const140 bool SystemEntry::isValid() const
141 {
142 return m_valid;
143 }
144
icon() const145 QIcon SystemEntry::icon() const
146 {
147 const QString &name = iconName();
148
149 if (!name.isEmpty()) {
150 return QIcon::fromTheme(name, QIcon::fromTheme(QStringLiteral("unknown")));
151 }
152
153 return QIcon::fromTheme(QStringLiteral("unknown"));
154 }
155
iconName() const156 QString SystemEntry::iconName() const
157 {
158 switch (m_action) {
159 case LockSession:
160 return QStringLiteral("system-lock-screen");
161 break;
162 case LogoutSession:
163 return QStringLiteral("system-log-out");
164 break;
165 case SaveSession:
166 return QStringLiteral("system-save-session");
167 break;
168 case SwitchUser:
169 return QStringLiteral("system-switch-user");
170 break;
171 case Suspend:
172 return QStringLiteral("system-suspend");
173 break;
174 case Hibernate:
175 return QStringLiteral("system-suspend-hibernate");
176 break;
177 case Reboot:
178 return QStringLiteral("system-reboot");
179 break;
180 case Shutdown:
181 return QStringLiteral("system-shutdown");
182 break;
183 default:
184 break;
185 }
186
187 return QString();
188 }
189
name() const190 QString SystemEntry::name() const
191 {
192 switch (m_action) {
193 case LockSession:
194 return i18n("Lock");
195 break;
196 case LogoutSession:
197 return i18n("Log Out");
198 break;
199 case SaveSession:
200 return i18n("Save Session");
201 break;
202 case SwitchUser:
203 return i18n("Switch User");
204 break;
205 case Suspend:
206 return i18nc("Suspend to RAM", "Sleep");
207 break;
208 case Hibernate:
209 return i18n("Hibernate");
210 break;
211 case Reboot:
212 return i18n("Restart");
213 break;
214 case Shutdown:
215 return i18n("Shut Down");
216 break;
217 default:
218 break;
219 }
220
221 return QString();
222 }
223
group() const224 QString SystemEntry::group() const
225 {
226 switch (m_action) {
227 case LockSession:
228 return i18n("Session");
229 break;
230 case LogoutSession:
231 return i18n("Session");
232 break;
233 case SaveSession:
234 return i18n("Session");
235 break;
236 case SwitchUser:
237 return i18n("Session");
238 break;
239 case Suspend:
240 return i18n("System");
241 break;
242 case Hibernate:
243 return i18n("System");
244 break;
245 case Reboot:
246 return i18n("System");
247 break;
248 case Shutdown:
249 return i18n("System");
250 break;
251 default:
252 break;
253 }
254
255 return QString();
256 }
257
description() const258 QString SystemEntry::description() const
259 {
260 switch (m_action) {
261 case LockSession:
262 return i18n("Lock screen");
263 break;
264 case LogoutSession:
265 return i18n("End session");
266 break;
267 case SaveSession:
268 return i18n("Save Session");
269 break;
270 case SwitchUser:
271 return i18n("Start a parallel session as a different user");
272 break;
273 case Suspend:
274 return i18n("Suspend to RAM");
275 break;
276 case Hibernate:
277 return i18n("Suspend to disk");
278 break;
279 case Reboot:
280 return i18n("Restart computer");
281 break;
282 case Shutdown:
283 return i18n("Turn off computer");
284 break;
285 default:
286 break;
287 }
288
289 return QString();
290 }
291
id() const292 QString SystemEntry::id() const
293 {
294 switch (m_action) {
295 case LockSession:
296 return QStringLiteral("lock-screen");
297 break;
298 case LogoutSession:
299 return QStringLiteral("logout");
300 break;
301 case SaveSession:
302 return QStringLiteral("save-session");
303 break;
304 case SwitchUser:
305 return QStringLiteral("switch-user");
306 break;
307 case Suspend:
308 return QStringLiteral("suspend");
309 break;
310 case Hibernate:
311 return QStringLiteral("hibernate");
312 break;
313 case Reboot:
314 return QStringLiteral("reboot");
315 break;
316 case Shutdown:
317 return QStringLiteral("shutdown");
318 break;
319
320 default:
321 break;
322 }
323
324 return QString();
325 }
326
run(const QString & actionId,const QVariant & argument)327 bool SystemEntry::run(const QString &actionId, const QVariant &argument)
328 {
329 Q_UNUSED(actionId)
330 Q_UNUSED(argument)
331
332 if (!m_valid) {
333 return false;
334 }
335
336 switch (m_action) {
337 case LockSession:
338 s_sessionManagement->lock();
339 break;
340 case LogoutSession:
341 s_sessionManagement->requestLogout();
342 break;
343 case SaveSession:
344 s_sessionManagement->saveSession();
345 break;
346 case SwitchUser:
347 s_sessionManagement->switchUser();
348 break;
349 case Suspend:
350 s_sessionManagement->suspend();
351 break;
352 case Hibernate:
353 s_sessionManagement->hibernate();
354 break;
355 case Reboot:
356 s_sessionManagement->requestReboot();
357 break;
358 case Shutdown:
359 s_sessionManagement->requestShutdown();
360 break;
361 default:
362 break;
363 }
364
365 return true;
366 }
367