Patchwork [v2,07/27] qom: add property get/set wrappers for C types

login
register
mail settings
Submitter Paolo Bonzini
Date Feb. 4, 2012, 8:02 a.m.
Message ID <1328342577-25732-8-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/139550/
State New
Headers show

Comments

Paolo Bonzini - Feb. 4, 2012, 8:02 a.m.
Add wrappers that let you get/set properties using normal C data types.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/qemu/object.h |   70 +++++++++++++++++++++++++++++
 qom/object.c          |  119 +++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 180 insertions(+), 9 deletions(-)
Anthony Liguori - Feb. 6, 2012, 2:17 p.m.
On 02/04/2012 02:02 AM, Paolo Bonzini wrote:
> Add wrappers that let you get/set properties using normal C data types.
>
> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

> ---
>   include/qemu/object.h |   70 +++++++++++++++++++++++++++++
>   qom/object.c          |  119 +++++++++++++++++++++++++++++++++++++++++++++----
>   2 files changed, 180 insertions(+), 9 deletions(-)
>
> diff --git a/include/qemu/object.h b/include/qemu/object.h
> index ad7d32d..b27f80e 100644
> --- a/include/qemu/object.h
> +++ b/include/qemu/object.h
> @@ -622,6 +622,76 @@ void object_property_get(Object *obj, struct Visitor *v, const char *name,
>                            struct Error **errp);
>
>   /**
> + * object_property_set_str:
> + * @value: the value to be written to the property
> + * @name: the name of the property
> + * @errp: returns an error if this function fails
> + *
> + * Writes a string value to a property.
> + */
> +void object_property_set_str(Object *obj, const char *value,
> +                             const char *name, struct Error **errp);
> +
> +/**
> + * object_property_get_str:
> + * @obj: the object
> + * @name: the name of the property
> + * @errp: returns an error if this function fails
> + *
> + * Returns: the value of the property, converted to a C string, or NULL if
> + * an error occurs (including when the property value is not a string).
> + * The caller should free the string.
> + */
> +char *object_property_get_str(Object *obj, const char *name,
> +                              struct Error **errp);
> +
> +/**
> + * object_property_set_bool:
> + * @value: the value to be written to the property
> + * @name: the name of the property
> + * @errp: returns an error if this function fails
> + *
> + * Writes a bool value to a property.
> + */
> +void object_property_set_bool(Object *obj, bool value,
> +                              const char *name, struct Error **errp);
> +
> +/**
> + * object_property_get_bool:
> + * @obj: the object
> + * @name: the name of the property
> + * @errp: returns an error if this function fails
> + *
> + * Returns: the value of the property, converted to a boolean, or NULL if
> + * an error occurs (including when the property value is not a bool).
> + */
> +bool object_property_get_bool(Object *obj, const char *name,
> +                              struct Error **errp);
> +
> +/**
> + * object_property_set_int:
> + * @value: the value to be written to the property
> + * @name: the name of the property
> + * @errp: returns an error if this function fails
> + *
> + * Writes an integer value to a property.
> + */
> +void object_property_set_int(Object *obj, int64_t value,
> +                             const char *name, struct Error **errp);
> +
> +/**
> + * object_property_get_int:
> + * @obj: the object
> + * @name: the name of the property
> + * @errp: returns an error if this function fails
> + *
> + * Returns: the value of the property, converted to an integer, or NULL if
> + * an error occurs (including when the property value is not an integer).
> + */
> +int64_t object_property_get_int(Object *obj, const char *name,
> +                                struct Error **errp);
> +
> +/**
>    * object_property_set:
>    * @obj: the object
>    * @v: the visitor that will be used to write the property value.  This should
> diff --git a/qom/object.c b/qom/object.c
> index c0f6d54..d3a443f 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -14,6 +14,14 @@
>   #include "qemu-common.h"
>   #include "qapi/qapi-visit-core.h"
>
> +/* TODO: replace QObject with a simpler visitor to avoid a dependency
> + * of the QOM core on QObject?  */
> +#include "qemu/qom-qobject.h"
> +#include "qobject.h"
> +#include "qbool.h"
> +#include "qint.h"
> +#include "qstring.h"
> +
>   #define MAX_INTERFACES 32
>
>   typedef struct InterfaceImpl InterfaceImpl;
> @@ -646,6 +654,99 @@ void object_property_set(Object *obj, Visitor *v, const char *name,
>       }
>   }
>
> +void object_property_set_str(Object *obj, const char *value,
> +                             const char *name, Error **errp)
> +{
> +    QString *qstr = qstring_from_str(value);
> +    object_property_set_qobject(obj, QOBJECT(qstr), name, errp);
> +
> +    QDECREF(qstr);
> +}
> +
> +char *object_property_get_str(Object *obj, const char *name,
> +                              Error **errp)
> +{
> +    QObject *ret = object_property_get_qobject(obj, name, errp);
> +    QString *qstring;
> +    char *retval;
> +
> +    if (!ret) {
> +        return NULL;
> +    }
> +    qstring = qobject_to_qstring(ret);
> +    if (!qstring) {
> +        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "string");
> +        retval = NULL;
> +    } else {
> +        retval = g_strdup(qstring_get_str(qstring));
> +    }
> +
> +    QDECREF(qstring);
> +    return retval;
> +}
> +
> +void object_property_set_bool(Object *obj, bool value,
> +                              const char *name, Error **errp)
> +{
> +    QBool *qbool = qbool_from_int(value);
> +    object_property_set_qobject(obj, QOBJECT(qbool), name, errp);
> +
> +    QDECREF(qbool);
> +}
> +
> +bool object_property_get_bool(Object *obj, const char *name,
> +                              Error **errp)
> +{
> +    QObject *ret = object_property_get_qobject(obj, name, errp);
> +    QBool *qbool;
> +    bool retval;
> +
> +    if (!ret) {
> +        return false;
> +    }
> +    qbool = qobject_to_qbool(ret);
> +    if (!qbool) {
> +        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "boolean");
> +        retval = false;
> +    } else {
> +        retval = qbool_get_int(qbool);
> +    }
> +
> +    QDECREF(qbool);
> +    return retval;
> +}
> +
> +void object_property_set_int(Object *obj, int64_t value,
> +                             const char *name, Error **errp)
> +{
> +    QInt *qint = qint_from_int(value);
> +    object_property_set_qobject(obj, QOBJECT(qint), name, errp);
> +
> +    QDECREF(qint);
> +}
> +
> +int64_t object_property_get_int(Object *obj, const char *name,
> +                                Error **errp)
> +{
> +    QObject *ret = object_property_get_qobject(obj, name, errp);
> +    QInt *qint;
> +    int64_t retval;
> +
> +    if (!ret) {
> +        return -1;
> +    }
> +    qint = qobject_to_qint(ret);
> +    if (!qint) {
> +        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "int");
> +        retval = -1;
> +    } else {
> +        retval = qint_get_int(qint);
> +    }
> +
> +    QDECREF(qint);
> +    return retval;
> +}
> +
>   const char *object_property_get_type(Object *obj, const char *name, Error **errp)
>   {
>       ObjectProperty *prop = object_property_find(obj, name);
> @@ -927,8 +1028,8 @@ typedef struct StringProperty
>       void (*set)(Object *, const char *, Error **);
>   } StringProperty;
>
> -static void object_property_get_str(Object *obj, Visitor *v, void *opaque,
> -                                    const char *name, Error **errp)
> +static void property_get_str(Object *obj, Visitor *v, void *opaque,
> +                             const char *name, Error **errp)
>   {
>       StringProperty *prop = opaque;
>       char *value;
> @@ -940,8 +1041,8 @@ static void object_property_get_str(Object *obj, Visitor *v, void *opaque,
>       }
>   }
>
> -static void object_property_set_str(Object *obj, Visitor *v, void *opaque,
> -                                  const char *name, Error **errp)
> +static void property_set_str(Object *obj, Visitor *v, void *opaque,
> +                             const char *name, Error **errp)
>   {
>       StringProperty *prop = opaque;
>       char *value;
> @@ -957,8 +1058,8 @@ static void object_property_set_str(Object *obj, Visitor *v, void *opaque,
>       g_free(value);
>   }
>
> -static void object_property_release_str(Object *obj, const char *name,
> -                                      void *opaque)
> +static void property_release_str(Object *obj, const char *name,
> +                                 void *opaque)
>   {
>       StringProperty *prop = opaque;
>       g_free(prop);
> @@ -975,8 +1076,8 @@ void object_property_add_str(Object *obj, const char *name,
>       prop->set = set;
>
>       object_property_add(obj, name, "string",
> -                        get ? object_property_get_str : NULL,
> -                        set ? object_property_set_str : NULL,
> -                        object_property_release_str,
> +                        get ? property_get_str : NULL,
> +                        set ? property_set_str : NULL,
> +                        property_release_str,
>                           prop, errp);
>   }

Patch

diff --git a/include/qemu/object.h b/include/qemu/object.h
index ad7d32d..b27f80e 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -622,6 +622,76 @@  void object_property_get(Object *obj, struct Visitor *v, const char *name,
                          struct Error **errp);
 
 /**
+ * object_property_set_str:
+ * @value: the value to be written to the property
+ * @name: the name of the property
+ * @errp: returns an error if this function fails
+ *
+ * Writes a string value to a property.
+ */
+void object_property_set_str(Object *obj, const char *value,
+                             const char *name, struct Error **errp);
+
+/**
+ * object_property_get_str:
+ * @obj: the object
+ * @name: the name of the property
+ * @errp: returns an error if this function fails
+ *
+ * Returns: the value of the property, converted to a C string, or NULL if
+ * an error occurs (including when the property value is not a string).
+ * The caller should free the string.
+ */
+char *object_property_get_str(Object *obj, const char *name,
+                              struct Error **errp);
+
+/**
+ * object_property_set_bool:
+ * @value: the value to be written to the property
+ * @name: the name of the property
+ * @errp: returns an error if this function fails
+ *
+ * Writes a bool value to a property.
+ */
+void object_property_set_bool(Object *obj, bool value,
+                              const char *name, struct Error **errp);
+
+/**
+ * object_property_get_bool:
+ * @obj: the object
+ * @name: the name of the property
+ * @errp: returns an error if this function fails
+ *
+ * Returns: the value of the property, converted to a boolean, or NULL if
+ * an error occurs (including when the property value is not a bool).
+ */
+bool object_property_get_bool(Object *obj, const char *name,
+                              struct Error **errp);
+
+/**
+ * object_property_set_int:
+ * @value: the value to be written to the property
+ * @name: the name of the property
+ * @errp: returns an error if this function fails
+ *
+ * Writes an integer value to a property.
+ */
+void object_property_set_int(Object *obj, int64_t value,
+                             const char *name, struct Error **errp);
+
+/**
+ * object_property_get_int:
+ * @obj: the object
+ * @name: the name of the property
+ * @errp: returns an error if this function fails
+ *
+ * Returns: the value of the property, converted to an integer, or NULL if
+ * an error occurs (including when the property value is not an integer).
+ */
+int64_t object_property_get_int(Object *obj, const char *name,
+                                struct Error **errp);
+
+/**
  * object_property_set:
  * @obj: the object
  * @v: the visitor that will be used to write the property value.  This should
diff --git a/qom/object.c b/qom/object.c
index c0f6d54..d3a443f 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -14,6 +14,14 @@ 
 #include "qemu-common.h"
 #include "qapi/qapi-visit-core.h"
 
+/* TODO: replace QObject with a simpler visitor to avoid a dependency
+ * of the QOM core on QObject?  */
+#include "qemu/qom-qobject.h"
+#include "qobject.h"
+#include "qbool.h"
+#include "qint.h"
+#include "qstring.h"
+
 #define MAX_INTERFACES 32
 
 typedef struct InterfaceImpl InterfaceImpl;
@@ -646,6 +654,99 @@  void object_property_set(Object *obj, Visitor *v, const char *name,
     }
 }
 
+void object_property_set_str(Object *obj, const char *value,
+                             const char *name, Error **errp)
+{
+    QString *qstr = qstring_from_str(value);
+    object_property_set_qobject(obj, QOBJECT(qstr), name, errp);
+
+    QDECREF(qstr);
+}
+
+char *object_property_get_str(Object *obj, const char *name,
+                              Error **errp)
+{
+    QObject *ret = object_property_get_qobject(obj, name, errp);
+    QString *qstring;
+    char *retval;
+
+    if (!ret) {
+        return NULL;
+    }
+    qstring = qobject_to_qstring(ret);
+    if (!qstring) {
+        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "string");
+        retval = NULL;
+    } else {
+        retval = g_strdup(qstring_get_str(qstring));
+    }
+
+    QDECREF(qstring);
+    return retval;
+}
+
+void object_property_set_bool(Object *obj, bool value,
+                              const char *name, Error **errp)
+{
+    QBool *qbool = qbool_from_int(value);
+    object_property_set_qobject(obj, QOBJECT(qbool), name, errp);
+
+    QDECREF(qbool);
+}
+
+bool object_property_get_bool(Object *obj, const char *name,
+                              Error **errp)
+{
+    QObject *ret = object_property_get_qobject(obj, name, errp);
+    QBool *qbool;
+    bool retval;
+
+    if (!ret) {
+        return false;
+    }
+    qbool = qobject_to_qbool(ret);
+    if (!qbool) {
+        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "boolean");
+        retval = false;
+    } else {
+        retval = qbool_get_int(qbool);
+    }
+
+    QDECREF(qbool);
+    return retval;
+}
+
+void object_property_set_int(Object *obj, int64_t value,
+                             const char *name, Error **errp)
+{
+    QInt *qint = qint_from_int(value);
+    object_property_set_qobject(obj, QOBJECT(qint), name, errp);
+
+    QDECREF(qint);
+}
+
+int64_t object_property_get_int(Object *obj, const char *name,
+                                Error **errp)
+{
+    QObject *ret = object_property_get_qobject(obj, name, errp);
+    QInt *qint;
+    int64_t retval;
+
+    if (!ret) {
+        return -1;
+    }
+    qint = qobject_to_qint(ret);
+    if (!qint) {
+        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "int");
+        retval = -1;
+    } else {
+        retval = qint_get_int(qint);
+    }
+
+    QDECREF(qint);
+    return retval;
+}
+
 const char *object_property_get_type(Object *obj, const char *name, Error **errp)
 {
     ObjectProperty *prop = object_property_find(obj, name);
@@ -927,8 +1028,8 @@  typedef struct StringProperty
     void (*set)(Object *, const char *, Error **);
 } StringProperty;
 
-static void object_property_get_str(Object *obj, Visitor *v, void *opaque,
-                                    const char *name, Error **errp)
+static void property_get_str(Object *obj, Visitor *v, void *opaque,
+                             const char *name, Error **errp)
 {
     StringProperty *prop = opaque;
     char *value;
@@ -940,8 +1041,8 @@  static void object_property_get_str(Object *obj, Visitor *v, void *opaque,
     }
 }
 
-static void object_property_set_str(Object *obj, Visitor *v, void *opaque,
-                                  const char *name, Error **errp)
+static void property_set_str(Object *obj, Visitor *v, void *opaque,
+                             const char *name, Error **errp)
 {
     StringProperty *prop = opaque;
     char *value;
@@ -957,8 +1058,8 @@  static void object_property_set_str(Object *obj, Visitor *v, void *opaque,
     g_free(value);
 }
 
-static void object_property_release_str(Object *obj, const char *name,
-                                      void *opaque)
+static void property_release_str(Object *obj, const char *name,
+                                 void *opaque)
 {
     StringProperty *prop = opaque;
     g_free(prop);
@@ -975,8 +1076,8 @@  void object_property_add_str(Object *obj, const char *name,
     prop->set = set;
 
     object_property_add(obj, name, "string",
-                        get ? object_property_get_str : NULL,
-                        set ? object_property_set_str : NULL,
-                        object_property_release_str,
+                        get ? property_get_str : NULL,
+                        set ? property_set_str : NULL,
+                        property_release_str,
                         prop, errp);
 }