From 269e09f3fc922b800d118d9c8a721be46b5462a3 Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Thu, 16 Jan 2014 17:34:38 +0100 Subject: add optional 2nd stage initialization to -object/object-add commands Introduces USER_CREATABLE interface that must be implemented by objects which are designed to created with -object CLI option or object-add QMP command. Interface provides an ability to do an optional second stage initialization of the object created with -object/object-add commands. By providing complete() callback, which is called after the object properties were set. It allows to: * prevents misusing of -object/object-add by filtering out objects that are not designed for it. * generalize second stage backend initialization instead of adding custom APIs to perform it * early error detection of backend initialization at -object/ object-add time rather than through a proxy DEVICE object that tries to use backend. Signed-off-by: Igor Mammedov Reviewed-by: Stefan Hajnoczi Signed-off-by: Luiz Capitulino --- qmp.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'qmp.c') diff --git a/qmp.c b/qmp.c index a67e0c4539..d0d98e777b 100644 --- a/qmp.c +++ b/qmp.c @@ -27,6 +27,7 @@ #include "qapi/qmp/qobject.h" #include "qapi/qmp-input-visitor.h" #include "hw/boards.h" +#include "qom/object_interfaces.h" NameInfo *qmp_query_name(Error **errp) { @@ -554,6 +555,17 @@ void object_add(const char *type, const char *id, const QDict *qdict, } } + if (!object_dynamic_cast(obj, TYPE_USER_CREATABLE)) { + error_setg(&local_err, "object '%s' isn't supported by object-add", + id); + goto out; + } + + user_creatable_complete(obj, &local_err); + if (local_err) { + goto out; + } + object_property_add_child(container_get(object_get_root(), "/objects"), id, obj, &local_err); out: -- cgit v1.2.1