@@ -832,6 +832,14 @@ void object_property_del(Object *obj, const char *name, Error **errp);
ObjectProperty *object_property_find(Object *obj, const char *name,
Error **errp);
+/*
+ * Return a property name that doesn't clash with @obj's existing ones.
+ * The name is of the form %s[%d], where %s is @stem, and %d counts up
+ * from zero.
+ * The caller should free the name.
+ */
+char *object_gen_new_property_name(Object *obj, const char *stem);
+
void object_unparent(Object *obj);
/**
@@ -808,6 +808,20 @@ void object_property_del(Object *obj, const char *name, Error **errp)
g_free(prop);
}
+char *object_gen_new_property_name(Object *obj, const char *stem)
+{
+ int i;
+
+ for (i = 0; ; ++i) {
+ char *name = g_strdup_printf("%s[%d]", stem, i);
+
+ if (!object_property_find(obj, name, NULL)) {
+ return name;
+ }
+ g_free(name);
+ }
+}
+
void object_property_get(Object *obj, Visitor *v, const char *name,
Error **errp)
{
The next few commits will use it to replace object_property_add()'s "automatic arrayification" (commit 3396590). "Automatic arrayification" is a convenience feature for creating a bunch of properties with a common type, accessors and so forth, named in a peculiar way: "foo[0]", "foo[1]", ... It's implemented by making property names ending with "[*]" magical. The magic is uncalled for, as names can be just as well generated separately from adding properties. The name object_gen_new_property_name() is exceedingly long, but that's how QOM names are. Signed-off-by: Markus Armbruster <armbru@redhat.com> --- include/qom/object.h | 8 ++++++++ qom/object.c | 14 ++++++++++++++ 2 files changed, 22 insertions(+)