File indexing completed on 2024-04-28 05:35:36

0001 /*
0002     SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <KConfigWatcher>
0010 #include <QObject>
0011 
0012 #include "kworkspace_export.h"
0013 #include "sessionmanagement.h"
0014 
0015 class OrgFreedesktopLogin1ManagerInterface;
0016 
0017 /**
0018  * Performs direct system actions that could kill the session
0019  *
0020  * Semi-internal. Symbols exported, but not the header
0021  * To be used only by the daemon that performs logout (currently ksmserver)
0022  *
0023  * All other users should go via the public SessionManagement that prompts and logs out properly.
0024  */
0025 class KWORKSPACE_EXPORT SessionBackend : public QObject
0026 {
0027     Q_OBJECT
0028 public:
0029     static SessionBackend *self();
0030     virtual SessionManagement::State state() const = 0;
0031 
0032     virtual void shutdown() = 0;
0033     virtual void reboot() = 0;
0034     virtual void suspend() = 0;
0035     virtual void hybridSuspend() = 0;
0036     virtual void hibernate() = 0;
0037     virtual void suspendThenHibernate() = 0;
0038 
0039     virtual bool canShutdown() const = 0;
0040     virtual bool canReboot() const = 0;
0041     virtual bool canSuspend() const = 0;
0042     virtual bool canHybridSuspend() const = 0;
0043     virtual bool canHibernate() const = 0;
0044     virtual bool canSuspendThenHibernate() const = 0;
0045 
0046     virtual bool canSwitchUser() const;
0047 
0048     bool confirmLogout() const;
0049 
0050 Q_SIGNALS:
0051     void stateChanged();
0052     void canShutdownChanged();
0053     void canRebootChanged();
0054     void canSuspendChanged();
0055     void canHybridSuspendChanged();
0056     void canHibernateChanged();
0057     void canSuspendThenHibernateChanged();
0058 
0059     void aboutToSuspend();
0060     void resumingFromSuspend();
0061 
0062 protected:
0063     SessionBackend();
0064     ~SessionBackend() override = default;
0065 
0066 private:
0067     KConfigWatcher::Ptr m_kserverConfig;
0068 };
0069 
0070 /*
0071  * This class wraps both Logind and CK2
0072  * Abstraction for that is handled in OrgFreedesktopLogin1ManagerInterface
0073  */
0074 class LogindSessionBackend : public SessionBackend
0075 {
0076     Q_OBJECT
0077 public:
0078     static bool exists();
0079     LogindSessionBackend();
0080 
0081     SessionManagement::State state() const override;
0082     void shutdown() override;
0083     void reboot() override;
0084     void suspend() override;
0085     void hybridSuspend() override;
0086     void hibernate() override;
0087     void suspendThenHibernate() override;
0088     bool canShutdown() const override;
0089     bool canReboot() const override;
0090     bool canSuspend() const override;
0091     bool canHybridSuspend() const override;
0092     bool canHibernate() const override;
0093     bool canSuspendThenHibernate() const override;
0094     bool canSwitchUser() const override;
0095 
0096 private:
0097     OrgFreedesktopLogin1ManagerInterface *m_login1;
0098     SessionManagement::State m_state = SessionManagement::State::Loading;
0099     bool m_canShutdown = false;
0100     bool m_canReboot = false;
0101     bool m_canSuspend = false;
0102     bool m_canHybridSuspend = false;
0103     bool m_canHibernate = false;
0104     bool m_canSuspendThenHibernate = false;
0105     uint m_pendingJobs = 0;
0106 };
0107 
0108 class DummySessionBackend : public SessionBackend
0109 {
0110     Q_OBJECT
0111 public:
0112     DummySessionBackend();
0113 
0114     SessionManagement::State state() const override
0115     {
0116         return SessionManagement::State::Error;
0117     }
0118     void shutdown() override
0119     {
0120     }
0121     void reboot() override
0122     {
0123     }
0124     void suspend() override
0125     {
0126     }
0127     void hybridSuspend() override
0128     {
0129     }
0130     void hibernate() override
0131     {
0132     }
0133     void suspendThenHibernate() override
0134     {
0135     }
0136     bool canShutdown() const override
0137     {
0138         return false;
0139     }
0140     bool canReboot() const override
0141     {
0142         return false;
0143     }
0144     bool canSuspend() const override
0145     {
0146         return false;
0147     }
0148     bool canHybridSuspend() const override
0149     {
0150         return false;
0151     }
0152     bool canHibernate() const override
0153     {
0154         return false;
0155     }
0156     bool canSuspendThenHibernate() const override
0157     {
0158         return false;
0159     }
0160 };
0161 
0162 class TestSessionBackend : public SessionBackend
0163 {
0164     Q_OBJECT
0165 public:
0166     TestSessionBackend();
0167 
0168     SessionManagement::State state() const override
0169     {
0170         return SessionManagement::State::Ready;
0171     }
0172     void shutdown() override;
0173     void reboot() override;
0174     void suspend() override;
0175     void hybridSuspend() override;
0176     void hibernate() override;
0177     void suspendThenHibernate() override;
0178 
0179     bool canShutdown() const override
0180     {
0181         return true;
0182     }
0183     bool canReboot() const override
0184     {
0185         return true;
0186     }
0187     bool canSuspend() const override
0188     {
0189         return true;
0190     }
0191     bool canHybridSuspend() const override
0192     {
0193         return true;
0194     }
0195     bool canHibernate() const override
0196     {
0197         return true;
0198     }
0199     bool canSuspendThenHibernate() const override
0200     {
0201         return true;
0202     }
0203 };