Commit 11f590b1 authored by Stefan Hajnoczi's avatar Stefan Hajnoczi
Browse files

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: default avatarAndreas Färber <afaerber@suse.de>
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent b5042a36
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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:
 *
+32 −22
Original line number Diff line number Diff line
@@ -1102,14 +1102,11 @@ void object_property_add_link(Object *obj, const char *name,
    g_free(full_type);
}

gchar *object_get_canonical_path(Object *obj)
gchar *object_get_canonical_path_component(Object *obj)
{
    Object *root = object_get_root();
    char *newpath = NULL, *path = NULL;

    while (obj != root) {
    ObjectProperty *prop = NULL;

    g_assert(obj);
    g_assert(obj->parent != NULL);

    QTAILQ_FOREACH(prop, &obj->parent->properties, node) {
@@ -1118,23 +1115,36 @@ gchar *object_get_canonical_path(Object *obj)
        }

        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, *path = NULL;

    while (obj != root) {
        char *component = object_get_canonical_path_component(obj);

        if (path) {
                    newpath = g_strdup_printf("%s/%s", prop->name, path);
            newpath = g_strdup_printf("%s/%s", component, path);
            g_free(component);
            g_free(path);
            path = newpath;
        } else {
                    path = g_strdup(prop->name);
                }
                break;
            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;