提交 11f590b1 编写于 作者: S Stefan Hajnoczi

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: NAndreas Färber <afaerber@suse.de>
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 b5042a36
......@@ -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:
*
......
......@@ -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;
g_assert(obj->parent != NULL);
QTAILQ_FOREACH(prop, &obj->parent->properties, node) {
if (!object_property_is_child(prop)) {
continue;
}
char *component = object_get_canonical_path_component(obj);
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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册