qdev: allow reusing get/set for legacy property

In some cases, a legacy property does need a special print method
but not a special parse method.  In this case, we can reuse the get/set
from the static (non-legacy) property.

If neither parse nor print is needed, though, do not register the
legacy property at all.  The previous patch ensures that the right
fallback will be used.

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2012-02-02 10:17:19 +01:00
parent d822979bdf
commit 68ee356941

View File

@ -550,21 +550,24 @@ static void qdev_set_legacy_property(Object *obj, Visitor *v, void *opaque,
* Do not use this is new code! Properties added through this interface will * Do not use this is new code! Properties added through this interface will
* be given names and types in the "legacy" namespace. * be given names and types in the "legacy" namespace.
* *
* Legacy properties are always processed as strings. The format of the string * Legacy properties are string versions of other OOM properties. The format
* depends on the property type. * of the string depends on the property type.
*/ */
void qdev_property_add_legacy(DeviceState *dev, Property *prop, void qdev_property_add_legacy(DeviceState *dev, Property *prop,
Error **errp) Error **errp)
{ {
gchar *name, *type; gchar *name, *type;
if (!prop->info->print && !prop->info->parse) {
return;
}
name = g_strdup_printf("legacy-%s", prop->name); name = g_strdup_printf("legacy-%s", prop->name);
type = g_strdup_printf("legacy<%s>", type = g_strdup_printf("legacy<%s>",
prop->info->legacy_name ?: prop->info->name); prop->info->legacy_name ?: prop->info->name);
object_property_add(OBJECT(dev), name, type, object_property_add(OBJECT(dev), name, type,
prop->info->print ? qdev_get_legacy_property : NULL, prop->info->print ? qdev_get_legacy_property : prop->info->get,
prop->info->parse ? qdev_set_legacy_property : NULL, prop->info->parse ? qdev_set_legacy_property : prop->info->set,
NULL, NULL,
prop, errp); prop, errp);