mirror of https://github.com/xemu-project/xemu.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 *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:
|
* 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);
|
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)
|
gchar *object_get_canonical_path(Object *obj)
|
||||||
{
|
{
|
||||||
Object *root = object_get_root();
|
Object *root = object_get_root();
|
||||||
char *newpath = NULL, *path = NULL;
|
char *newpath, *path = NULL;
|
||||||
|
|
||||||
while (obj != root) {
|
while (obj != root) {
|
||||||
ObjectProperty *prop = NULL;
|
char *component = object_get_canonical_path_component(obj);
|
||||||
|
|
||||||
g_assert(obj->parent != NULL);
|
if (path) {
|
||||||
|
newpath = g_strdup_printf("%s/%s", component, path);
|
||||||
QTAILQ_FOREACH(prop, &obj->parent->properties, node) {
|
g_free(component);
|
||||||
if (!object_property_is_child(prop)) {
|
g_free(path);
|
||||||
continue;
|
path = newpath;
|
||||||
}
|
} else {
|
||||||
|
path = component;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert(prop != NULL);
|
|
||||||
|
|
||||||
obj = obj->parent;
|
obj = obj->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
newpath = g_strdup_printf("/%s", path);
|
newpath = g_strdup_printf("/%s", path ? path : "");
|
||||||
g_free(path);
|
g_free(path);
|
||||||
|
|
||||||
return newpath;
|
return newpath;
|
||||||
|
|
Loading…
Reference in New Issue