xref: /qemu/include/qom/object_interfaces.h (revision 269e09f3fc922b800d118d9c8a721be46b5462a3)
1*269e09f3SIgor Mammedov #ifndef OBJECT_INTERFACES_H
2*269e09f3SIgor Mammedov #define OBJECT_INTERFACES_H
3*269e09f3SIgor Mammedov 
4*269e09f3SIgor Mammedov #include "qom/object.h"
5*269e09f3SIgor Mammedov 
6*269e09f3SIgor Mammedov #define TYPE_USER_CREATABLE "user-creatable"
7*269e09f3SIgor Mammedov 
8*269e09f3SIgor Mammedov #define USER_CREATABLE_CLASS(klass) \
9*269e09f3SIgor Mammedov      OBJECT_CLASS_CHECK(UserCreatableClass, (klass), \
10*269e09f3SIgor Mammedov                         TYPE_USER_CREATABLE)
11*269e09f3SIgor Mammedov #define USER_CREATABLE_GET_CLASS(obj) \
12*269e09f3SIgor Mammedov      OBJECT_GET_CLASS(UserCreatableClass, (obj), \
13*269e09f3SIgor Mammedov                       TYPE_USER_CREATABLE)
14*269e09f3SIgor Mammedov #define USER_CREATABLE(obj) \
15*269e09f3SIgor Mammedov      INTERFACE_CHECK(UserCreatable, (obj), \
16*269e09f3SIgor Mammedov                      TYPE_USER_CREATABLE)
17*269e09f3SIgor Mammedov 
18*269e09f3SIgor Mammedov 
19*269e09f3SIgor Mammedov typedef struct UserCreatable {
20*269e09f3SIgor Mammedov     /* <private> */
21*269e09f3SIgor Mammedov     Object Parent;
22*269e09f3SIgor Mammedov } UserCreatable;
23*269e09f3SIgor Mammedov 
24*269e09f3SIgor Mammedov /**
25*269e09f3SIgor Mammedov  * UserCreatableClass:
26*269e09f3SIgor Mammedov  * @parent_class: the base class
27*269e09f3SIgor Mammedov  * @complete: callback to be called after @obj's properties are set.
28*269e09f3SIgor Mammedov  *
29*269e09f3SIgor Mammedov  * Interface is designed to work with -object/object-add/object_add
30*269e09f3SIgor Mammedov  * commands.
31*269e09f3SIgor Mammedov  * Interface is mandatory for objects that are designed to be user
32*269e09f3SIgor Mammedov  * creatable (i.e. -object/object-add/object_add, will accept only
33*269e09f3SIgor Mammedov  * objects that inherit this interface).
34*269e09f3SIgor Mammedov  *
35*269e09f3SIgor Mammedov  * Interface also provides an optional ability to do the second
36*269e09f3SIgor Mammedov  * stage * initialization of the object after its properties were
37*269e09f3SIgor Mammedov  * set.
38*269e09f3SIgor Mammedov  *
39*269e09f3SIgor Mammedov  * For objects created without using -object/object-add/object_add,
40*269e09f3SIgor Mammedov  * @user_creatable_complete() wrapper should be called manually if
41*269e09f3SIgor Mammedov  * object's type implements USER_CREATABLE interface and needs
42*269e09f3SIgor Mammedov  * complete() callback to be called.
43*269e09f3SIgor Mammedov  */
44*269e09f3SIgor Mammedov typedef struct UserCreatableClass {
45*269e09f3SIgor Mammedov     /* <private> */
46*269e09f3SIgor Mammedov     InterfaceClass parent_class;
47*269e09f3SIgor Mammedov 
48*269e09f3SIgor Mammedov     /* <public> */
49*269e09f3SIgor Mammedov     void (*complete)(UserCreatable *uc, Error **errp);
50*269e09f3SIgor Mammedov } UserCreatableClass;
51*269e09f3SIgor Mammedov 
52*269e09f3SIgor Mammedov /**
53*269e09f3SIgor Mammedov  * user_creatable_complete:
54*269e09f3SIgor Mammedov  * @obj: the object whose complete() method is called if defined
55*269e09f3SIgor Mammedov  * @errp: if an error occurs, a pointer to an area to store the error
56*269e09f3SIgor Mammedov  *
57*269e09f3SIgor Mammedov  * Wrapper to call complete() method if one of types it's inherited
58*269e09f3SIgor Mammedov  * from implements USER_CREATABLE interface, otherwise the call does
59*269e09f3SIgor Mammedov  * nothing.
60*269e09f3SIgor Mammedov  */
61*269e09f3SIgor Mammedov void user_creatable_complete(Object *obj, Error **errp);
62*269e09f3SIgor Mammedov #endif
63