mirror of https://github.com/xemu-project/xemu.git
object: add object_property_set_default
Add a default value to ObjectProperty and an implementation of ObjectPropertyInit that uses it. This will make it easier to show the default in help messages. Also provide convenience functions object_property_set_default_{bool, str, int, uint}(). Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20200110153039.1379601-11-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
164c374b75
commit
0e76ed0a5d
|
@ -378,6 +378,7 @@ struct ObjectProperty
|
|||
ObjectPropertyRelease *release;
|
||||
ObjectPropertyInit *init;
|
||||
void *opaque;
|
||||
QObject *defval;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1055,6 +1056,42 @@ ObjectProperty *object_class_property_add(ObjectClass *klass, const char *name,
|
|||
ObjectPropertyRelease *release,
|
||||
void *opaque, Error **errp);
|
||||
|
||||
/**
|
||||
* object_property_set_default_bool:
|
||||
* @prop: the property to set
|
||||
* @value: the value to be written to the property
|
||||
*
|
||||
* Set the property default value.
|
||||
*/
|
||||
void object_property_set_default_bool(ObjectProperty *prop, bool value);
|
||||
|
||||
/**
|
||||
* object_property_set_default_str:
|
||||
* @prop: the property to set
|
||||
* @value: the value to be written to the property
|
||||
*
|
||||
* Set the property default value.
|
||||
*/
|
||||
void object_property_set_default_str(ObjectProperty *prop, const char *value);
|
||||
|
||||
/**
|
||||
* object_property_set_default_int:
|
||||
* @prop: the property to set
|
||||
* @value: the value to be written to the property
|
||||
*
|
||||
* Set the property default value.
|
||||
*/
|
||||
void object_property_set_default_int(ObjectProperty *prop, int64_t value);
|
||||
|
||||
/**
|
||||
* object_property_set_default_uint:
|
||||
* @prop: the property to set
|
||||
* @value: the value to be written to the property
|
||||
*
|
||||
* Set the property default value.
|
||||
*/
|
||||
void object_property_set_default_uint(ObjectProperty *prop, uint64_t value);
|
||||
|
||||
/**
|
||||
* object_property_find:
|
||||
* @obj: the object
|
||||
|
|
48
qom/object.c
48
qom/object.c
|
@ -19,8 +19,10 @@
|
|||
#include "qapi/visitor.h"
|
||||
#include "qapi/string-input-visitor.h"
|
||||
#include "qapi/string-output-visitor.h"
|
||||
#include "qapi/qobject-input-visitor.h"
|
||||
#include "qapi/qapi-builtin-visit.h"
|
||||
#include "qapi/qmp/qerror.h"
|
||||
#include "qapi/qmp/qjson.h"
|
||||
#include "trace.h"
|
||||
|
||||
/* TODO: replace QObject with a simpler visitor to avoid a dependency
|
||||
|
@ -268,6 +270,10 @@ static void object_property_free(gpointer data)
|
|||
{
|
||||
ObjectProperty *prop = data;
|
||||
|
||||
if (prop->defval) {
|
||||
qobject_unref(prop->defval);
|
||||
prop->defval = NULL;
|
||||
}
|
||||
g_free(prop->name);
|
||||
g_free(prop->type);
|
||||
g_free(prop->description);
|
||||
|
@ -1438,6 +1444,45 @@ int64_t object_property_get_int(Object *obj, const char *name,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static void object_property_init_defval(Object *obj, ObjectProperty *prop)
|
||||
{
|
||||
Visitor *v = qobject_input_visitor_new(prop->defval);
|
||||
|
||||
assert(prop->set != NULL);
|
||||
prop->set(obj, v, prop->name, prop->opaque, &error_abort);
|
||||
|
||||
visit_free(v);
|
||||
}
|
||||
|
||||
static void object_property_set_default(ObjectProperty *prop, QObject *defval)
|
||||
{
|
||||
assert(!prop->defval);
|
||||
assert(!prop->init);
|
||||
|
||||
prop->defval = defval;
|
||||
prop->init = object_property_init_defval;
|
||||
}
|
||||
|
||||
void object_property_set_default_bool(ObjectProperty *prop, bool value)
|
||||
{
|
||||
object_property_set_default(prop, QOBJECT(qbool_from_bool(value)));
|
||||
}
|
||||
|
||||
void object_property_set_default_str(ObjectProperty *prop, const char *value)
|
||||
{
|
||||
object_property_set_default(prop, QOBJECT(qstring_from_str(value)));
|
||||
}
|
||||
|
||||
void object_property_set_default_int(ObjectProperty *prop, int64_t value)
|
||||
{
|
||||
object_property_set_default(prop, QOBJECT(qnum_from_int(value)));
|
||||
}
|
||||
|
||||
void object_property_set_default_uint(ObjectProperty *prop, uint64_t value)
|
||||
{
|
||||
object_property_set_default(prop, QOBJECT(qnum_from_uint(value)));
|
||||
}
|
||||
|
||||
void object_property_set_uint(Object *obj, uint64_t value,
|
||||
const char *name, Error **errp)
|
||||
{
|
||||
|
@ -2549,6 +2594,9 @@ void object_property_add_alias(Object *obj, const char *name,
|
|||
goto out;
|
||||
}
|
||||
op->resolve = property_resolve_alias;
|
||||
if (target_prop->defval) {
|
||||
op->defval = qobject_ref(target_prop->defval);
|
||||
}
|
||||
|
||||
object_property_set_description(obj, op->name,
|
||||
target_prop->description,
|
||||
|
|
Loading…
Reference in New Issue