18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * property.c : HalProperty methods
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2003 David Zeuthen, <david@fubar.dk>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2004 Novell, Inc.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is free software; you can redistribute it and/or modify
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * it under the terms of the GNU General Public License as published by
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the Free Software Foundation; either version 2 of the License, or
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * (at your option) any later version.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is distributed in the hope that it will be useful,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * but WITHOUT ANY WARRANTY; without even the implied warranty of
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * GNU General Public License for more details.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You should have received a copy of the GNU General Public License
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * along with this program; if not, write to the Free Software
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_CONFIG_H
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# include <config.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <glib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "property.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstruct _HalProperty {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem union {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *str_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_int32_t int_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint64_t uint64_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t bool_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem double double_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *strlist_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } v;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean readonly;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean persistence;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean callout;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_free (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (prop->key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop->type == HAL_PROPERTY_TYPE_STRING) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (prop->v.str_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (prop->type == HAL_PROPERTY_TYPE_STRLIST) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = prop->v.strlist_value; i != NULL; i = g_slist_next (i)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (i->data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_slist_free (prop->v.strlist_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalProperty *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_new_string (const char *key, const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *endchar;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean validated = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = g_new0 (HalProperty, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_STRING;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->key = g_strdup (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.str_value = g_strdup (value != NULL ? value : "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (!g_utf8_validate (prop->v.str_value, -1,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (const char **) &endchar)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem validated = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *endchar = '?';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!validated) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_WARNING (("Key '%s' has invalid UTF-8 string '%s'",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, prop->v.str_value));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalProperty *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_new_int (const char *key, dbus_int32_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = g_new0 (HalProperty, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_INT32;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->key = g_strdup (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.int_value = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalProperty *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_new_uint64 (const char *key, dbus_uint64_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = g_new0 (HalProperty, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_UINT64;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->key = g_strdup (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.uint64_value = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalProperty *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_new_bool (const char *key, dbus_bool_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = g_new0 (HalProperty, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_BOOLEAN;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->key = g_strdup (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.bool_value = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalProperty *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_new_double (const char *key, double value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = g_new0 (HalProperty, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_DOUBLE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->key = g_strdup (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.double_value = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_key (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_type (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, HAL_PROPERTY_TYPE_INVALID);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_string (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRING, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->v.str_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdbus_int32_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_int (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_INT32, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->v.int_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdbus_uint64_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_uint64 (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_UINT64, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->v.uint64_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdbus_bool_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_bool (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_BOOLEAN, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->v.bool_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_to_string (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (prop->type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return g_strdup (prop->v.str_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return g_strdup_printf ("%d", prop->v.int_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return g_strdup_printf ("%llu", (long long unsigned int) prop->v.uint64_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* FIXME: Maybe use 1 and 0 here instead? */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return g_strdup (prop->v.bool_value ? "true" : "false");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return g_strdup_printf ("%f", prop->v.double_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRLIST:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char buf[256];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem i = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[0] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = hal_property_get_strlist (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem iter != NULL && i < sizeof(buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem iter = g_slist_next (iter)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *str;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem str = (const char *) iter->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = strlen (str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy (buf + i, str, sizeof(buf) - i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem i += len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (g_slist_next (iter) != NULL && i < sizeof(buf)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[i] = '\t';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem i++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return g_strdup (buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdouble
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_double (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, -1.0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_DOUBLE, -1.0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->v.double_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_set_string (HalProperty *prop, const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *endchar;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean validated = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_STRING ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type == HAL_PROPERTY_TYPE_INVALID);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_STRING;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop->v.str_value != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (prop->v.str_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.str_value = g_strdup (value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (!g_utf8_validate (prop->v.str_value, -1,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (const char **) &endchar)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem validated = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *endchar = '?';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!validated) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_WARNING (("Key '%s' has invalid UTF-8 string '%s'",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->key, value));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_set_int (HalProperty *prop, dbus_int32_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_INT32 ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type == HAL_PROPERTY_TYPE_INVALID);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_INT32;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.int_value = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_set_uint64 (HalProperty *prop, dbus_uint64_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_UINT64 ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type == HAL_PROPERTY_TYPE_INVALID);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_UINT64;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.uint64_value = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_set_bool (HalProperty *prop, dbus_bool_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_BOOLEAN ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type == HAL_PROPERTY_TYPE_INVALID);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_BOOLEAN;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.bool_value = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_set_double (HalProperty *prop, double value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop->type == HAL_PROPERTY_TYPE_DOUBLE ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type == HAL_PROPERTY_TYPE_INVALID);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_DOUBLE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.double_value = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_set_attribute (HalProperty *prop,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem enum PropertyAttribute attr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean val)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (prop != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (attr) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case READONLY:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->readonly = val;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case PERSISTENCE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->persistence = val;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case CALLOUT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->callout = val;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_attribute (HalProperty *prop,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem enum PropertyAttribute attr)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (attr) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case READONLY:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->readonly;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case PERSISTENCE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->persistence;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case CALLOUT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->callout;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return -1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalProperty *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_new_strlist (const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = g_new0 (HalProperty, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->type = HAL_PROPERTY_TYPE_STRLIST;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->key = g_strdup (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.strlist_value = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemGSList *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_get_strlist (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return prop->v.strlist_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_strlist_append (HalProperty *prop, const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.strlist_value = g_slist_append (prop->v.strlist_value, g_strdup (value));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_strlist_prepend (HalProperty *prop, const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.strlist_value = g_slist_prepend (prop->v.strlist_value, g_strdup (value));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_strlist_remove_elem (HalProperty *prop, guint index)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *elem;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop->v.strlist_value == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem elem = g_slist_nth (prop->v.strlist_value, index);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (elem == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (elem->data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop->v.strlist_value = g_slist_delete_link (prop->v.strlist_value, elem);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_strlist_add (HalProperty *prop, const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *elem;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (elem = prop->v.strlist_value; elem != NULL; elem = g_slist_next (elem)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (elem->data, value) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_strlist_append (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_strlist_remove (HalProperty *prop, const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *elem;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (elem = prop->v.strlist_value, i = 0; elem != NULL; elem = g_slist_next (elem), i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (elem->data, value) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_strlist_remove_elem (prop, i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_property_strlist_clear (HalProperty *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *elem;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (prop->type == HAL_PROPERTY_TYPE_STRLIST, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (elem = prop->v.strlist_value; elem != NULL; elem = g_slist_next (elem)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (elem->data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_slist_free (prop->v.strlist_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}