• D
    qom: Add an object_property_add_enum() helper function · a8e3fbed
    Daniel P. Berrange 提交于
    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: NDaniel P. Berrange <berrange@redhat.com>
    Reviewed-by: NEric Blake <eblake@redhat.com>
    Signed-off-by: NAndreas Färber <afaerber@suse.de>
    a8e3fbed
object.h 49.9 KB