We have helper functions to easily expose integers as QOM object properties. However, these are read only.
This patch makes the getter function world accessible and adds a generic setter for integer properties. We can use these later with the generic object_property_add to not dupliate simple logic all over the place. Signed-off-by: Alexander Graf <ag...@suse.de> --- include/qom/property.h | 128 +++++++++++++++++++++++++++++++++++++++++++++++++ qom/property.c | 14 +++++- 2 files changed, 140 insertions(+), 2 deletions(-) diff --git a/include/qom/property.h b/include/qom/property.h index bb09523..470c722 100644 --- a/include/qom/property.h +++ b/include/qom/property.h @@ -63,6 +63,38 @@ void object_property_add_uint8_ptr(Object *obj, const char *name, const uint8_t *v, Error **errp); /** + * object_property_get_uint8_ptr: + * @obj: the object to get the property from + * @v: visitor to the property + * @opaque: pointer to the integer value we write the result to + * @name: name of the property + * @errp: if an error occurs, a pointer to an area to store the error + * + * Visitor function to read an integer value of type 'uint8' into the visitor. + * Use this as the 'get' argument in object_property_add if your field is a + * uint8_t value. + */ +void object_property_get_uint8_ptr(Object *obj, struct Visitor *v, + void *opaque, const char *name, + Error **errp); + +/** + * object_property_set_uint8_ptr: + * @obj: the object to set the property in + * @v: visitor to the property + * @opaque: pointer to the integer value + * @name: name of the property + * @errp: if an error occurs, a pointer to an area to store the error + * + * Visitor function to set an integer value of type 'uint8' to a given value. + * Use this as the 'set' argument in object_property_add if your field is a + * uint8_t value. + */ +void object_property_set_uint8_ptr(Object *obj, struct Visitor *v, + void *opaque, const char *name, + Error **errp); + +/** * object_property_add_uint16_ptr: * @obj: the object to add a property to * @name: the name of the property @@ -76,6 +108,38 @@ void object_property_add_uint16_ptr(Object *obj, const char *name, const uint16_t *v, Error **errp); /** + * object_property_get_uint16_ptr: + * @obj: the object to get the property from + * @v: visitor to the property + * @opaque: pointer to the integer value we write the result to + * @name: name of the property + * @errp: if an error occurs, a pointer to an area to store the error + * + * Visitor function to read an integer value of type 'uint16' into the visitor. + * Use this as the 'get' argument in object_property_add if your field is a + * uint16_t value. + */ +void object_property_get_uint16_ptr(Object *obj, struct Visitor *v, + void *opaque, const char *name, + Error **errp); + +/** + * object_property_set_uint16_ptr: + * @obj: the object to set the property in + * @v: visitor to the property + * @opaque: pointer to the integer value + * @name: name of the property + * @errp: if an error occurs, a pointer to an area to store the error + * + * Visitor function to set an integer value of type 'uint16' to a given value. + * Use this as the 'set' argument in object_property_add if your field is a + * uint16_t value. + */ +void object_property_set_uint16_ptr(Object *obj, struct Visitor *v, + void *opaque, const char *name, + Error **errp); + +/** * object_property_add_uint32_ptr: * @obj: the object to add a property to * @name: the name of the property @@ -89,6 +153,38 @@ void object_property_add_uint32_ptr(Object *obj, const char *name, const uint32_t *v, Error **errp); /** + * object_property_get_uint32_ptr: + * @obj: the object to get the property from + * @v: visitor to the property + * @opaque: pointer to the integer value we write the result to + * @name: name of the property + * @errp: if an error occurs, a pointer to an area to store the error + * + * Visitor function to read an integer value of type 'uint32' into the visitor. + * Use this as the 'get' argument in object_property_add if your field is a + * uint32_t value. + */ +void object_property_get_uint32_ptr(Object *obj, struct Visitor *v, + void *opaque, const char *name, + Error **errp); + +/** + * object_property_set_uint32_ptr: + * @obj: the object to set the property in + * @v: visitor to the property + * @opaque: pointer to the integer value + * @name: name of the property + * @errp: if an error occurs, a pointer to an area to store the error + * + * Visitor function to set an integer value of type 'uint32' to a given value. + * Use this as the 'set' argument in object_property_add if your field is a + * uint32_t value. + */ +void object_property_set_uint32_ptr(Object *obj, struct Visitor *v, + void *opaque, const char *name, + Error **errp); + +/** * object_property_add_uint64_ptr: * @obj: the object to add a property to * @name: the name of the property @@ -101,4 +197,36 @@ void object_property_add_uint32_ptr(Object *obj, const char *name, void object_property_add_uint64_ptr(Object *obj, const char *name, const uint64_t *v, Error **Errp); +/** + * object_property_get_uint64_ptr: + * @obj: the object to get the property from + * @v: visitor to the property + * @opaque: pointer to the integer value we write the result to + * @name: name of the property + * @errp: if an error occurs, a pointer to an area to store the error + * + * Visitor function to read an integer value of type 'uint64' into the visitor. + * Use this as the 'get' argument in object_property_add if your field is a + * uint64_t value. + */ +void object_property_get_uint64_ptr(Object *obj, struct Visitor *v, + void *opaque, const char *name, + Error **errp); + +/** + * object_property_set_uint64_ptr: + * @obj: the object to set the property in + * @v: visitor to the property + * @opaque: pointer to the integer value + * @name: name of the property + * @errp: if an error occurs, a pointer to an area to store the error + * + * Visitor function to set an integer value of type 'uint64' to a given value. + * Use this as the 'set' argument in object_property_add if your field is a + * uint64_t value. + */ +void object_property_set_uint64_ptr(Object *obj, struct Visitor *v, + void *opaque, const char *name, + Error **errp); + #endif /* !QEMU_PROPERTY_H */ diff --git a/qom/property.c b/qom/property.c index 944daff..b4f27e9 100644 --- a/qom/property.c +++ b/qom/property.c @@ -153,7 +153,7 @@ void object_property_add_bool(Object *obj, const char *name, #define DECLARE_PROP_SET_GET(name, valtype) \ \ -static void glue(glue(property_get_,name),_ptr)(Object *obj, Visitor *v, \ +void glue(glue(object_property_get_,name),_ptr)(Object *obj, Visitor *v, \ void *opaque, \ const char *name, \ Error **errp) \ @@ -162,11 +162,21 @@ static void glue(glue(property_get_,name),_ptr)(Object *obj, Visitor *v, \ glue(visit_type_,name)(v, &value, name, errp); \ } \ \ +void glue(glue(object_property_set_,name),_ptr)(Object *obj, Visitor *v, \ + void *opaque, \ + const char *name, \ + Error **errp) \ +{ \ + valtype value; \ + glue(visit_type_,name)(v, &value, name, errp); \ + *(valtype *)opaque = value; \ +} \ + \ void glue(glue(object_property_add_,name),_ptr)(Object *obj, const char *name, \ const valtype *v, \ Error **errp) \ { \ - ObjectPropertyAccessor *get = glue(glue(property_get_,name),_ptr); \ + ObjectPropertyAccessor *get = glue(glue(object_property_get_,name),_ptr); \ object_property_add(obj, name, stringify(name), get, NULL, NULL, (void *)v,\ errp); \ } \ -- 1.8.1.4