On 23/02/18 22:33, Paolo Bonzini wrote: > On 22/02/2018 06:00, Alexey Kardashevskiy wrote: >> There is already 'device-list-properties' which does most of the job, >> however it does not handle everything returned by qom-list-types such >> as machines as they inherit directly from TYPE_OBJECT and not TYPE_DEVICE. >> >> This adds a new qom-list-properties command which prints properties >> of a specific class and its instance. It is pretty much a simplified copy >> of the device-list-properties handler. >> >> Since it creates an object instance, device properties should appear >> in the output as they are copied to QOM properties at the instance_init >> hook. >> >> Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> >> --- >> >> This is a simple rebase on top of the current upstream. >> >> >> --- >> qapi-schema.json | 29 +++++++++++++++++++++++++++++ >> qmp.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 81 insertions(+) >> >> diff --git a/qapi-schema.json b/qapi-schema.json >> index 0262b9f..fa5f189 100644 >> --- a/qapi-schema.json >> +++ b/qapi-schema.json >> @@ -1455,6 +1455,35 @@ >> 'returns': [ 'DevicePropertyInfo' ] } >> >> ## >> +# @QOMPropertyInfo: >> +# >> +# Information about object properties. >> +# >> +# @name: the name of the property >> +# @type: the typename of the property >> +# @description: if specified, the description of the property. >> +# >> +# Since: 2.12 >> +## >> +{ 'struct': 'QOMPropertyInfo', >> + 'data': { 'name': 'str', 'type': 'str', '*description': 'str' } } >> + >> +## >> +# @qom-list-properties: >> +# >> +# List properties associated with a QOM object. >> +# >> +# @typename: the type name of an object >> +# >> +# Returns: a list of QOMPropertyInfo describing object properties >> +# >> +# Since: 2.12 >> +## >> +{ 'command': 'qom-list-properties', >> + 'data': { 'typename': 'str'}, >> + 'returns': [ 'QOMPropertyInfo' ] } >> + >> +## >> # @xen-set-global-dirty-log: >> # >> # Enable or disable the global dirty log mode. >> diff --git a/qmp.c b/qmp.c >> index 793f6f3..f2d4781 100644 >> --- a/qmp.c >> +++ b/qmp.c >> @@ -576,6 +576,58 @@ DevicePropertyInfoList >> *qmp_device_list_properties(const char *typename, >> return prop_list; >> } >> >> +QOMPropertyInfoList *qmp_qom_list_properties(const char *typename, >> + Error **errp) >> +{ >> + ObjectClass *klass; >> + Object *obj; >> + ObjectProperty *prop; >> + ObjectPropertyIterator iter; >> + QOMPropertyInfoList *prop_list = NULL; >> + >> + klass = object_class_by_name(typename); >> + if (klass == NULL) { >> + error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND, >> + "Class '%s' not found", typename); >> + return NULL; >> + } >> + >> + klass = object_class_dynamic_cast(klass, TYPE_OBJECT); >> + if (klass == NULL) { >> + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename", >> TYPE_OBJECT); >> + return NULL; >> + } >> + >> + if (object_class_is_abstract(klass)) { >> + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename", >> + "non-abstract class"); > > This sucks, it would be nice to enumerate properties on base classes. We > could list class properties only. However, it can be improved later. > > Queued, thanks.
Wait, adding abstract classes support seems very easy, I'll post v2 in a few minutes. -- Alexey