Patchwork [v2,06/27] qom: add QObject-based property get/set wrappers

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

Comments

Paolo Bonzini - Feb. 4, 2012, 8:02 a.m.
Move the creation of QmpInputVisitor and QmpOutputVisitor from
qmp.c to qom/object.c, since it's the only practical way to access
object properties.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/qemu/qom-qobject.h |   43 +++++++++++++++++++++++++++++++++++++++++++
 qmp.c                      |   18 +++---------------
 qom/Makefile               |    2 +-
 qom/qom-qobject.c          |   44 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 91 insertions(+), 16 deletions(-)
 create mode 100644 include/qemu/qom-qobject.h
 create mode 100644 qom/qom-qobject.c
Anthony Liguori - Feb. 6, 2012, 2:16 p.m.
On 02/04/2012 02:02 AM, Paolo Bonzini wrote:
> Move the creation of QmpInputVisitor and QmpOutputVisitor from
> qmp.c to qom/object.c, since it's the only practical way to access
> object properties.
>
> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>

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

As long as we keep this isolated such that it's easy to remove.  At some point, 
we need to remove all usage of QObject in the tree and replace it with GVariant.

Regards,

Anthony Liguori
Paolo Bonzini - Feb. 7, 2012, 9:12 a.m.
On 02/06/2012 03:16 PM, Anthony Liguori wrote:
>
>> Move the creation of QmpInputVisitor and QmpOutputVisitor from
>> qmp.c to qom/object.c, since it's the only practical way to access
>> object properties.
>>
>> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>
>
> Reluctantly-Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Fair enough, thanks very much.  :)

> As long as we keep this isolated such that it's easy to remove.  At some
> point, we need to remove all usage of QObject in the tree and replace it
> with GVariant.

Agreed, we'll revisit after Luiz completes QAPI.

Paolo
Luiz Capitulino - Feb. 8, 2012, 12:29 p.m.
On Tue, 07 Feb 2012 10:12:34 +0100
Paolo Bonzini <pbonzini@redhat.com> wrote:

> On 02/06/2012 03:16 PM, Anthony Liguori wrote:
> >
> >> Move the creation of QmpInputVisitor and QmpOutputVisitor from
> >> qmp.c to qom/object.c, since it's the only practical way to access
> >> object properties.
> >>
> >> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>
> >
> > Reluctantly-Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
> 
> Fair enough, thanks very much.  :)
> 
> > As long as we keep this isolated such that it's easy to remove.  At some
> > point, we need to remove all usage of QObject in the tree and replace it
> > with GVariant.
> 
> Agreed, we'll revisit after Luiz completes QAPI.

Commands are not far away. Events are still missing, although they could be
converted along with the introduction of GVariant.

Patch

diff --git a/include/qemu/qom-qobject.h b/include/qemu/qom-qobject.h
new file mode 100644
index 0000000..9094eef
--- /dev/null
+++ b/include/qemu/qom-qobject.h
@@ -0,0 +1,42 @@ 
+/*
+ * QEMU Object Model - QObject wrappers
+ *
+ * Copyright (C) 2012 Red Hat, Inc.
+ *
+ * Author: Paolo Bonzini <pbonzini@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_QOM_QOBJECT_H
+#define QEMU_QOM_QOBJECT_H
+
+#include "qemu/object.h"
+
+/*
+ * object_property_get_qobject:
+ * @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 QObject, or NULL if
+ * an error occurs.
+ */
+struct QObject *object_property_get_qobject(Object *obj, const char *name,
+                                            struct Error **errp);
+
+/**
+ * object_property_set_qobject:
+ * @obj: the object
+ * @ret: The value that will be written to the property.
+ * @name: the name of the property
+ * @errp: returns an error if this function fails
+ *
+ * Writes a property to a object.
+ */
+void object_property_set_qobject(Object *obj, struct QObject *qobj,
+                                 const char *name, struct Error **errp);
+
+#endif
diff --git a/qmp.c b/qmp.c
index 45052cc..1f64844 100644
--- a/qmp.c
+++ b/qmp.c
@@ -21,9 +21,8 @@ 
 #include "kvm.h"
 #include "arch_init.h"
 #include "hw/qdev.h"
-#include "qapi/qmp-input-visitor.h"
-#include "qapi/qmp-output-visitor.h"
 #include "blockdev.h"
+#include "qemu/qom-qobject.h"
 
 NameInfo *qmp_query_name(Error **errp)
 {
@@ -198,7 +197,6 @@  int qmp_qom_set(Monitor *mon, const QDict *qdict, QObject **ret)
     const char *property = qdict_get_str(qdict, "property");
     QObject *value = qdict_get(qdict, "value");
     Error *local_err = NULL;
-    QmpInputVisitor *mi;
     Object *obj;
 
     obj = object_resolve_path(path, NULL);
@@ -207,10 +205,7 @@  int qmp_qom_set(Monitor *mon, const QDict *qdict, QObject **ret)
         goto out;
     }
 
-    mi = qmp_input_visitor_new(value);
-    object_property_set(obj, qmp_input_get_visitor(mi), property, &local_err);
-
-    qmp_input_visitor_cleanup(mi);
+    object_property_set_qobject(obj, value, property, &local_err);
 
 out:
     if (local_err) {
@@ -227,7 +222,6 @@  int qmp_qom_get(Monitor *mon, const QDict *qdict, QObject **ret)
     const char *path = qdict_get_str(qdict, "path");
     const char *property = qdict_get_str(qdict, "property");
     Error *local_err = NULL;
-    QmpOutputVisitor *mo;
     Object *obj;
 
     obj = object_resolve_path(path, NULL);
@@ -236,13 +230,7 @@  int qmp_qom_get(Monitor *mon, const QDict *qdict, QObject **ret)
         goto out;
     }
 
-    mo = qmp_output_visitor_new();
-    object_property_get(obj, qmp_output_get_visitor(mo), property, &local_err);
-    if (!local_err) {
-        *ret = qmp_output_get_qobject(mo);
-    }
-
-    qmp_output_visitor_cleanup(mo);
+    *ret = object_property_get_qobject(obj, property, &local_err);
 
 out:
     if (local_err) {
diff --git a/qom/Makefile b/qom/Makefile
index f33f0be..885a263 100644
--- a/qom/Makefile
+++ b/qom/Makefile
@@ -1 +1 @@ 
-qom-y = object.o container.o
+qom-y = object.o container.o qom-qobject.o
diff --git a/qom/qom-qobject.c b/qom/qom-qobject.c
new file mode 100644
index 0000000..90375b0
--- /dev/null
+++ b/qom/qom-qobject.c
@@ -0,0 +1,44 @@ 
+/*
+ * QEMU Object Model - QObject wrappers
+ *
+ * Copyright (C) 2012 Red Hat, Inc.
+ *
+ * Author: Paolo Bonzini <pbonzini@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu-common.h"
+#include "qemu/object.h"
+#include "qemu/qom-qobject.h"
+#include "qapi/qapi-visit-core.h"
+#include "qapi/qmp-input-visitor.h"
+#include "qapi/qmp-output-visitor.h"
+
+void object_property_set_qobject(Object *obj, QObject *value,
+                                 const char *name, Error **errp)
+{
+    QmpInputVisitor *mi;
+    mi = qmp_input_visitor_new(value);
+    object_property_set(obj, qmp_input_get_visitor(mi), name, errp);
+
+    qmp_input_visitor_cleanup(mi);
+}
+
+QObject *object_property_get_qobject(Object *obj, const char *name,
+                                     Error **errp)
+{
+    QObject *ret = NULL;
+    Error *local_err = NULL;
+    QmpOutputVisitor *mo;
+
+    mo = qmp_output_visitor_new();
+    object_property_get(obj, qmp_output_get_visitor(mo), name, &local_err);
+    if (!local_err) {
+        ret = qmp_output_get_qobject(mo);
+    }
+    error_propagate(errp, local_err);
+    qmp_output_visitor_cleanup(mo);
+    return ret;
+}