qemu/include
Daniel P. Berrange a8e3fbedc8 qom: Add an object_property_add_enum() helper function
A QOM property can be parsed as enum using the visit_type_enum()
helper function, 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_obj;
      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->devtype = 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 <berrange@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
2015-06-19 18:42:18 +02:00
..
block Block layer core and image format patches 2015-06-15 10:43:06 +01:00
disas disas: Implement disassembly output for A64 2014-02-08 14:50:48 +00:00
exec softmmu: provide tlb_vaddr_to_host function for user mode 2015-06-17 12:40:51 +02:00
fpu softfloat: expand out STATUS macro 2015-02-06 16:11:38 +00:00
hw qom: Make enum string tables const-correct 2015-06-19 18:42:18 +02:00
libdecnumber Fix new typos in comments (found by codespell) 2014-07-18 17:45:36 +04:00
migration Add a protective section footer 2015-06-12 06:54:01 +02:00
monitor audio: remove LOG_TO_MONITOR along with default_mon 2015-06-15 12:42:48 +02:00
net vhost: 64 bit features 2015-06-10 18:15:04 +02:00
qapi qom: Make enum string tables const-correct 2015-06-19 18:42:18 +02:00
qemu qom: Add object_new_with_props() / object_new_withpropv() helpers 2015-06-19 18:42:18 +02:00
qom qom: Add an object_property_add_enum() helper function 2015-06-19 18:42:18 +02:00
standard-headers virtio: update headers, add virtio-gpu (2d) 2015-06-10 11:02:00 +02:00
sysemu virtio-gpu: pci support bits and virtio-vga. 2015-06-16 10:35:43 +01:00
ui QemuOpts: Convert qemu_opts_foreach() to Error 2015-06-09 07:37:37 +02:00
config.h janitor: move remaining public headers to include/ 2012-12-19 08:32:46 +01:00
elf.h linux/elf.h update 2015-05-27 17:52:03 +02:00
glib-compat.h glib: remove stale compat functions 2015-05-22 15:58:06 -04:00
qemu-common.h machine: add default_ram_size to machine class 2015-06-03 23:56:55 +02:00
qemu-io.h qemu-io: Use BlockBackend 2015-02-16 15:07:19 +00:00
qjson.h QJSON: Add JSON writer 2015-02-05 17:16:14 +01:00
trace-tcg.h trace: [tcg] Generate TCG tracing routines 2014-08-12 14:26:12 +01:00
trace.h trace: [tcg] Include event definitions in "trace.h" 2014-08-12 14:26:12 +01:00