qom: add QObject-based property get/set wrappers
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. 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. Reviewed-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
b46d9b1082
commit
9f5f135058
42
include/qemu/qom-qobject.h
Normal file
42
include/qemu/qom-qobject.h
Normal file
@ -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
|
18
qmp.c
18
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) {
|
||||
|
@ -1 +1 @@
|
||||
qom-y = object.o container.o
|
||||
qom-y = object.o container.o qom-qobject.o
|
||||
|
44
qom/qom-qobject.c
Normal file
44
qom/qom-qobject.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user