2
* * Copyright (C) 2008-2009 Ali <aliov@xfce.org>
4
* Licensed under the GNU General Public License Version 2
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29
#include <dbus/dbus-glib.h>
32
#include "hal-manager.h"
33
#include "hal-device.h"
35
static void hal_manager_finalize (GObject *object);
37
#define HAL_MANAGER_GET_PRIVATE(o) \
38
(G_TYPE_INSTANCE_GET_PRIVATE((o), HAL_TYPE_MANAGER, HalManagerPrivate))
40
struct HalManagerPrivate
55
static gpointer hal_manager_object = NULL;
57
static guint signals[LAST_SIGNAL] = { 0 };
59
G_DEFINE_TYPE (HalManager, hal_manager, G_TYPE_OBJECT)
62
hal_manager_device_added_cb (DBusGProxy *proxy, const gchar *udi, HalManager *manager)
64
g_signal_emit (G_OBJECT(manager), signals[DEVICE_ADDED], 0, udi);
68
hal_manager_device_removed_cb (DBusGProxy *proxy, const gchar *udi, HalManager *manager)
70
g_signal_emit (G_OBJECT(manager), signals[DEVICE_REMOVED], 0, udi);
74
hal_manager_connect (HalManager *manager)
78
manager->priv->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
82
g_critical ("Failed to get bus system %s\n", error->message);
86
manager->priv->connected = TRUE;
88
manager->priv->proxy = dbus_g_proxy_new_for_name (manager->priv->bus,
89
"org.freedesktop.Hal",
90
"/org/freedesktop/Hal/Manager",
91
"org.freedesktop.Hal.Manager");
93
if ( !manager->priv->proxy )
95
g_critical ("Unable to get proxy for \n");
99
dbus_g_proxy_add_signal (manager->priv->proxy, "DeviceAdded",
100
G_TYPE_STRING, G_TYPE_INVALID);
102
dbus_g_proxy_connect_signal (manager->priv->proxy, "DeviceAdded",
103
G_CALLBACK (hal_manager_device_added_cb), manager, NULL);
105
dbus_g_proxy_add_signal (manager->priv->proxy, "DeviceRemoved",
106
G_TYPE_STRING, G_TYPE_INVALID);
108
dbus_g_proxy_connect_signal (manager->priv->proxy, "DeviceRemoved",
109
G_CALLBACK (hal_manager_device_removed_cb), manager, NULL);
115
hal_manager_get_is_laptop_internal (HalManager *manager)
120
device = hal_device_new ();
122
hal_device_set_udi (device, "/org/freedesktop/Hal/devices/computer");
124
form_factor = hal_device_get_property_string (device, "system.formfactor");
126
if ( g_strcmp0 (form_factor, "laptop") == 0)
127
manager->priv->is_laptop = TRUE;
129
manager->priv->is_laptop = FALSE;
132
g_free (form_factor);
134
g_object_unref (device);
138
hal_manager_class_init(HalManagerClass *klass)
140
GObjectClass *object_class = G_OBJECT_CLASS(klass);
142
signals[DEVICE_ADDED] =
143
g_signal_new("device-added",
146
G_STRUCT_OFFSET(HalManagerClass, device_added),
148
g_cclosure_marshal_VOID__STRING,
149
G_TYPE_NONE, 1, G_TYPE_STRING);
151
signals[DEVICE_REMOVED] =
152
g_signal_new("device-removed",
155
G_STRUCT_OFFSET(HalManagerClass, device_removed),
157
g_cclosure_marshal_VOID__STRING,
158
G_TYPE_NONE, 1, G_TYPE_STRING);
160
object_class->finalize = hal_manager_finalize;
162
g_type_class_add_private (klass,sizeof(HalManagerPrivate));
166
hal_manager_init (HalManager *manager)
168
manager->priv = HAL_MANAGER_GET_PRIVATE (manager);
170
manager->priv->bus = NULL;
171
manager->priv->proxy = NULL;
172
manager->priv->connected = FALSE;
174
hal_manager_connect (manager);
175
hal_manager_get_is_laptop_internal (manager);
179
hal_manager_finalize(GObject *object)
183
manager = HAL_MANAGER(object);
185
if ( manager->priv->proxy )
186
g_object_unref (manager->priv->proxy);
188
if ( manager->priv->bus )
189
dbus_g_connection_unref (manager->priv->bus);
191
G_OBJECT_CLASS(hal_manager_parent_class)->finalize(object);
195
hal_manager_new (void)
197
if ( hal_manager_object != NULL )
199
g_object_ref (hal_manager_object);
203
hal_manager_object = g_object_new (HAL_TYPE_MANAGER, NULL);
204
g_object_add_weak_pointer (hal_manager_object, &hal_manager_object);
207
return HAL_MANAGER (hal_manager_object);
210
gchar **hal_manager_find_device_by_capability (HalManager *manager, const gchar *capability)
212
GError *error = NULL;
215
g_return_val_if_fail (HAL_IS_MANAGER(manager), NULL);
216
g_return_val_if_fail (manager->priv->connected, NULL);
218
dbus_g_proxy_call (manager->priv->proxy, "FindDeviceByCapability", &error,
219
G_TYPE_STRING, capability,
225
g_critical ("Error finding devices by capability %s\n", error->message);
226
g_error_free (error);
232
gboolean hal_manager_get_is_laptop (HalManager *manager)
234
g_return_val_if_fail (HAL_IS_MANAGER (manager), FALSE);
236
return manager->priv->is_laptop;
239
void hal_manager_free_string_array (gchar **array)
246
for (i=0; array[i]; i++)