18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * device.c : HalDevice 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 <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "device.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald_marshal.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald_runner.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic GObjectClass *parent_class;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemenum {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PROPERTY_CHANGED,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem CAPABILITY_ADDED,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem CALLOUTS_FINISHED,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem CANCELLED,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LAST_SIGNAL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic guint signals[LAST_SIGNAL] = { 0 };
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HALD_MEMLEAK_DBG
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint dbg_hal_device_object_delta = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_finalize (GObject *obj)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *device = HAL_DEVICE (obj);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem runner_device_finalized (device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HALD_MEMLEAK_DBG
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbg_hal_device_object_delta--;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("************* in finalize for udi=%s\n", device->udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_slist_foreach (device->properties, (GFunc) hal_property_free, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems g_slist_free (device->properties);
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (device->udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (parent_class->finalize)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent_class->finalize (obj);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_class_init (HalDeviceClass *klass)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GObjectClass *obj_class = (GObjectClass *) klass;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent_class = g_type_class_peek_parent (klass);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem obj_class->finalize = hal_device_finalize;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem signals[PROPERTY_CHANGED] =
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_new ("property_changed",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_FROM_CLASS (klass),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_SIGNAL_RUN_LAST,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_STRUCT_OFFSET (HalDeviceClass,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem property_changed),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hald_marshal_VOID__STRING_BOOL_BOOL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_NONE, 3,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_STRING,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_BOOLEAN,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_BOOLEAN);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem signals[CAPABILITY_ADDED] =
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_new ("capability_added",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_FROM_CLASS (klass),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_SIGNAL_RUN_LAST,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_STRUCT_OFFSET (HalDeviceClass,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem capability_added),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hald_marshal_VOID__STRING,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_NONE, 1,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_STRING);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem signals[CALLOUTS_FINISHED] =
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_new ("callouts_finished",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_FROM_CLASS (klass),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_SIGNAL_RUN_LAST,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_STRUCT_OFFSET (HalDeviceClass,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callouts_finished),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hald_marshal_VOID__VOID,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_NONE, 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem signals[CANCELLED] =
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_new ("cancelled",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_FROM_CLASS (klass),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_SIGNAL_RUN_LAST,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_STRUCT_OFFSET (HalDeviceClass,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem cancelled),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hald_marshal_VOID__VOID,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_TYPE_NONE, 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_init (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static int temp_device_counter = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->udi = g_strdup_printf ("/org/freedesktop/Hal/devices/temp/%d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem temp_device_counter++);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->num_addons = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->num_addons_ready = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemGType
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_get_type (void)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static GType type = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static GTypeInfo type_info = {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sizeof (HalDeviceClass),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (GClassInitFunc) hal_device_class_init,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sizeof (HalDevice),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (GInstanceInitFunc) hal_device_init,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem };
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem type = g_type_register_static (G_TYPE_OBJECT,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "HalDevice",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &type_info,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_new (void)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *device;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device = g_object_new (HAL_TYPE_DEVICE, NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HALD_MEMLEAK_DBG
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbg_hal_device_object_delta++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return device;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Merge all properties from source where the key starts with
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * source_namespace and put them onto target replacing source_namespace
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * with target_namespace
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param target Device to put properties onto
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param source Device to retrieve properties from
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param target_namespace Replace source namespace with this namespace
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param source_namespace Source namespace that property keys must match
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_merge_with_rewrite (HalDevice *target,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *source,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *target_namespace,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *source_namespace)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem size_t source_ns_len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem source_ns_len = strlen (source_namespace);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* doesn't handle info.capabilities */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* device_property_atomic_update_begin (); */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = source->properties; iter != NULL; iter = iter->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *p = iter->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int target_type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *target_key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key = hal_property_get_key (p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* only care about properties that match source namespace */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strncmp(key, source_namespace, source_ns_len) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target_key = g_strdup_printf("%s%s", target_namespace,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key+source_ns_len);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem type = hal_property_get_type (p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* only remove target if it exists with a different type */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target_type = hal_device_property_get_type (target, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (target_type != HAL_PROPERTY_TYPE_INVALID && target_type != type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_remove (target, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, target_key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_string (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, target_key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_int (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_uint64 (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, target_key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_uint64 (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, target_key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_bool (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_double (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, target_key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_double (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_WARNING (("Unknown property type %d", type));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (target_key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* device_property_atomic_update_end (); */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_merge (HalDevice *target, HalDevice *source)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *caps;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* device_property_atomic_update_begin (); */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = source->properties; iter != NULL; iter = iter->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *p = iter->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int target_type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key = hal_property_get_key (p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem type = hal_property_get_type (p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* handle info.capabilities in a special way */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (key, "info.capabilities") == 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* only remove target if it exists with a different type */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target_type = hal_device_property_get_type (target, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (target_type != HAL_PROPERTY_TYPE_INVALID && target_type != type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_remove (target, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_string (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_int (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_uint64 (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_uint64 (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_bool (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_double (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem target, key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_double (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_WARNING (("Unknown property type %d", type));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* device_property_atomic_update_end (); */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem caps = hal_device_property_get_strlist (source, "info.capabilities");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = caps; iter != NULL; iter = iter->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!hal_device_has_capability (target, iter->data))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_add_capability (target, iter->data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_matches (HalDevice *device1, HalDevice *device2,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *namespace)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = strlen (namespace);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = device1->properties; iter != NULL; iter = iter->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p = (HalProperty *) iter->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key = hal_property_get_key (p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem type = hal_property_get_type (p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strncmp (key, namespace, len) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!hal_device_has_property (device2, key))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (hal_property_get_string (p),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_string (device2,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key)) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_int (p) !=
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_int (device2, key))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_uint64 (p) !=
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_uint64 (device2, key))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_bool (p) !=
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_bool (device2, key))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_double (p) !=
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_double (device2, key))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_WARNING (("Unknown property type %d", type));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_get_udi (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return device->udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_set_udi (HalDevice *device, const char *udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (device->udi != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (device->udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->udi = g_strdup (udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_add_capability (HalDevice *device, const char *capability)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_property_strlist_add (device, "info.capabilities", capability))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[CAPABILITY_ADDED], 0, capability);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_has_capability (HalDevice *device, const char *capability)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *caps;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean matched = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem caps = hal_device_property_get_strlist (device, "info.capabilities");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (caps == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = caps; iter != NULL; iter = iter->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (iter->data, capability) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem matched = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return matched;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_has_property (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_device_property_find (device, key) != NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_num_properties (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return g_slist_length (device->properties);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalProperty *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_find (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = device->properties; iter != NULL; iter = iter->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *p = iter->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (hal_property_get_key (p), key) == 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_to_string (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_to_string (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_foreach (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevicePropertyForeachFn callback,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (device != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_if_fail (callback != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = device->properties; iter != NULL; iter = iter->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *p = iter->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean cont;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem cont = callback (device, p, user_data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (cont == FALSE)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_type (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, HAL_PROPERTY_TYPE_INVALID);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, HAL_PROPERTY_TYPE_INVALID);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_get_type (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return HAL_PROPERTY_TYPE_INVALID;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_string (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_get_string (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_as_string (HalDevice *device, const char *key, char *buf, size_t bufsize)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (buf != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (hal_property_get_type (prop)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy (buf, hal_property_get_string (prop), bufsize);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf (buf, bufsize, "%d", hal_property_get_int (prop));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf (buf, bufsize, "%llu", (long long unsigned int) hal_property_get_uint64 (prop));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf (buf, bufsize, "%f", hal_property_get_double (prop));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy (buf, hal_property_get_bool (prop) ? "true" : "false", bufsize);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRLIST:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* print out as "\tval1\tval2\val3\t" */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (bufsize > 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[0] = '\t';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem i = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = hal_property_get_strlist (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem iter != NULL && i < bufsize;
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, bufsize - i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem i += len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (i < bufsize) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[i] = '\t';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem i++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return buf;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem buf[0] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdbus_int32_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_int (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_get_int (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return -1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdbus_uint64_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_uint64 (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_get_uint64 (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return -1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdbus_bool_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_bool (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_get_bool (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdouble
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_double (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, -1.0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, -1.0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_get_double (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return -1.0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_set_string (HalDevice *device, const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_STRING)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't bother setting the same value */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (value != NULL &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strcmp (hal_property_get_string (prop), value) == 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_set_string (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_string (key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_set_int (HalDevice *device, const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_int32_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_INT32)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't bother setting the same value */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_int (prop) == value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_set_int (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_int (key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_set_uint64 (HalDevice *device, const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint64_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_UINT64)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't bother setting the same value */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_uint64 (prop) == value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_set_uint64 (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_uint64 (key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_set_bool (HalDevice *device, const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_BOOLEAN)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't bother setting the same value */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_bool (prop) == value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_set_bool (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_bool (key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_set_double (HalDevice *device, const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem double value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_DOUBLE)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't bother setting the same value */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_double (prop) == value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_set_double (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_double (key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_copy_property (HalDevice *from_device, const char *from, HalDevice *to_device, const char *to)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean rc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rc = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_has_property (from_device, from)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (hal_device_property_get_type (from_device, from)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rc = hal_device_property_set_string (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem to_device, to, hal_device_property_get_string (from_device, from));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rc = hal_device_property_set_int (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem to_device, to, hal_device_property_get_int (from_device, from));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rc = hal_device_property_set_uint64 (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem to_device, to, hal_device_property_get_uint64 (from_device, from));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rc = hal_device_property_set_bool (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem to_device, to, hal_device_property_get_bool (from_device, from));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rc = hal_device_property_set_double (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem to_device, to, hal_device_property_get_double (from_device, from));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return rc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_remove (HalDevice *device, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_remove (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_free (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, TRUE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_set_attribute (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem enum PropertyAttribute attr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean val)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_print (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "device udi = %s\n", hal_device_get_udi (device));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (iter = device->properties; iter != NULL; iter = iter->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *p = iter->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key = hal_property_get_key (p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem type = hal_property_get_type (p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, " %s = '%s' (string)\n", key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_string (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, " %s = %d 0x%x (int)\n", key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_int (p),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_int (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, " %s = %llu 0x%llx (uint64)\n", key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (long long unsigned int) hal_property_get_uint64 (p),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (long long unsigned int) hal_property_get_uint64 (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, " %s = %g (double)\n", key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_get_double (p));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case HAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, " %s = %s (bool)\n", key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (hal_property_get_bool (p) ? "true" :
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "false"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_WARNING (("Unknown property type %d", type));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemtypedef struct {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *device;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDeviceAsyncCallback callback;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer user_data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint prop_signal_id;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint timeout_id;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem} AsyncMatchInfo;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdestroy_async_match_info (AsyncMatchInfo *ai)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (ai->key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_handler_disconnect (ai->device, ai->prop_signal_id);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_source_remove (ai->timeout_id);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_object_unref (ai->device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (ai);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemprop_changed_cb (HalDevice *device, const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean removed, gboolean added, gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem AsyncMatchInfo *ai = user_data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (key, ai->key) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* the property is no longer there */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (removed)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto cleanup;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai->callback (ai->device, ai->user_data, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemcleanup:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem destroy_async_match_info (ai);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemasync_wait_timeout (gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem AsyncMatchInfo *ai = (AsyncMatchInfo *) user_data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai->callback (ai->device, ai->user_data, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem destroy_async_match_info (ai);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_async_wait_property (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDeviceAsyncCallback callback,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer user_data,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int timeout)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem AsyncMatchInfo *ai;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL || timeout==0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem callback (device, user_data, prop != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai = g_new0 (AsyncMatchInfo, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai->device = g_object_ref (device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai->key = g_strdup (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai->callback = callback;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai->user_data = user_data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai->prop_signal_id = g_signal_connect (device, "property_changed",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem G_CALLBACK (prop_changed_cb),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ai->timeout_id = g_timeout_add (timeout, async_wait_timeout, ai);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_callouts_finished (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[CALLOUTS_FINISHED], 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Used when giving up on a device, e.g. if no device file appeared
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_cancel (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("udi=%s", device->udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[CANCELLED], 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemGSList *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_strlist (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (device != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_return_val_if_fail (key != NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return hal_property_get_strlist (prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_get_strlist_elem (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint index)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *strlist;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strlist = hal_device_property_get_strlist (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlist == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem i = g_slist_nth (strlist, index);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (i == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (const char *) i->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_strlist_append (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_STRLIST)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_strlist_append (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_strlist (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_strlist_append (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_strlist_prepend (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_STRLIST)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_strlist_prepend (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_strlist (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_strlist_prepend (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_strlist_remove_elem (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint index)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_STRLIST)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_strlist_remove_elem (prop, index)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_strlist_clear (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_strlist (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_STRLIST)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_strlist_clear (prop)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_strlist_add (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_STRLIST)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = hal_property_strlist_add (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (res) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_property_new_strlist (key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_property_strlist_prepend (prop, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->properties = g_slist_prepend (device->properties, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem res = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return res;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_strlist_remove (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalProperty *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if property already exists */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = hal_device_property_find (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_get_type (prop) != HAL_PROPERTY_TYPE_STRLIST)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_property_strlist_remove (prop, value)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_signal_emit (device, signals[PROPERTY_CHANGED], 0,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem key, FALSE, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_property_strlist_is_empty (HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *strlist;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ( hal_device_has_property (device, key)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strlist = hal_device_property_get_strlist (device, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlist == NULL )
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (g_slist_length (strlist) > 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_inc_num_addons (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->num_addons++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_inc_num_ready_addons (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_are_all_addons_ready (device)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("In hal_device_inc_num_ready_addons for udi=%s but all addons are already ready!",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device->num_addons_ready++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_device_are_all_addons_ready (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (device->num_addons_ready == device->num_addons) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}