Files
NetworkManager/libnm-glib/nm-types.c
Michael Biebl d7940bcb9b Rename private nm_* functions to _nm_*
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4012 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-08-26 09:34:31 +00:00

257 lines
5.6 KiB
C

#include <glib.h>
#include <dbus/dbus-glib.h>
#include <string.h>
#include "nm-types.h"
#include "nm-types-private.h"
#include "nm-object-private.h"
#include "nm-object-cache.h"
#include "nm-dbus-glib-types.h"
static gpointer
nm_ssid_copy (GByteArray *src)
{
GByteArray *dest;
dest = g_byte_array_sized_new (src->len);
g_byte_array_append (dest, src->data, src->len);
return dest;
}
static void
nm_ssid_free (GByteArray *ssid)
{
g_byte_array_free (ssid, TRUE);
}
GType
nm_ssid_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type = g_boxed_type_register_static (g_intern_static_string ("nm-ssid"),
(GBoxedCopyFunc) nm_ssid_copy,
(GBoxedFreeFunc) nm_ssid_free);
return our_type;
}
gboolean
_nm_ssid_demarshal (GValue *value, GByteArray **dest)
{
GByteArray *array;
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_UCHAR_ARRAY))
return FALSE;
if (*dest) {
g_boxed_free (NM_TYPE_SSID, *dest);
*dest = NULL;
}
array = (GByteArray *) g_value_get_boxed (value);
if (array && (array->len > 0)) {
*dest = g_byte_array_sized_new (array->len);
(*dest)->len = array->len;
memcpy ((*dest)->data, array->data, array->len);
}
return TRUE;
}
/*****************************/
static gpointer
nm_uint_array_copy (GArray *src)
{
GArray *dest;
dest = g_array_sized_new (FALSE, TRUE, sizeof (guint32), src->len);
g_array_append_vals (dest, src->data, src->len);
return dest;
}
static void
nm_uint_array_free (GArray *array)
{
g_array_free (array, TRUE);
}
GType
nm_uint_array_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type = g_boxed_type_register_static (g_intern_static_string ("nm-uint-array"),
(GBoxedCopyFunc) nm_uint_array_copy,
(GBoxedFreeFunc) nm_uint_array_free);
return our_type;
}
gboolean
_nm_uint_array_demarshal (GValue *value, GArray **dest)
{
GArray *array;
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_UINT_ARRAY))
return FALSE;
if (*dest) {
g_boxed_free (NM_TYPE_UINT_ARRAY, *dest);
*dest = NULL;
}
array = (GArray *) g_value_get_boxed (value);
if (array && (array->len > 0)) {
*dest = g_array_sized_new (FALSE, TRUE, sizeof (guint32), array->len);
g_array_append_vals (*dest, array->data, array->len);
}
return TRUE;
}
/*****************************/
static gpointer
nm_string_array_copy (GPtrArray *src)
{
GPtrArray *dest;
int i;
dest = g_ptr_array_sized_new (src->len);
for (i = 0; i < src->len; i++)
g_ptr_array_add (dest, g_strdup (g_ptr_array_index (src, i)));
return dest;
}
static void
nm_string_array_free (GPtrArray *array)
{
int i;
for (i = 0; i < array->len; i++)
g_free (g_ptr_array_index (array, i));
g_ptr_array_free (array, TRUE);
}
GType
nm_string_array_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type = g_boxed_type_register_static (g_intern_static_string ("nm-string-array"),
(GBoxedCopyFunc) nm_string_array_copy,
(GBoxedFreeFunc) nm_string_array_free);
return our_type;
}
gboolean
_nm_string_array_demarshal (GValue *value, GPtrArray **dest)
{
GPtrArray *array;
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_STRING))
return FALSE;
if (*dest) {
g_boxed_free (NM_TYPE_STRING_ARRAY, *dest);
*dest = NULL;
}
array = (GPtrArray *) g_value_get_boxed (value);
if (array && array->len) {
int i;
*dest = g_ptr_array_sized_new (array->len);
for (i = 0; i < array->len; i++)
g_ptr_array_add (*dest, g_strdup (g_ptr_array_index (array, i)));
}
return TRUE;
}
/*****************************/
static gpointer
nm_object_array_copy (GPtrArray *src)
{
GPtrArray *dest;
int i;
dest = g_ptr_array_sized_new (src->len);
for (i = 0; i < src->len; i++)
g_ptr_array_add (dest, g_object_ref (g_ptr_array_index (src, i)));
return dest;
}
static void
nm_object_array_free (GPtrArray *array)
{
int i;
for (i = 0; i < array->len; i++)
g_object_unref (g_ptr_array_index (array, i));
g_ptr_array_free (array, TRUE);
}
GType
nm_object_array_get_type (void)
{
static GType our_type = 0;
if (our_type == 0)
our_type = g_boxed_type_register_static (g_intern_static_string ("nm-object-array"),
(GBoxedCopyFunc) nm_object_array_copy,
(GBoxedFreeFunc) nm_object_array_free);
return our_type;
}
gboolean
_nm_object_array_demarshal (GValue *value,
GPtrArray **dest,
DBusGConnection *connection,
NMObjectCreatorFunc func)
{
GPtrArray *temp = NULL;
GPtrArray *array;
if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH))
return FALSE;
array = (GPtrArray *) g_value_get_boxed (value);
if (array && array->len) {
int i;
temp = g_ptr_array_sized_new (array->len);
for (i = 0; i < array->len; i++) {
const char *path;
GObject *object;
path = g_ptr_array_index (array, i);
object = G_OBJECT (_nm_object_cache_get (path));
if (object) {
g_ptr_array_add (temp, g_object_ref (object));
} else {
object = (*func) (connection, path);
if (object)
g_ptr_array_add (temp, object);
else
g_warning ("%s: couldn't create object for %s", __func__, path);
}
}
} else
temp = g_ptr_array_new ();
/* Deallocate after to ensure that an object that might already
* be in the array doesn't get destroyed due to refcounting.
*/
if (*dest)
g_boxed_free (NM_TYPE_OBJECT_ARRAY, *dest);
*dest = temp;
return TRUE;
}