diff options
author | David Zeuthen <davidz@redhat.com> | 2006-10-10 00:51:27 -0400 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2006-10-10 00:51:27 -0400 |
commit | dbffafacbf7b9143d82547b9eabe61d1a5b8fffc (patch) | |
tree | 82bc00826beb6299e2692e6dca11e56b495ea1a2 /hald/device.c | |
parent | 1b5448d2f839f889da56d348990fdbcb0e6d038a (diff) | |
download | hal-dbffafacbf7b9143d82547b9eabe61d1a5b8fffc.tar.gz |
move property code into device object core
Diffstat (limited to 'hald/device.c')
-rw-r--r-- | hald/device.c | 309 |
1 files changed, 308 insertions, 1 deletions
diff --git a/hald/device.c b/hald/device.c index e258f1dc..15b0d8fb 100644 --- a/hald/device.c +++ b/hald/device.c @@ -33,11 +33,318 @@ #include "hald.h" #include "device.h" -#include "property.h" #include "hald_marshal.h" #include "logger.h" #include "hald_runner.h" + +struct _HalProperty { + int type; + union { + char *str_value; + dbus_int32_t int_value; + dbus_uint64_t uint64_value; + dbus_bool_t bool_value; + double double_value; + GSList *strlist_value; + } v; +}; +typedef struct _HalProperty HalProperty; + +static inline void +hal_property_free (HalProperty *prop) +{ + if (prop->type == HAL_PROPERTY_TYPE_STRING) { + g_free (prop->v.str_value); + } else if (prop->type == HAL_PROPERTY_TYPE_STRLIST) { + GSList *i; + for (i = prop->v.strlist_value; i != NULL; i = g_slist_next (i)) { + g_free (i->data); + } + g_slist_free (prop->v.strlist_value); + } + g_free (prop); +} + +static inline HalProperty * +hal_property_new (int type) +{ + HalProperty *prop; + prop = g_new0 (HalProperty, 1); + prop->type = type; + return prop; +} + +static inline int +hal_property_get_type (HalProperty *prop) +{ + g_return_val_if_fail (prop != NULL, HAL_PROPERTY_TYPE_INVALID); + return prop->type; +} + +static inline const char * +hal_property_get_string (HalProperty *prop) +{ + g_return_val_if_fail (prop != NULL, NULL); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRING, NULL); + return prop->v.str_value; +} + +static inline dbus_int32_t +hal_property_get_int (HalProperty *prop) +{ + g_return_val_if_fail (prop != NULL, -1); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_INT32, -1); + return prop->v.int_value; +} + +static inline dbus_uint64_t +hal_property_get_uint64 (HalProperty *prop) +{ + g_return_val_if_fail (prop != NULL, -1); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_UINT64, -1); + return prop->v.uint64_value; +} + +static inline dbus_bool_t +hal_property_get_bool (HalProperty *prop) +{ + g_return_val_if_fail (prop != NULL, FALSE); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_BOOLEAN, FALSE); + return prop->v.bool_value; +} + +static inline GSList * +hal_property_get_strlist (HalProperty *prop) +{ + g_return_val_if_fail (prop != NULL, NULL); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, NULL); + + return prop->v.strlist_value; +} + +static inline char * +hal_property_to_string (HalProperty *prop) +{ + g_return_val_if_fail (prop != NULL, NULL); + + switch (prop->type) { + case HAL_PROPERTY_TYPE_STRING: + return g_strdup (prop->v.str_value); + case HAL_PROPERTY_TYPE_INT32: + return g_strdup_printf ("%d", prop->v.int_value); + case HAL_PROPERTY_TYPE_UINT64: + return g_strdup_printf ("%llu", (long long unsigned int) prop->v.uint64_value); + case HAL_PROPERTY_TYPE_BOOLEAN: + /* FIXME: Maybe use 1 and 0 here instead? */ + return g_strdup (prop->v.bool_value ? "true" : "false"); + case HAL_PROPERTY_TYPE_DOUBLE: + return g_strdup_printf ("%f", prop->v.double_value); + case HAL_PROPERTY_TYPE_STRLIST: + { + GSList *iter; + guint i; + char buf[256]; + + i = 0; + buf[0] = '\0'; + for (iter = hal_property_get_strlist (prop); + iter != NULL && i < sizeof(buf); + iter = g_slist_next (iter)) { + guint len; + const char *str; + + str = (const char *) iter->data; + len = strlen (str); + strncpy (buf + i, str, sizeof(buf) - i); + i += len; + + if (g_slist_next (iter) != NULL && i < sizeof(buf)) { + buf[i] = '\t'; + i++; + } + } + return g_strdup (buf); + } + + default: + return NULL; + } +} + +static inline double +hal_property_get_double (HalProperty *prop) +{ + g_return_val_if_fail (prop != NULL, -1.0); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_DOUBLE, -1.0); + + return prop->v.double_value; +} + +static inline void +hal_property_set_string (HalProperty *prop, const char *value) +{ + char *endchar; + gboolean validated = TRUE; + + g_return_if_fail (prop != NULL); + g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_STRING || + prop->type == HAL_PROPERTY_TYPE_INVALID); + + prop->type = HAL_PROPERTY_TYPE_STRING; + if (prop->v.str_value != NULL) + g_free (prop->v.str_value); + prop->v.str_value = g_strdup (value); + + while (!g_utf8_validate (prop->v.str_value, -1, + (const char **) &endchar)) { + validated = FALSE; + *endchar = '?'; + } + + if (!validated) { + HAL_WARNING (("Property has invalid UTF-8 string '%s'", value)); + } +} + +static inline void +hal_property_set_int (HalProperty *prop, dbus_int32_t value) +{ + g_return_if_fail (prop != NULL); + g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_INT32 || + prop->type == HAL_PROPERTY_TYPE_INVALID); + prop->type = HAL_PROPERTY_TYPE_INT32; + prop->v.int_value = value; +} + +static inline void +hal_property_set_uint64 (HalProperty *prop, dbus_uint64_t value) +{ + g_return_if_fail (prop != NULL); + g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_UINT64 || + prop->type == HAL_PROPERTY_TYPE_INVALID); + prop->type = HAL_PROPERTY_TYPE_UINT64; + prop->v.uint64_value = value; +} + +static inline void +hal_property_set_bool (HalProperty *prop, dbus_bool_t value) +{ + g_return_if_fail (prop != NULL); + g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_BOOLEAN || + prop->type == HAL_PROPERTY_TYPE_INVALID); + prop->type = HAL_PROPERTY_TYPE_BOOLEAN; + prop->v.bool_value = value; +} + +static inline void +hal_property_set_double (HalProperty *prop, double value) +{ + g_return_if_fail (prop != NULL); + g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_DOUBLE || + prop->type == HAL_PROPERTY_TYPE_INVALID); + prop->type = HAL_PROPERTY_TYPE_DOUBLE; + prop->v.double_value = value; +} + +static inline gboolean +hal_property_strlist_append (HalProperty *prop, const char *value) +{ + g_return_val_if_fail (prop != NULL, FALSE); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE); + + prop->v.strlist_value = g_slist_append (prop->v.strlist_value, g_strdup (value)); + + return TRUE; +} + +static inline gboolean +hal_property_strlist_prepend (HalProperty *prop, const char *value) +{ + g_return_val_if_fail (prop != NULL, FALSE); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE); + + prop->v.strlist_value = g_slist_prepend (prop->v.strlist_value, g_strdup (value)); + + return TRUE; +} + +static inline gboolean +hal_property_strlist_remove_elem (HalProperty *prop, guint index) +{ + GSList *elem; + + g_return_val_if_fail (prop != NULL, FALSE); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE); + + if (prop->v.strlist_value == NULL) + return FALSE; + + elem = g_slist_nth (prop->v.strlist_value, index); + if (elem == NULL) + return FALSE; + + g_free (elem->data); + prop->v.strlist_value = g_slist_delete_link (prop->v.strlist_value, elem); + return TRUE; +} + + +static inline gboolean +hal_property_strlist_add (HalProperty *prop, const char *value) +{ + GSList *elem; + + g_return_val_if_fail (prop != NULL, FALSE); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE); + + for (elem = prop->v.strlist_value; elem != NULL; elem = g_slist_next (elem)) { + if (strcmp (elem->data, value) == 0) { + return FALSE; + } + } + + return hal_property_strlist_append (prop, value); +} + +static inline gboolean +hal_property_strlist_remove (HalProperty *prop, const char *value) +{ + guint i; + GSList *elem; + + g_return_val_if_fail (prop != NULL, FALSE); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE); + + for (elem = prop->v.strlist_value, i = 0; elem != NULL; elem = g_slist_next (elem), i++) { + if (strcmp (elem->data, value) == 0) { + return hal_property_strlist_remove_elem (prop, i); + } + } + + return FALSE; +} + +static inline gboolean +hal_property_strlist_clear (HalProperty *prop) +{ + GSList *elem; + + g_return_val_if_fail (prop != NULL, FALSE); + g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE); + + for (elem = prop->v.strlist_value; elem != NULL; elem = g_slist_next (elem)) { + g_free (elem->data); + } + g_slist_free (prop->v.strlist_value); + + return FALSE; +} + + + +/****************************************************************************************************************/ + static GObjectClass *parent_class; struct _HalDevicePrivate |