nm-dhcp4-config.c 5.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/*
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301 USA.
 *
18 19
 * Copyright 2008 - 2011 Red Hat, Inc.
 * Copyright 2008 Novell, Inc.
20 21
 */

22 23
#include "config.h"

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
#include <string.h>

#include "nm-dhcp4-config.h"
#include "NetworkManager.h"
#include "nm-types-private.h"
#include "nm-object-private.h"
#include "nm-utils.h"

G_DEFINE_TYPE (NMDHCP4Config, nm_dhcp4_config, NM_TYPE_OBJECT)

#define NM_DHCP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP4_CONFIG, NMDHCP4ConfigPrivate))

typedef struct {
	DBusGProxy *proxy;

	GHashTable *options;
} NMDHCP4ConfigPrivate;

enum {
	PROP_0,
	PROP_OPTIONS,

	LAST_PROP
};

static void
nm_dhcp4_config_init (NMDHCP4Config *config)
{
}

static gboolean
demarshal_dhcp4_options (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
{
	NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (object);
	GHashTable *new_options;
59 60 61
	GHashTableIter iter;
	const char *key;
	GValue *opt;
62 63 64 65

	g_hash_table_remove_all (priv->options);

	new_options = g_value_get_boxed (value);
66 67 68 69 70
	if (new_options) {
		g_hash_table_iter_init (&iter, new_options);
		while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &opt))
			g_hash_table_insert (priv->options, g_strdup (key), g_value_dup_string (opt));
	}
71

72
	_nm_object_queue_notify (object, NM_DHCP4_CONFIG_OPTIONS);
73 74 75 76
	return TRUE;
}

static void
77
register_properties (NMDHCP4Config *config)
78 79
{
	NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (config);
80 81
	const NMPropertiesInfo property_info[] = {
		{ NM_DHCP4_CONFIG_OPTIONS,   &priv->options, demarshal_dhcp4_options },
82 83 84
		{ NULL },
	};

85 86 87
	_nm_object_register_properties (NM_OBJECT (config),
	                                priv->proxy,
	                                property_info);
88 89
}

90 91
static void
constructed (GObject *object)
92
{
93
	NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (object);
94

95
	G_OBJECT_CLASS (nm_dhcp4_config_parent_class)->constructed (object);
96 97 98

	priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);

99
	priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DHCP4_CONFIG);
100
	register_properties (NM_DHCP4_CONFIG (object));
101 102 103 104 105 106 107 108 109 110
}

static void
finalize (GObject *object)
{
	NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (object);

	if (priv->options)
		g_hash_table_destroy (priv->options);

111 112
	g_object_unref (priv->proxy);

113 114 115 116 117 118 119 120 121 122 123
	G_OBJECT_CLASS (nm_dhcp4_config_parent_class)->finalize (object);
}

static void
get_property (GObject *object,
              guint prop_id,
              GValue *value,
              GParamSpec *pspec)
{
	NMDHCP4Config *self = NM_DHCP4_CONFIG (object);

124 125
	_nm_object_ensure_inited (NM_OBJECT (object));

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
	switch (prop_id) {
	case PROP_OPTIONS:
		g_value_set_boxed (value, nm_dhcp4_config_get_options (self));
		break;
	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
		break;
	}
}

static void
nm_dhcp4_config_class_init (NMDHCP4ConfigClass *config_class)
{
	GObjectClass *object_class = G_OBJECT_CLASS (config_class);

	g_type_class_add_private (config_class, sizeof (NMDHCP4ConfigPrivate));

	/* virtual methods */
144
	object_class->constructed = constructed;
145 146 147 148
	object_class->get_property = get_property;
	object_class->finalize = finalize;

	/* properties */
149 150 151 152 153

	/**
	 * NMDHCP4Config:options:
	 *
	 * The #GHashTable containing options of the configuration.
154
	 *
155
	 * Type: GLib.HashTable(utf8,GObject.Value)
156
	 **/
157 158
	g_object_class_install_property
		(object_class, PROP_OPTIONS,
159 160 161 162
		 g_param_spec_boxed (NM_DHCP4_CONFIG_OPTIONS, "", "",
		                     G_TYPE_HASH_TABLE,
		                     G_PARAM_READABLE |
		                     G_PARAM_STATIC_STRINGS));
163 164
}

165 166 167 168 169 170 171
/**
 * nm_dhcp4_config_new:
 * @connection: the #DBusGConnection
 * @object_path: the DBus object path of the device
 *
 * Creates a new #NMDHCP4Config.
 *
172
 * Returns: (transfer full): a new configuration
173
 **/
174 175 176 177
GObject *
nm_dhcp4_config_new (DBusGConnection *connection, const char *object_path)
{
	return (GObject *) g_object_new (NM_TYPE_DHCP4_CONFIG,
178 179 180
	                                 NM_OBJECT_DBUS_CONNECTION, connection,
	                                 NM_OBJECT_DBUS_PATH, object_path,
	                                 NULL);
181 182
}

183 184
/**
 * nm_dhcp4_config_get_options:
Dan Williams's avatar
Dan Williams committed
185
 * @config: a #NMDHCP4Config
186 187 188
 *
 * Gets all the options contained in the configuration.
 *
189
 * Returns: (transfer none) (element-type utf8 GObject.Value): the #GHashTable containing strings for keys and values.
190 191
 * This is the internal copy used by the configuration, and must not be modified.
 **/
192
GHashTable *
Dan Williams's avatar
Dan Williams committed
193
nm_dhcp4_config_get_options (NMDHCP4Config *config)
194
{
195
	g_return_val_if_fail (NM_IS_DHCP4_CONFIG (config), NULL);
196

197 198
	_nm_object_ensure_inited (NM_OBJECT (config));
	return NM_DHCP4_CONFIG_GET_PRIVATE (config)->options;
199 200
}

201 202
/**
 * nm_dhcp4_config_get_one_option:
Dan Williams's avatar
Dan Williams committed
203
 * @config: a #NMDHCP4Config
204 205 206 207 208 209 210
 * @option: the option to retrieve
 *
 * Gets one option by option name.
 *
 * Returns: the configuration option's value. This is the internal string used by the
 * configuration, and must not be modified.
 **/
211
const char *
Dan Williams's avatar
Dan Williams committed
212
nm_dhcp4_config_get_one_option (NMDHCP4Config *config, const char *option)
213
{
Dan Williams's avatar
Dan Williams committed
214
	g_return_val_if_fail (NM_IS_DHCP4_CONFIG (config), NULL);
215

Dan Williams's avatar
Dan Williams committed
216
	return g_hash_table_lookup (nm_dhcp4_config_get_options (config), option);
217
}