On Thu, Apr 30, 2015 at 04:46:37PM +0100, 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, "MyDevType", > mydev_prop_get_devtype, > mydev_prop_set_devtype, > NULL); > > Note there is no need to check the range of 'value' in > the setter, because the string->enum conversion code will > have already done that and reported an error as required. > > Signed-off-by: Daniel P. Berrange <berra...@redhat.com> > --- > include/qom/object.h | 19 ++++++++++++ > qom/object.c | 58 ++++++++++++++++++++++++++++++++++++ > tests/check-qom-proplist.c | 74 > ++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 151 insertions(+)
> diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c > index 9a02e4d..15f4933 100644 > --- a/tests/check-qom-proplist.c > +++ b/tests/check-qom-proplist.c > +static void test_dummy_badenum(void) > +{ > + Error *err = NULL; > + DummyObject *dobj = DUMMY_OBJECT( > + object_new_propv(TYPE_DUMMY, > + "/objects", > + "dummy0", > + &err, > + "bv", "yes", > + "sv", "Hiss hiss hiss", > + "av", "yeti", > + NULL)); Opps, this won't compile as I forgot to update the 2nd arg. Will send a v3 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 :|