NetworkManager/libnm-glib/nm-client.c

243 lines
5.9 KiB
C
Raw Normal View History

#include <dbus/dbus-glib.h>
#include "nm-client.h"
#include "nm-device-802-3-ethernet.h"
#include "nm-device-802-11-wireless.h"
#include "nm-utils.h"
#include "nm-client-bindings.h"
G_DEFINE_TYPE (NMClient, nm_client, DBUS_TYPE_G_PROXY)
enum {
DEVICE_ADDED,
DEVICE_REMOVED,
STATE_CHANGE,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static void client_state_change_proxy (DBusGProxy *proxy, guint state, gpointer user_data);
static void client_device_added_proxy (DBusGProxy *proxy, char *path, gpointer user_data);
static void client_device_removed_proxy (DBusGProxy *proxy, char *path, gpointer user_data);
static void
nm_client_init (NMClient *client)
{
}
static void
nm_client_class_init (NMClientClass *client_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (client_class);
/* signals */
signals[DEVICE_ADDED] =
g_signal_new ("device-added",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NMClientClass, device_added),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
G_TYPE_OBJECT);
signals[DEVICE_REMOVED] =
g_signal_new ("device-removed",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NMClientClass, device_removed),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
G_TYPE_OBJECT);
signals[STATE_CHANGE] =
g_signal_new ("state-change",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NMClientClass, state_change),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1,
G_TYPE_UINT);
}
NMClient *
nm_client_new (void)
{
DBusGConnection *connection;
DBusGProxy *proxy;
NMClient *client;
GError *err = NULL;
connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &err);
if (!connection) {
g_warning ("Couldn't connect to system bus: %d", err->message);
g_error_free (err);
return NULL;
}
client = (NMClient *) g_object_new (NM_TYPE_CLIENT,
"name", NM_DBUS_SERVICE,
"path", NM_DBUS_PATH,
"interface", NM_DBUS_INTERFACE,
"connection", connection,
NULL);
proxy = DBUS_G_PROXY (client);
dbus_g_proxy_add_signal (proxy, "StateChange", G_TYPE_UINT, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (proxy,
"StateChange",
G_CALLBACK (client_state_change_proxy),
client,
NULL);
dbus_g_proxy_add_signal (proxy, "DeviceAdded", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (proxy,
"DeviceAdded",
G_CALLBACK (client_device_added_proxy),
client,
NULL);
dbus_g_proxy_add_signal (proxy, "DeviceRemoved", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (proxy,
"DeviceRemoved",
G_CALLBACK (client_device_removed_proxy),
client,
NULL);
return client;
}
static void
client_state_change_proxy (DBusGProxy *proxy, guint state, gpointer user_data)
{
NMClient *client = NM_CLIENT (user_data);
g_signal_emit (client, signals[STATE_CHANGE], 0, state);
}
static void
client_device_added_proxy (DBusGProxy *proxy, char *path, gpointer user_data)
{
NMClient *client = NM_CLIENT (user_data);
NMDevice *device;
DBusGConnection *connection = NULL;
g_object_get (client, "connection", &connection, NULL);
device = nm_device_new (connection, path);
g_signal_emit (client, signals[DEVICE_ADDED], 0, device);
g_object_unref (device);
}
static void
client_device_removed_proxy (DBusGProxy *proxy, char *path, gpointer user_data)
{
NMClient *client = NM_CLIENT (user_data);
NMDevice *device;
DBusGConnection *connection = NULL;
g_object_get (client, "connection", &connection, NULL);
device = nm_device_new (connection, path);
g_signal_emit (client, signals[DEVICE_REMOVED], 0, device);
g_object_unref (device);
}
GSList *
nm_client_get_devices (NMClient *client)
{
GSList *list = NULL;
GPtrArray *array = NULL;
GError *err = NULL;
g_return_val_if_fail (NM_IS_CLIENT (client), NULL);
if (!org_freedesktop_NetworkManager_get_devices (DBUS_G_PROXY (client), &array, &err)) {
g_warning ("Error in get_devices: %s", err->message);
g_error_free (err);
} else {
DBusGConnection *connection = NULL;
int i;
g_object_get (client, "connection", &connection, NULL);
for (i = 0; i < array->len; i++) {
NMDevice *device;
const char *path = g_ptr_array_index (array, i);
NMDeviceType type = nm_device_type_for_path (connection, path);
switch (type) {
case DEVICE_TYPE_802_3_ETHERNET:
device = NM_DEVICE (nm_device_802_3_ethernet_new (connection, path));
break;
case DEVICE_TYPE_802_11_WIRELESS:
device = NM_DEVICE (nm_device_802_11_wireless_new (connection, path));
break;
default:
device = nm_device_new (connection, path);
break;
}
list = g_slist_append (list, device);
}
g_ptr_array_free (array, TRUE);
}
return list;
}
gboolean
nm_client_wireless_get_enabled (NMClient *client)
{
GValue value = {0,};
gboolean enabled = FALSE;
g_return_val_if_fail (NM_IS_CLIENT (client), enabled);
if (nm_dbus_get_property (DBUS_G_PROXY (client),
NM_DBUS_INTERFACE,
"WirelessEnabled",
&value))
enabled = g_value_get_boolean (&value);
return enabled;
}
void
nm_client_wireless_set_enabled (NMClient *client, gboolean enabled)
{
GValue value = {0,};
g_return_if_fail (NM_IS_CLIENT (client));
g_value_init (&value, G_TYPE_BOOLEAN);
g_value_set_boolean (&value, enabled);
nm_dbus_set_property (DBUS_G_PROXY (client),
NM_DBUS_INTERFACE,
"WirelessEnabled",
&value);
}
NMState
nm_client_get_state (NMClient *client)
{
GValue value = {0,};
NMState state = NM_STATE_UNKNOWN;
g_return_val_if_fail (NM_IS_CLIENT (client), state);
if (nm_dbus_get_property (DBUS_G_PROXY (client),
NM_DBUS_INTERFACE,
"State",
&value))
state = g_value_get_uint (&value);
return state;
}