1269e09f3SIgor Mammedov #ifndef OBJECT_INTERFACES_H 2269e09f3SIgor Mammedov #define OBJECT_INTERFACES_H 3269e09f3SIgor Mammedov 4269e09f3SIgor Mammedov #include "qom/object.h" 5*90998d58SDaniel P. Berrange #include "qapi/qmp/qdict.h" 6*90998d58SDaniel P. Berrange #include "qapi/visitor.h" 7269e09f3SIgor Mammedov 8269e09f3SIgor Mammedov #define TYPE_USER_CREATABLE "user-creatable" 9269e09f3SIgor Mammedov 10269e09f3SIgor Mammedov #define USER_CREATABLE_CLASS(klass) \ 11269e09f3SIgor Mammedov OBJECT_CLASS_CHECK(UserCreatableClass, (klass), \ 12269e09f3SIgor Mammedov TYPE_USER_CREATABLE) 13269e09f3SIgor Mammedov #define USER_CREATABLE_GET_CLASS(obj) \ 14269e09f3SIgor Mammedov OBJECT_GET_CLASS(UserCreatableClass, (obj), \ 15269e09f3SIgor Mammedov TYPE_USER_CREATABLE) 16269e09f3SIgor Mammedov #define USER_CREATABLE(obj) \ 17269e09f3SIgor Mammedov INTERFACE_CHECK(UserCreatable, (obj), \ 18269e09f3SIgor Mammedov TYPE_USER_CREATABLE) 19269e09f3SIgor Mammedov 20269e09f3SIgor Mammedov 21269e09f3SIgor Mammedov typedef struct UserCreatable { 22269e09f3SIgor Mammedov /* <private> */ 23269e09f3SIgor Mammedov Object Parent; 24269e09f3SIgor Mammedov } UserCreatable; 25269e09f3SIgor Mammedov 26269e09f3SIgor Mammedov /** 27269e09f3SIgor Mammedov * UserCreatableClass: 28269e09f3SIgor Mammedov * @parent_class: the base class 29269e09f3SIgor Mammedov * @complete: callback to be called after @obj's properties are set. 30d6edb155SLin Ma * @can_be_deleted: callback to be called before an object is removed 31d6edb155SLin Ma * to check if @obj can be removed safely. 32269e09f3SIgor Mammedov * 33269e09f3SIgor Mammedov * Interface is designed to work with -object/object-add/object_add 34269e09f3SIgor Mammedov * commands. 35269e09f3SIgor Mammedov * Interface is mandatory for objects that are designed to be user 36269e09f3SIgor Mammedov * creatable (i.e. -object/object-add/object_add, will accept only 37269e09f3SIgor Mammedov * objects that inherit this interface). 38269e09f3SIgor Mammedov * 39269e09f3SIgor Mammedov * Interface also provides an optional ability to do the second 40269e09f3SIgor Mammedov * stage * initialization of the object after its properties were 41269e09f3SIgor Mammedov * set. 42269e09f3SIgor Mammedov * 43269e09f3SIgor Mammedov * For objects created without using -object/object-add/object_add, 44269e09f3SIgor Mammedov * @user_creatable_complete() wrapper should be called manually if 45269e09f3SIgor Mammedov * object's type implements USER_CREATABLE interface and needs 46269e09f3SIgor Mammedov * complete() callback to be called. 47269e09f3SIgor Mammedov */ 48269e09f3SIgor Mammedov typedef struct UserCreatableClass { 49269e09f3SIgor Mammedov /* <private> */ 50269e09f3SIgor Mammedov InterfaceClass parent_class; 51269e09f3SIgor Mammedov 52269e09f3SIgor Mammedov /* <public> */ 53269e09f3SIgor Mammedov void (*complete)(UserCreatable *uc, Error **errp); 54d6edb155SLin Ma bool (*can_be_deleted)(UserCreatable *uc, Error **errp); 55269e09f3SIgor Mammedov } UserCreatableClass; 56269e09f3SIgor Mammedov 57269e09f3SIgor Mammedov /** 58269e09f3SIgor Mammedov * user_creatable_complete: 59269e09f3SIgor Mammedov * @obj: the object whose complete() method is called if defined 60269e09f3SIgor Mammedov * @errp: if an error occurs, a pointer to an area to store the error 61269e09f3SIgor Mammedov * 62269e09f3SIgor Mammedov * Wrapper to call complete() method if one of types it's inherited 63269e09f3SIgor Mammedov * from implements USER_CREATABLE interface, otherwise the call does 64269e09f3SIgor Mammedov * nothing. 65269e09f3SIgor Mammedov */ 66269e09f3SIgor Mammedov void user_creatable_complete(Object *obj, Error **errp); 67d6edb155SLin Ma 68d6edb155SLin Ma /** 69d6edb155SLin Ma * user_creatable_can_be_deleted: 70d6edb155SLin Ma * @uc: the object whose can_be_deleted() method is called if implemented 71d6edb155SLin Ma * @errp: if an error occurs, a pointer to an area to store the error 72d6edb155SLin Ma * 73d6edb155SLin Ma * Wrapper to call can_be_deleted() method if one of types it's inherited 74d6edb155SLin Ma * from implements USER_CREATABLE interface. 75d6edb155SLin Ma */ 76d6edb155SLin Ma bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp); 77*90998d58SDaniel P. Berrange 78*90998d58SDaniel P. Berrange /** 79*90998d58SDaniel P. Berrange * user_creatable_add: 80*90998d58SDaniel P. Berrange * @qdict: the object definition 81*90998d58SDaniel P. Berrange * @v: the visitor 82*90998d58SDaniel P. Berrange * @errp: if an error occurs, a pointer to an area to store the error 83*90998d58SDaniel P. Berrange * 84*90998d58SDaniel P. Berrange * Create an instance of the user creatable object whose type 85*90998d58SDaniel P. Berrange * is defined in @qdict by the 'qom-type' field, placing it 86*90998d58SDaniel P. Berrange * in the object composition tree with name provided by the 87*90998d58SDaniel P. Berrange * 'id' field. The remaining fields in @qdict are used to 88*90998d58SDaniel P. Berrange * initialize the object properties. 89*90998d58SDaniel P. Berrange * 90*90998d58SDaniel P. Berrange * Returns: the newly created object or NULL on error 91*90998d58SDaniel P. Berrange */ 92*90998d58SDaniel P. Berrange Object *user_creatable_add(const QDict *qdict, 93*90998d58SDaniel P. Berrange Visitor *v, Error **errp); 94*90998d58SDaniel P. Berrange 95*90998d58SDaniel P. Berrange /** 96*90998d58SDaniel P. Berrange * user_creatable_add_type: 97*90998d58SDaniel P. Berrange * @type: the object type name 98*90998d58SDaniel P. Berrange * @id: the unique ID for the object 99*90998d58SDaniel P. Berrange * @qdict: the object properties 100*90998d58SDaniel P. Berrange * @v: the visitor 101*90998d58SDaniel P. Berrange * @errp: if an error occurs, a pointer to an area to store the error 102*90998d58SDaniel P. Berrange * 103*90998d58SDaniel P. Berrange * Create an instance of the user creatable object @type, placing 104*90998d58SDaniel P. Berrange * it in the object composition tree with name @id, initializing 105*90998d58SDaniel P. Berrange * it with properties from @qdict 106*90998d58SDaniel P. Berrange * 107*90998d58SDaniel P. Berrange * Returns: the newly created object or NULL on error 108*90998d58SDaniel P. Berrange */ 109*90998d58SDaniel P. Berrange Object *user_creatable_add_type(const char *type, const char *id, 110*90998d58SDaniel P. Berrange const QDict *qdict, 111*90998d58SDaniel P. Berrange Visitor *v, Error **errp); 112*90998d58SDaniel P. Berrange 113*90998d58SDaniel P. Berrange /** 114*90998d58SDaniel P. Berrange * user_creatable_add_opts: 115*90998d58SDaniel P. Berrange * @opts: the object definition 116*90998d58SDaniel P. Berrange * @errp: if an error occurs, a pointer to an area to store the error 117*90998d58SDaniel P. Berrange * 118*90998d58SDaniel P. Berrange * Create an instance of the user creatable object whose type 119*90998d58SDaniel P. Berrange * is defined in @opts by the 'qom-type' option, placing it 120*90998d58SDaniel P. Berrange * in the object composition tree with name provided by the 121*90998d58SDaniel P. Berrange * 'id' field. The remaining options in @opts are used to 122*90998d58SDaniel P. Berrange * initialize the object properties. 123*90998d58SDaniel P. Berrange * 124*90998d58SDaniel P. Berrange * Returns: the newly created object or NULL on error 125*90998d58SDaniel P. Berrange */ 126*90998d58SDaniel P. Berrange Object *user_creatable_add_opts(QemuOpts *opts, Error **errp); 127*90998d58SDaniel P. Berrange 128*90998d58SDaniel P. Berrange 129*90998d58SDaniel P. Berrange /** 130*90998d58SDaniel P. Berrange * user_creatable_add_opts_predicate: 131*90998d58SDaniel P. Berrange * @type: the QOM type to be added 132*90998d58SDaniel P. Berrange * 133*90998d58SDaniel P. Berrange * A callback function to determine whether an object 134*90998d58SDaniel P. Berrange * of type @type should be created. Instances of this 135*90998d58SDaniel P. Berrange * callback should be passed to user_creatable_add_opts_foreach 136*90998d58SDaniel P. Berrange */ 137*90998d58SDaniel P. Berrange typedef bool (*user_creatable_add_opts_predicate)(const char *type); 138*90998d58SDaniel P. Berrange 139*90998d58SDaniel P. Berrange /** 140*90998d58SDaniel P. Berrange * user_creatable_add_opts_foreach: 141*90998d58SDaniel P. Berrange * @opaque: a user_creatable_add_opts_predicate callback or NULL 142*90998d58SDaniel P. Berrange * @opts: options to create 143*90998d58SDaniel P. Berrange * @errp: if an error occurs, a pointer to an area to store the error 144*90998d58SDaniel P. Berrange * 145*90998d58SDaniel P. Berrange * An iterator callback to be used in conjunction with 146*90998d58SDaniel P. Berrange * the qemu_opts_foreach() method for creating a list of 147*90998d58SDaniel P. Berrange * objects from a set of QemuOpts 148*90998d58SDaniel P. Berrange * 149*90998d58SDaniel P. Berrange * The @opaque parameter can be passed a user_creatable_add_opts_predicate 150*90998d58SDaniel P. Berrange * callback to filter which types of object are created during iteration. 151*90998d58SDaniel P. Berrange * 152*90998d58SDaniel P. Berrange * Returns: 0 on success, -1 on error 153*90998d58SDaniel P. Berrange */ 154*90998d58SDaniel P. Berrange int user_creatable_add_opts_foreach(void *opaque, 155*90998d58SDaniel P. Berrange QemuOpts *opts, Error **errp); 156*90998d58SDaniel P. Berrange 157*90998d58SDaniel P. Berrange /** 158*90998d58SDaniel P. Berrange * user_creatable_del: 159*90998d58SDaniel P. Berrange * @id: the unique ID for the object 160*90998d58SDaniel P. Berrange * @errp: if an error occurs, a pointer to an area to store the error 161*90998d58SDaniel P. Berrange * 162*90998d58SDaniel P. Berrange * Delete an instance of the user creatable object identified 163*90998d58SDaniel P. Berrange * by @id. 164*90998d58SDaniel P. Berrange */ 165*90998d58SDaniel P. Berrange void user_creatable_del(const char *id, Error **errp); 166*90998d58SDaniel P. Berrange 167269e09f3SIgor Mammedov #endif 168