2
* panel-dbus-service.c: a simple base object to use a DBus service. Only
3
* useful when subclassed.
5
* Copyright (C) 2008 Novell, Inc.
7
* Based on code from panel-power-manager.c:
8
* Copyright (C) 2006 Ray Strode <rstrode@redhat.com>
9
* (not sure the copyright header was complete)
11
* This program is free software; you can redistribute it and/or
12
* modify it under the terms of the GNU General Public License as
13
* published by the Free Software Foundation; either version 2 of the
14
* License, or (at your option) any later version.
16
* This program is distributed in the hope that it will be useful, but
17
* WITHOUT ANY WARRANTY; without even the implied warranty of
18
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19
* General Public License for more details.
21
* You should have received a copy of the GNU General Public License
22
* along with this program; if not, write to the Free Software
23
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27
* Vincent Untz <vuntz@gnome.org>
33
#include <glib-object.h>
35
#include <dbus/dbus-glib.h>
37
#include "panel-dbus-service.h"
39
struct _PanelDBusServicePrivate {
40
DBusGConnection *dbus_connection;
41
DBusGProxy *bus_proxy;
42
DBusGProxy *service_proxy;
43
guint32 is_connected : 1;
45
const char *service_name;
46
const char *service_path;
47
const char *service_interface;
50
static void panel_dbus_service_finalize (GObject *object);
51
static void panel_dbus_service_class_install_properties (PanelDBusServiceClass *service_class);
53
static void panel_dbus_service_get_property (GObject *object,
63
G_DEFINE_TYPE (PanelDBusService, panel_dbus_service, G_TYPE_OBJECT);
66
panel_dbus_service_class_init (PanelDBusServiceClass *service_class)
68
GObjectClass *object_class;
70
object_class = G_OBJECT_CLASS (service_class);
72
object_class->finalize = panel_dbus_service_finalize;
74
panel_dbus_service_class_install_properties (service_class);
76
g_type_class_add_private (service_class,
77
sizeof (PanelDBusServicePrivate));
81
panel_dbus_service_class_install_properties (PanelDBusServiceClass *service_class)
83
GObjectClass *object_class;
84
GParamSpec *param_spec;
86
object_class = G_OBJECT_CLASS (service_class);
87
object_class->get_property = panel_dbus_service_get_property;
89
param_spec = g_param_spec_boolean ("is-connected",
91
"Whether the panel is connected to "
95
g_object_class_install_property (object_class, PROP_IS_CONNECTED,
100
panel_dbus_service_init (PanelDBusService *service)
102
service->priv = G_TYPE_INSTANCE_GET_PRIVATE (service,
103
PANEL_TYPE_DBUS_SERVICE,
104
PanelDBusServicePrivate);
106
service->priv->dbus_connection = NULL;
107
service->priv->bus_proxy = NULL;
108
service->priv->service_proxy = NULL;
109
service->priv->is_connected = FALSE;
111
service->priv->service_name = NULL;
112
service->priv->service_path = NULL;
113
service->priv->service_interface = NULL;
117
panel_dbus_service_finalize (GObject *object)
119
PanelDBusService *service;
121
service = PANEL_DBUS_SERVICE (object);
123
if (service->priv->dbus_connection != NULL) {
124
dbus_g_connection_unref (service->priv->dbus_connection);
125
service->priv->dbus_connection = NULL;
128
if (service->priv->bus_proxy != NULL) {
129
g_object_unref (service->priv->bus_proxy);
130
service->priv->bus_proxy = NULL;
133
if (service->priv->service_proxy != NULL) {
134
g_object_unref (service->priv->service_proxy);
135
service->priv->service_proxy = NULL;
138
G_OBJECT_CLASS (panel_dbus_service_parent_class)->finalize (object);
142
panel_dbus_service_get_property (GObject *object,
147
PanelDBusService *service;
149
service = PANEL_DBUS_SERVICE (object);
152
case PROP_IS_CONNECTED:
153
g_value_set_boolean (value,
154
service->priv->is_connected);
158
G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
165
panel_dbus_service_on_name_owner_changed (DBusGProxy *bus_proxy,
167
const char *prev_owner,
168
const char *new_owner,
169
PanelDBusService *service)
171
g_assert (service->priv->service_name != NULL);
173
if (name && strcmp (name, service->priv->service_name) != 0)
176
if (service->priv->service_proxy != NULL) {
177
g_object_unref (service->priv->service_proxy);
178
service->priv->service_proxy = NULL;
181
panel_dbus_service_ensure_connection (service, NULL);
185
panel_dbus_service_ensure_connection (PanelDBusService *service,
188
GError *connection_error;
189
gboolean is_connected;
191
g_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE);
193
if (!service->priv->service_name ||
194
!service->priv->service_path ||
195
!service->priv->service_interface)
198
connection_error = NULL;
199
if (service->priv->dbus_connection == NULL) {
200
service->priv->dbus_connection = dbus_g_bus_get (DBUS_BUS_SESSION,
203
if (service->priv->dbus_connection == NULL) {
204
g_propagate_error (error, connection_error);
205
is_connected = FALSE;
210
if (service->priv->bus_proxy == NULL) {
211
service->priv->bus_proxy =
212
dbus_g_proxy_new_for_name_owner (service->priv->dbus_connection,
218
if (service->priv->bus_proxy == NULL) {
219
g_propagate_error (error, connection_error);
220
is_connected = FALSE;
224
dbus_g_proxy_add_signal (service->priv->bus_proxy,
230
dbus_g_proxy_connect_signal (service->priv->bus_proxy,
232
G_CALLBACK (panel_dbus_service_on_name_owner_changed),
236
if (service->priv->service_proxy == NULL) {
237
service->priv->service_proxy =
238
dbus_g_proxy_new_for_name_owner (
239
service->priv->dbus_connection,
240
service->priv->service_name,
241
service->priv->service_path,
242
service->priv->service_interface,
245
if (service->priv->service_proxy == NULL) {
246
g_propagate_error (error, connection_error);
247
is_connected = FALSE;
254
if (service->priv->is_connected != is_connected) {
255
service->priv->is_connected = is_connected;
256
g_object_notify (G_OBJECT (service), "is-connected");
260
if (service->priv->dbus_connection == NULL) {
261
if (service->priv->bus_proxy != NULL) {
262
g_object_unref (service->priv->bus_proxy);
263
service->priv->bus_proxy = NULL;
266
if (service->priv->service_proxy != NULL) {
267
g_object_unref (service->priv->service_proxy);
268
service->priv->service_proxy = NULL;
270
} else if (service->priv->bus_proxy == NULL) {
271
if (service->priv->service_proxy != NULL) {
272
g_object_unref (service->priv->service_proxy);
273
service->priv->service_proxy = NULL;
282
panel_dbus_service_define_service (PanelDBusService *service,
285
const char *interface)
287
g_return_if_fail (PANEL_IS_DBUS_SERVICE (service));
289
g_assert (name != NULL);
290
g_assert (path != NULL);
291
g_assert (interface != NULL);
292
g_assert (service->priv->service_name == NULL);
293
g_assert (service->priv->service_path == NULL);
294
g_assert (service->priv->service_interface == NULL);
296
service->priv->service_name = name;
297
service->priv->service_path = path;
298
service->priv->service_interface = interface;
302
panel_dbus_service_get_proxy (PanelDBusService *service)
304
g_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), NULL);
306
return service->priv->service_proxy;