diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2011-12-12 14:29:42 -0600 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2011-12-15 09:20:49 -0600 |
commit | 6a146eba33159cb97d28457d409d81066cbefb09 (patch) | |
tree | 272555e4ad8544561d44616cbe52ba5a91101c49 | |
parent | ad6d45fa0837acf3e8cab323ee5b08e05a9410a5 (diff) | |
download | qemu-6a146eba33159cb97d28457d409d81066cbefb09.zip qemu-6a146eba33159cb97d28457d409d81066cbefb09.tar.gz qemu-6a146eba33159cb97d28457d409d81066cbefb09.tar.bz2 |
qom: add string property type
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | hw/qdev.c | 59 | ||||
-rw-r--r-- | hw/qdev.h | 22 |
2 files changed, 81 insertions, 0 deletions
@@ -1449,3 +1449,62 @@ DeviceState *qdev_resolve_path(const char *path, bool *ambiguous) return dev; } +typedef struct StringProperty +{ + char *(*get)(DeviceState *, Error **); + void (*set)(DeviceState *, const char *, Error **); +} StringProperty; + +static void qdev_property_get_str(DeviceState *dev, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + StringProperty *prop = opaque; + char *value; + + value = prop->get(dev, errp); + if (value) { + visit_type_str(v, &value, name, errp); + g_free(value); + } +} + +static void qdev_property_set_str(DeviceState *dev, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + StringProperty *prop = opaque; + char *value; + Error *local_err = NULL; + + visit_type_str(v, &value, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + prop->set(dev, value, errp); + g_free(value); +} + +static void qdev_property_release_str(DeviceState *dev, const char *name, + void *opaque) +{ + StringProperty *prop = opaque; + g_free(prop); +} + +void qdev_property_add_str(DeviceState *dev, const char *name, + char *(*get)(DeviceState *, Error **), + void (*set)(DeviceState *, const char *, Error **), + Error **errp) +{ + StringProperty *prop = g_malloc0(sizeof(*prop)); + + prop->get = get; + prop->set = set; + + qdev_property_add(dev, name, "string", + get ? qdev_property_get_str : NULL, + set ? qdev_property_set_str : NULL, + qdev_property_release_str, + prop, errp); +} @@ -574,4 +574,26 @@ void qdev_property_add_link(DeviceState *dev, const char *name, const char *type, DeviceState **child, Error **errp); +/** + * @qdev_property_add_str + * + * Add a string property using getters/setters. This function will add a + * property of type 'string'. + * + * @dev - the device to add a property to + * + * @name - the name of the property + * + * @get - the getter or NULL if the property is write-only. This function must + * return a string to be freed by @g_free(). + * + * @set - the setter or NULL if the property is read-only + * + * @errp - if an error occurs, a pointer to an area to store the error + */ +void qdev_property_add_str(DeviceState *dev, const char *name, + char *(*get)(DeviceState *, Error **), + void (*set)(DeviceState *, const char *, Error **), + Error **errp); + #endif |