implement systemd support for PowerDevil Policy Agent
[kde-workspace-appmenu:kde-workspace-appmenu.git] / powerdevil / daemon / powerdevilpolicyagent.h
1 /***************************************************************************
2  *   Copyright (C) 2010 by Dario Freddi <drf@kde.org>                      *
3  *   Copyright (C) 2012 Lukáš Tinkl <ltinkl@redhat.com>                    *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
19  ***************************************************************************/
20
21
22 #ifndef POWERDEVIL_POWERDEVILPOLICYAGENT_H
23 #define POWERDEVIL_POWERDEVILPOLICYAGENT_H
24
25 #include <QtCore/QObject>
26 #include <QtCore/QHash>
27 #include <QtCore/QWeakPointer>
28
29 #include <QtDBus/QDBusContext>
30
31 #include <kdemacros.h>
32
33 class QDBusServiceWatcher;
34 class QDBusInterface;
35
36 #define SYSTEMD_LOGIN1_SERVICE "org.freedesktop.login1"
37 #define SYSTEMD_LOGIN1_PATH "/org/freedesktop/login1"
38 #define SYSTEMD_LOGIN1_MANAGER_IFACE "org.freedesktop.login1.Manager"
39 #define SYSTEMD_LOGIN1_SESSION_IFACE "org.freedesktop.login1.Session"
40 #define SYSTEMD_LOGIN1_SEAT_IFACE "org.freedesktop.login1.Seat"
41
42 #define CONSOLEKIT_SERVICE "org.freedesktop.ConsoleKit"
43
44
45 namespace PowerDevil
46 {
47
48 class KDE_EXPORT PolicyAgent : public QObject, protected QDBusContext
49 {
50     Q_OBJECT
51     Q_DISABLE_COPY(PolicyAgent)
52
53     Q_CLASSINFO("D-Bus Interface", "org.kde.Solid.PowerManagement.PolicyAgent")
54
55 public:
56     enum RequiredPolicy {
57         None = 0,
58         InterruptSession = 1,
59         ChangeProfile = 2,
60         ChangeScreenSettings = 4
61     };
62     Q_DECLARE_FLAGS(RequiredPolicies, RequiredPolicy)
63
64     static PolicyAgent *instance();
65
66     virtual ~PolicyAgent();
67
68     /**
69      * This function performs a policy check on given policies, and returns a set of unsatisfiable policies,
70      * or \c None if all the policies are satisfiable and the action can be carried on.
71      */
72     RequiredPolicies requirePolicyCheck(RequiredPolicies policies);
73
74     RequiredPolicies unavailablePolicies();
75
76 public Q_SLOTS:
77     // Exported slots
78     uint AddInhibition(uint types, const QString &appName, const QString &reason);
79     void ReleaseInhibition(uint cookie);
80
81     void releaseAllInhibitions();
82 Q_SIGNALS:
83     void unavailablePoliciesChanged(PowerDevil::PolicyAgent::RequiredPolicies newpolicies);
84
85 private Q_SLOTS:
86     void onServiceUnregistered(const QString & serviceName);
87     void onSessionHandlerRegistered(const QString & serviceName);
88     void onSessionHandlerUnregistered(const QString & serviceName);
89     void onActiveSessionChanged(const QString & ifaceName, const QVariantMap & changedProps, const QStringList & invalidatedProps);
90     void onActiveSessionChanged(const QString &activeSession);
91
92 private:
93     explicit PolicyAgent(QObject* parent = 0);
94
95     void init();
96     void startSessionInterruption();
97     void finishSessionInterruption();
98
99     void addInhibitionTypeHelper(uint cookie, RequiredPolicies types);
100
101     // This function serves solely for fd.o connector
102     uint addInhibitionWithExplicitDBusService(uint types, const QString &appName,
103                                               const QString &reason, const QString &service);
104
105     // systemd support
106     QString getNamedPathProperty(const QString & path, const QString & iface, const QString & prop) const;
107     bool m_sdAvailable;
108     QString m_activeSessionPath;
109     QWeakPointer< QDBusInterface > m_sdSessionInterface;
110     QWeakPointer< QDBusInterface > m_sdSeatInterface;
111
112     // ConsoleKit support
113     bool m_ckAvailable;
114     QWeakPointer< QDBusInterface > m_ckSessionInterface;
115     QWeakPointer< QDBusInterface > m_ckSeatInterface;
116     bool m_sessionIsBeingInterrupted;
117
118     QHash< uint, QPair< QString, QString > > m_cookieToAppName;
119     QHash< uint, QString > m_cookieToBusService;
120     QHash< RequiredPolicy, QList< uint > > m_typesToCookie;
121
122     uint m_lastCookie;
123
124     QWeakPointer< QDBusServiceWatcher > m_busWatcher;
125     QWeakPointer< QDBusServiceWatcher > m_sdWatcher;
126     QWeakPointer< QDBusServiceWatcher > m_ckWatcher;
127
128     bool m_wasLastActiveSession;
129
130     friend class Core;
131     friend class FdoConnector;
132 };
133
134 }
135
136 #endif // POWERDEVIL_POWERDEVILPOLICYAGENT_H