1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
/**************************************************************************
* Copyright (C) 2006-2007 by Danny Kukawka *
* <dkukawka@suse.de>, <danny.kukawka@web.de> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of version 2 of the GNU General Public License *
* as published by the Free Software Foundation. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
/*!
* \file dbusHAL.h
* \brief Headerfile for dbusHAL.cpp and the class \ref dbusHAL.
*/
/*!
* \class dbusHAL
* \brief class for connection to HAL via D-Bus
* \author Danny Kukawka, <dkukawka@suse.de>, <danny.kukawka@web.de>
* \date 2006-2007
*/
#ifndef _DBUSHAL_H_
#define _DBUSHAL_H_
#ifndef DBUS_API_SUBJECT_TO_CHANGE
#define DBUS_API_SUBJECT_TO_CHANGE
#endif
// Global Header
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
// QT - Header
#include <qstring.h>
// D-Bus Header
#include <dbus/dbus.h> // needed for dbus_bool_t
#include <dbus/message.h>
#include <dbus/connection.h>
// HAL Library
#include <hal/libhal.h>
// kpowersave - Header
#include "kpowersave_debug.h"
#define HAL_SERVICE "org.freedesktop.Hal"
#define HAL_PM_IFACE "org.freedesktop.Hal.Device.SystemPowerManagement"
#define HAL_LPANEL_IFACE "org.freedesktop.Hal.Device.LaptopPanel"
#define HAL_CPUFREQ_IFACE "org.freedesktop.Hal.Device.CPUFreq"
#define HAL_COMPUTER_UDI "/org/freedesktop/Hal/devices/computer"
#define CK_SERVICE "org.freedesktop.ConsoleKit"
#define CK_MANAGER_IFACE "org.freedesktop.ConsoleKit.Manager"
#define CK_MANAGER_OBJECT "/org/freedesktop/ConsoleKit/Manager"
#define CK_SESSION_IFACE "org.freedesktop.ConsoleKit.Session"
enum msg_type {
ACPI_EVENT,
DBUS_EVENT,
HAL_DEVICE,
HAL_PROPERTY_CHANGED,
HAL_CONDITION,
CONSOLEKIT_SESSION_ACTIVE,
POLICY_POWER_OWNER_CHANGED
};
class dbusHAL : public QObject{
Q_OBJECT
private:
//! QT connection to D-Bus
DBusQt::Connection* m_dBusQtConnection;
//! real connection to D-Bus
DBusConnection *dbus_connection;
//! HAL context
LibHalContext *hal_ctx;
//! to store information if KPowersave is connected to D-Bus
/*!
* This boolean represent information about the state of the connection to D-Bus
* \li true: if connected
* \li false: if disconnected
*/
bool dbus_is_connected;
//! to store information if KPowersave is connected to HAL
/*!
* This boolean represent information about the state of the connection to HAL
* \li true: if connected
* \li false: if disconnected
*/
bool hal_is_connected;
//! if we could claim the org.freedesktop.Policy.Power interface
/*!
* This boolean represent information if KPowersave could claim the
* org.freedesktop.Policy.Power interface from the D-Bus
* \li true: if aquired
* \li false: if not
*/
bool aquiredPolicyPower;
/* D-Bus helper functions */
//! to initialise the connection to D-Bus
bool initDBUS();
//! to call a methode on a dbus interface with reply
bool dbusMethodCall( QString interface, QString path, QString object, QString method,
DBusBusType dbus_type, void *retvalue, int retval_type,
int first_arg_type, va_list var_args);
//! function to be called back by DBusPendingCall::dbus_pending_call_set_notify()
static void callBackSuspend (DBusPendingCall* pcall, void* /*data*/);
/* HAL helper functions */
//! to initialise the connection to HAL
bool initHAL();
//! to free the HAL context
void freeHAL();
public:
//! default constructor
dbusHAL();
//! default destructor
~dbusHAL();
//! to reconnect to D-Bus and HAL
bool reconnect();
//! to reconnect only HAL
bool reconnectHAL();
//! to close the connection to D-Bus and HAL
bool close();
//! to aquire the org.freedesktop.Policy.Power interface
bool aquirePolicyPowerIface();
//! to release the org.freedesktop.Policy.Power interface
bool releasePolicyPowerIface();
//! to check if the org.freedesktop.Policy.Power interface has an owner
bool isPolicyPowerIfaceOwned();
// --- helper to get private members of the class --- //
//! to get information if KPowersave is connected to D-Bus
bool isConnectedToDBUS();
//! to get information if KPowersave is connected to HAL
bool isConnectedToHAL();
//! to get info about claim org.freedesktop.Policy.Power interface
bool aquiredPolicyPowerInterface();
//! return the current HAL context
LibHalContext *get_HAL_context();
//! return the current DBus connection
DBusConnection *get_DBUS_connection();
/* HAL device information stuff */
//! Query a integer device property from HAL
bool halGetPropertyInt(QString udi, QString property, int *returnval);
//! Query a bolean device property from HAL
bool halGetPropertyBool(QString udi, QString property, bool *returnval);
//! Query a string device property from HAL
bool halGetPropertyString(QString udi, QString property, QString *returnval);
//! Query a string list device property from HAL
bool halGetPropertyStringList (QString udi, QString property, QStringList *devices);
//! Query a capability for a HAL device
bool halQueryCapability(QString udi, QString capability, bool *returnval);
/* functions to find devices and check stuff */
//! check if a property exist on a device
bool halDevicePropertyExist(QString udi, QString property);
//! to find a device by capability
bool halFindDeviceByCapability (QString capability, QStringList *devices);
//! to find a device by a string property
bool halFindDeviceByString (QString property, QString keyval, QStringList *devices);
/* D-Bus helper functions */
/* functions to call methodes */
//! to call a methode on a dbus system bus method without reply
bool dbusSystemMethodCall( QString interface, QString path, QString object, QString method,
int first_arg_type, ... );
//! to call a methode on a dbus system bus method with reply
bool dbusSystemMethodCall( QString interface, QString path, QString object, QString method,
void *retvalue, int retval_type, int first_arg_type, ... );
//! to call a suspend method on HAL
bool dbusMethodCallSuspend ( const char *suspend );
/* PolicyKit call helper */
//! check if the user has a requested privilege
int isUserPrivileged( QString privilege, QString udi, QString ressource = "", QString user = QString());
//! wrapper to emit a signal with a event from HAL
void emitMsgReceived( msg_type type, QString message, QString string );
signals:
//! signal with message to forward from D-Bus to HAL
void msgReceived_withStringString( msg_type, QString, QString );
//! signal if we resumed!
void backFromSuspend( int result );
};
//! filter function to filter out needed information from D-Bus messages
DBusHandlerResult filterFunction (DBusConnection *connection, DBusMessage *message, void *data);
#endif
|