mirror of https://gitee.com/openkylin/qemu.git
object: add object_get_canonical_path_component()
It is often useful to find an object's child property name. Also use this new function to simplify the implementation of object_get_canonical_path(). Reviewed-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
b5042a3622
commit
11f590b1a2
|
@ -973,6 +973,14 @@ const char *object_property_get_type(Object *obj, const char *name,
|
|||
*/
|
||||
Object *object_get_root(void);
|
||||
|
||||
/**
|
||||
* object_get_canonical_path_component:
|
||||
*
|
||||
* Returns: The final component in the object's canonical path. The canonical
|
||||
* path is the path within the composition tree starting from the root.
|
||||
*/
|
||||
gchar *object_get_canonical_path_component(Object *obj);
|
||||
|
||||
/**
|
||||
* object_get_canonical_path:
|
||||
*
|
||||
|
|
54
qom/object.c
54
qom/object.c
|
@ -1102,39 +1102,49 @@ void object_property_add_link(Object *obj, const char *name,
|
|||
g_free(full_type);
|
||||
}
|
||||
|
||||
gchar *object_get_canonical_path_component(Object *obj)
|
||||
{
|
||||
ObjectProperty *prop = NULL;
|
||||
|
||||
g_assert(obj);
|
||||
g_assert(obj->parent != NULL);
|
||||
|
||||
QTAILQ_FOREACH(prop, &obj->parent->properties, node) {
|
||||
if (!object_property_is_child(prop)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (prop->opaque == obj) {
|
||||
return g_strdup(prop->name);
|
||||
}
|
||||
}
|
||||
|
||||
/* obj had a parent but was not a child, should never happen */
|
||||
g_assert_not_reached();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gchar *object_get_canonical_path(Object *obj)
|
||||
{
|
||||
Object *root = object_get_root();
|
||||
char *newpath = NULL, *path = NULL;
|
||||
char *newpath, *path = NULL;
|
||||
|
||||
while (obj != root) {
|
||||
ObjectProperty *prop = NULL;
|
||||
char *component = object_get_canonical_path_component(obj);
|
||||
|
||||
g_assert(obj->parent != NULL);
|
||||
|
||||
QTAILQ_FOREACH(prop, &obj->parent->properties, node) {
|
||||
if (!object_property_is_child(prop)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (prop->opaque == obj) {
|
||||
if (path) {
|
||||
newpath = g_strdup_printf("%s/%s", prop->name, path);
|
||||
g_free(path);
|
||||
path = newpath;
|
||||
} else {
|
||||
path = g_strdup(prop->name);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (path) {
|
||||
newpath = g_strdup_printf("%s/%s", component, path);
|
||||
g_free(component);
|
||||
g_free(path);
|
||||
path = newpath;
|
||||
} else {
|
||||
path = component;
|
||||
}
|
||||
|
||||
g_assert(prop != NULL);
|
||||
|
||||
obj = obj->parent;
|
||||
}
|
||||
|
||||
newpath = g_strdup_printf("/%s", path);
|
||||
newpath = g_strdup_printf("/%s", path ? path : "");
|
||||
g_free(path);
|
||||
|
||||
return newpath;
|
||||
|
|
Loading…
Reference in New Issue