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


Reply via email to