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