qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC v1 16/25] qom: object_property_set/get: Add child recu


From: Peter Crosthwaite
Subject: [Qemu-devel] [RFC v1 16/25] qom: object_property_set/get: Add child recursion
Date: Thu, 15 May 2014 18:59:04 -0700

Allow giving a "/" delimiter to indicate that a property set/get is
accessing a property within a child. E.G. "foo/bar" will set the
"bar" property on child "foo". Multiple "/"s will traverse multiple
child levels.

Signed-off-by: Peter Crosthwaite <address@hidden>
---

 qom/object.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index e42b254..a23ccb1 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -772,6 +772,29 @@ ObjectProperty *object_property_find(Object *obj, const 
char *name,
     return NULL;
 }
 
+static ObjectProperty *object_property_find_traverse(Object **obj,
+                                                     const char **name,
+                                                     Error **errp)
+{
+    const char *slash = strchr(*name, '/');
+
+    if (slash) {
+        Error *err = NULL;
+        char *child_name = g_strndup(*name, slash - *name);
+        *obj = object_property_get_link(*obj, child_name, &err);
+        g_free(child_name);
+        if (err) {
+            error_propagate(errp, err);
+        } else {
+            *name = slash + 1;
+            return object_property_find_traverse(obj, name, errp);
+        }
+        return NULL;
+    }
+
+    return object_property_find(*obj, *name, errp);
+}
+
 void object_property_del(Object *obj, const char *name, Error **errp)
 {
     ObjectProperty *prop = object_property_find(obj, name, errp);
@@ -793,7 +816,7 @@ void object_property_del(Object *obj, const char *name, 
Error **errp)
 void object_property_get(Object *obj, Visitor *v, const char *name,
                          Error **errp)
 {
-    ObjectProperty *prop = object_property_find(obj, name, errp);
+    ObjectProperty *prop = object_property_find_traverse(&obj, &name, errp);
     if (prop == NULL) {
         return;
     }
@@ -808,7 +831,7 @@ void object_property_get(Object *obj, Visitor *v, const 
char *name,
 void object_property_set(Object *obj, Visitor *v, const char *name,
                          Error **errp)
 {
-    ObjectProperty *prop = object_property_find(obj, name, errp);
+    ObjectProperty *prop = object_property_find_traverse(&obj, &name, errp);
     if (prop == NULL) {
         return;
     }
-- 
1.9.3.1.ga73a6ad




reply via email to

[Prev in Thread] Current Thread [Next in Thread]