提交 02fe2db6 编写于 作者: P Paolo Bonzini

qom: add object_resolve_path_type

Reviewed-by: NAnthony Liguori <aliguori@us.ibm.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 8f770d39
...@@ -749,13 +749,34 @@ gchar *object_get_canonical_path(Object *obj); ...@@ -749,13 +749,34 @@ gchar *object_get_canonical_path(Object *obj);
* specifying objects easy. At each level of the composition tree, the partial * specifying objects easy. At each level of the composition tree, the partial
* path is matched as an absolute path. The first match is not returned. At * path is matched as an absolute path. The first match is not returned. At
* least two matches are searched for. A successful result is only returned if * least two matches are searched for. A successful result is only returned if
* only one match is founded. If more than one match is found, a flag is * only one match is found. If more than one match is found, a flag is
* return to indicate that the match was ambiguous. * returned to indicate that the match was ambiguous.
* *
* Returns: The matched object or NULL on path lookup failure. * Returns: The matched object or NULL on path lookup failure.
*/ */
Object *object_resolve_path(const char *path, bool *ambiguous); Object *object_resolve_path(const char *path, bool *ambiguous);
/**
* object_resolve_path_type:
* @path: the path to resolve
* @typename: the type to look for.
* @ambiguous: returns true if the path resolution failed because of an
* ambiguous match
*
* This is similar to object_resolve_path. However, when looking for a
* partial path only matches that implement the given type are considered.
* This restricts the search and avoids spuriously flagging matches as
* ambiguous.
*
* For both partial and absolute paths, the return value goes through
* a dynamic cast to @typename. This is important if either the link,
* or the typename itself are of interface types.
*
* Returns: The matched object or NULL on path lookup failure.
*/
Object *object_resolve_path_type(const char *path, const char *typename,
bool *ambiguous);
/** /**
* object_property_add_child: * object_property_add_child:
* @obj: the object to add a property to * @obj: the object to add a property to
......
...@@ -930,17 +930,18 @@ gchar *object_get_canonical_path(Object *obj) ...@@ -930,17 +930,18 @@ gchar *object_get_canonical_path(Object *obj)
static Object *object_resolve_abs_path(Object *parent, static Object *object_resolve_abs_path(Object *parent,
gchar **parts, gchar **parts,
const char *typename,
int index) int index)
{ {
ObjectProperty *prop; ObjectProperty *prop;
Object *child; Object *child;
if (parts[index] == NULL) { if (parts[index] == NULL) {
return parent; return object_dynamic_cast(parent, typename);
} }
if (strcmp(parts[index], "") == 0) { if (strcmp(parts[index], "") == 0) {
return object_resolve_abs_path(parent, parts, index + 1); return object_resolve_abs_path(parent, parts, typename, index + 1);
} }
prop = object_property_find(parent, parts[index]); prop = object_property_find(parent, parts[index]);
...@@ -962,17 +963,18 @@ static Object *object_resolve_abs_path(Object *parent, ...@@ -962,17 +963,18 @@ static Object *object_resolve_abs_path(Object *parent,
return NULL; return NULL;
} }
return object_resolve_abs_path(child, parts, index + 1); return object_resolve_abs_path(child, parts, typename, index + 1);
} }
static Object *object_resolve_partial_path(Object *parent, static Object *object_resolve_partial_path(Object *parent,
gchar **parts, gchar **parts,
const char *typename,
bool *ambiguous) bool *ambiguous)
{ {
Object *obj; Object *obj;
ObjectProperty *prop; ObjectProperty *prop;
obj = object_resolve_abs_path(parent, parts, 0); obj = object_resolve_abs_path(parent, parts, typename, 0);
QTAILQ_FOREACH(prop, &parent->properties, node) { QTAILQ_FOREACH(prop, &parent->properties, node) {
Object *found; Object *found;
...@@ -981,7 +983,8 @@ static Object *object_resolve_partial_path(Object *parent, ...@@ -981,7 +983,8 @@ static Object *object_resolve_partial_path(Object *parent,
continue; continue;
} }
found = object_resolve_partial_path(prop->opaque, parts, ambiguous); found = object_resolve_partial_path(prop->opaque, parts,
typename, ambiguous);
if (found) { if (found) {
if (obj) { if (obj) {
if (ambiguous) { if (ambiguous) {
...@@ -1000,7 +1003,8 @@ static Object *object_resolve_partial_path(Object *parent, ...@@ -1000,7 +1003,8 @@ static Object *object_resolve_partial_path(Object *parent,
return obj; return obj;
} }
Object *object_resolve_path(const char *path, bool *ambiguous) Object *object_resolve_path_type(const char *path, const char *typename,
bool *ambiguous)
{ {
bool partial_path = true; bool partial_path = true;
Object *obj; Object *obj;
...@@ -1020,9 +1024,10 @@ Object *object_resolve_path(const char *path, bool *ambiguous) ...@@ -1020,9 +1024,10 @@ Object *object_resolve_path(const char *path, bool *ambiguous)
if (ambiguous) { if (ambiguous) {
*ambiguous = false; *ambiguous = false;
} }
obj = object_resolve_partial_path(object_get_root(), parts, ambiguous); obj = object_resolve_partial_path(object_get_root(), parts,
typename, ambiguous);
} else { } else {
obj = object_resolve_abs_path(object_get_root(), parts, 1); obj = object_resolve_abs_path(object_get_root(), parts, typename, 1);
} }
g_strfreev(parts); g_strfreev(parts);
...@@ -1030,6 +1035,11 @@ Object *object_resolve_path(const char *path, bool *ambiguous) ...@@ -1030,6 +1035,11 @@ Object *object_resolve_path(const char *path, bool *ambiguous)
return obj; return obj;
} }
Object *object_resolve_path(const char *path, bool *ambiguous)
{
return object_resolve_path_type(path, TYPE_OBJECT, ambiguous);
}
typedef struct StringProperty typedef struct StringProperty
{ {
char *(*get)(Object *, Error **); char *(*get)(Object *, Error **);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册