On Fri, Apr 17, 2015 at 05:01:24PM +0200, Paolo Bonzini wrote: > > > On 17/04/2015 16:56, Paolo Bonzini wrote: > > > > > > On 17/04/2015 16:22, Daniel P. Berrange wrote: > >> A QOM property can be parsed as enum using the visit_type_enum() > >> helper method, but this forces callers to use the more complex > >> generic object_property_add() method when registering it. It > >> also requires that users of that object have access to the > >> string map when they want to read the property value. > >> > >> This patch introduces a specialized object_property_add_enum() > >> method which simplifies the use of enum properties, so the > >> setters/getters directly get passed the int value. > >> > >> typedef enum { > >> MYDEV_TYPE_FROG, > >> MYDEV_TYPE_ALLIGATOR, > >> MYDEV_TYPE_PLATYPUS, > >> > >> MYDEV_TYPE_LAST > >> } MyDevType; > >> > >> Then provide a table of enum <-> string mappings > >> > >> static const char *const mydevtypemap[MYDEV_TYPE_LAST + 1] = { > >> [MYDEV_TYPE_FROG] = "frog", > >> [MYDEV_TYPE_ALLIGATOR] = "alligator", > >> [MYDEV_TYPE_PLATYPUS] = "platypus", > >> [MYDEV_TYPE_LAST] = NULL, > >> }; > >> > >> Assuming an object struct of > >> > >> typedef struct { > >> Object parent; > >> MyDevType devtype; > >> ...other fields... > >> } MyDev; > >> > >> The property can then be registered as follows: > >> > >> static int mydev_prop_get_devtype(Object *obj, > >> Error **errp G_GNUC_UNUSED) > >> { > >> MyDev *dev = MYDEV(obj); > >> > >> return dev->devtype; > >> } > >> > >> static void mydev_prop_set_devtype(Object *obj, > >> int value, > >> Error **errp G_GNUC_UNUSED) > >> { > >> MyDev *dev = MYDEV(obj); > >> > >> dev->endpoint = value; > >> } > >> > >> object_property_add_enum(obj, "devtype", > >> mydevtypemap, > >> mydev_prop_get_devtype, > >> mydev_prop_set_devtype, > >> NULL); > > On second thought (after seeing patch 7), please add a property type > argument here. We lose introspection of enum property types otherwise.
Can you give me a pointer to where we lose introspection ? The hostmem code just registers its 'policy' property with a type name of 'str', which I've just changed to 'enum' in patch 7, so I didn't think I was regressing anything. Is there some QMP command which you think looses the info that I can verify. > It's possible to use macros so that 'MyEnum' gets translated to two > arguments '"MyEnum", MyEnum_lookup', but I don't think that's worth the > obfuscation. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|