}
}
-void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
+bool object_apply_global_props(Object *obj, const GPtrArray *props,
+ Error **errp)
{
int i;
if (!props) {
- return;
+ return true;
}
for (i = 0; i < props->len; i++) {
continue;
}
p->used = true;
- object_property_parse(obj, p->value, p->property, &err);
- if (err != NULL) {
+ if (!object_property_parse(obj, p->property, p->value, &err)) {
error_prepend(&err, "can't apply global %s.%s=%s: ",
p->driver, p->property, p->value);
/*
*/
if (errp) {
error_propagate(errp, err);
- return;
+ return false;
} else {
warn_report_err(err);
}
}
}
+
+ return true;
}
/*
object_initialize_with_type(data, size, type);
}
-void object_initialize_child_with_props(Object *parentobj,
- const char *propname,
- void *childobj, size_t size, const char *type,
- Error **errp, ...)
+bool object_initialize_child_with_props(Object *parentobj,
+ const char *propname,
+ void *childobj, size_t size,
+ const char *type,
+ Error **errp, ...)
{
va_list vargs;
+ bool ok;
va_start(vargs, errp);
- object_initialize_child_with_propsv(parentobj, propname,
- childobj, size, type, errp, vargs);
+ ok = object_initialize_child_with_propsv(parentobj, propname,
+ childobj, size, type, errp,
+ vargs);
va_end(vargs);
+ return ok;
}
-void object_initialize_child_with_propsv(Object *parentobj,
- const char *propname,
- void *childobj, size_t size, const char *type,
- Error **errp, va_list vargs)
+bool object_initialize_child_with_propsv(Object *parentobj,
+ const char *propname,
+ void *childobj, size_t size,
+ const char *type,
+ Error **errp, va_list vargs)
{
Error *local_err = NULL;
+ bool ok = false;
Object *obj;
UserCreatable *uc;
object_initialize(childobj, size, type);
obj = OBJECT(childobj);
- object_set_propv(obj, &local_err, vargs);
- if (local_err) {
+ if (!object_set_propv(obj, errp, vargs)) {
goto out;
}
uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
if (uc) {
- user_creatable_complete(uc, &local_err);
- if (local_err) {
+ if (!user_creatable_complete(uc, &local_err)) {
object_unparent(obj);
goto out;
}
}
+ ok = true;
+
out:
/*
* We want @obj's reference to be 1 on success, 0 on failure.
object_unref(obj);
error_propagate(errp, local_err);
+ return ok;
}
void object_initialize_child_internal(Object *parent,
}
obj = object_new_with_type(klass->type);
- if (object_set_propv(obj, &local_err, vargs) < 0) {
+ if (!object_set_propv(obj, errp, vargs)) {
goto error;
}
uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
if (uc) {
- user_creatable_complete(uc, &local_err);
- if (local_err) {
+ if (!user_creatable_complete(uc, &local_err)) {
if (id != NULL) {
object_unparent(obj);
}
}
-int object_set_props(Object *obj,
+bool object_set_props(Object *obj,
Error **errp,
...)
{
va_list vargs;
- int ret;
+ bool ret;
va_start(vargs, errp);
ret = object_set_propv(obj, errp, vargs);
}
-int object_set_propv(Object *obj,
+bool object_set_propv(Object *obj,
Error **errp,
va_list vargs)
{
const char *propname;
- Error *local_err = NULL;
propname = va_arg(vargs, char *);
while (propname != NULL) {
const char *value = va_arg(vargs, char *);
g_assert(value != NULL);
- object_property_parse(obj, value, propname, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return -1;
+ if (!object_property_parse(obj, propname, value, errp)) {
+ return false;
}
propname = va_arg(vargs, char *);
}
- return 0;
+ return true;
}
g_hash_table_remove(obj->properties, name);
}
-void object_property_get(Object *obj, Visitor *v, const char *name,
+bool object_property_get(Object *obj, const char *name, Visitor *v,
Error **errp)
{
+ Error *err = NULL;
ObjectProperty *prop = object_property_find(obj, name, errp);
+
if (prop == NULL) {
- return;
+ return false;
}
if (!prop->get) {
error_setg(errp, QERR_PERMISSION_DENIED);
- } else {
- prop->get(obj, v, name, prop->opaque, errp);
+ return false;
}
+ prop->get(obj, v, name, prop->opaque, &err);
+ error_propagate(errp, err);
+ return !err;
}
-void object_property_set(Object *obj, Visitor *v, const char *name,
+bool object_property_set(Object *obj, const char *name, Visitor *v,
Error **errp)
{
+ Error *err = NULL;
ObjectProperty *prop = object_property_find(obj, name, errp);
+
if (prop == NULL) {
- return;
+ return false;
}
if (!prop->set) {
error_setg(errp, QERR_PERMISSION_DENIED);
- } else {
- prop->set(obj, v, name, prop->opaque, errp);
+ return false;
}
+ prop->set(obj, v, name, prop->opaque, &err);
+ error_propagate(errp, err);
+ return !err;
}
-void object_property_set_str(Object *obj, const char *value,
- const char *name, Error **errp)
+bool object_property_set_str(Object *obj, const char *name,
+ const char *value, Error **errp)
{
QString *qstr = qstring_from_str(value);
- object_property_set_qobject(obj, QOBJECT(qstr), name, errp);
+ bool ok = object_property_set_qobject(obj, name, QOBJECT(qstr), errp);
qobject_unref(qstr);
+ return ok;
}
char *object_property_get_str(Object *obj, const char *name,
return retval;
}
-void object_property_set_link(Object *obj, Object *value,
- const char *name, Error **errp)
+bool object_property_set_link(Object *obj, const char *name,
+ Object *value, Error **errp)
{
+ g_autofree char *path = NULL;
+
if (value) {
- char *path = object_get_canonical_path(value);
- object_property_set_str(obj, path, name, errp);
- g_free(path);
- } else {
- object_property_set_str(obj, "", name, errp);
+ path = object_get_canonical_path(value);
}
+ return object_property_set_str(obj, name, path ?: "", errp);
}
Object *object_property_get_link(Object *obj, const char *name,
return target;
}
-void object_property_set_bool(Object *obj, bool value,
- const char *name, Error **errp)
+bool object_property_set_bool(Object *obj, const char *name,
+ bool value, Error **errp)
{
QBool *qbool = qbool_from_bool(value);
- object_property_set_qobject(obj, QOBJECT(qbool), name, errp);
+ bool ok = object_property_set_qobject(obj, name, QOBJECT(qbool), errp);
qobject_unref(qbool);
+ return ok;
}
bool object_property_get_bool(Object *obj, const char *name,
return retval;
}
-void object_property_set_int(Object *obj, int64_t value,
- const char *name, Error **errp)
+bool object_property_set_int(Object *obj, const char *name,
+ int64_t value, Error **errp)
{
QNum *qnum = qnum_from_int(value);
- object_property_set_qobject(obj, QOBJECT(qnum), name, errp);
+ bool ok = object_property_set_qobject(obj, name, QOBJECT(qnum), errp);
qobject_unref(qnum);
+ return ok;
}
int64_t object_property_get_int(Object *obj, const char *name,
object_property_set_default(prop, QOBJECT(qnum_from_uint(value)));
}
-void object_property_set_uint(Object *obj, uint64_t value,
- const char *name, Error **errp)
+bool object_property_set_uint(Object *obj, const char *name,
+ uint64_t value, Error **errp)
{
QNum *qnum = qnum_from_uint(value);
+ bool ok = object_property_set_qobject(obj, name, QOBJECT(qnum), errp);
- object_property_set_qobject(obj, QOBJECT(qnum), name, errp);
qobject_unref(qnum);
+ return ok;
}
uint64_t object_property_get_uint(Object *obj, const char *name,
return ret;
}
-void object_property_parse(Object *obj, const char *string,
- const char *name, Error **errp)
+bool object_property_parse(Object *obj, const char *name,
+ const char *string, Error **errp)
{
Visitor *v = string_input_visitor_new(string);
- object_property_set(obj, v, name, errp);
+ bool ok = object_property_set(obj, name, v, errp);
+
visit_free(v);
+ return ok;
}
char *object_property_print(Object *obj, const char *name, bool human,
Error *local_err = NULL;
v = string_output_visitor_new(human, &string);
- object_property_get(obj, v, name, &local_err);
- if (local_err) {
+ if (!object_property_get(obj, name, v, &local_err)) {
error_propagate(errp, local_err);
goto out;
}
LinkProperty *prop = opaque;
Object **targetp = object_link_get_targetp(obj, prop);
Object *old_target = *targetp;
- Object *new_target = NULL;
+ Object *new_target;
char *path = NULL;
- visit_type_str(v, name, &path, &local_err);
+ if (!visit_type_str(v, name, &path, errp)) {
+ return;
+ }
- if (!local_err && strcmp(path, "") != 0) {
- new_target = object_resolve_link(obj, name, path, &local_err);
+ if (*path) {
+ new_target = object_resolve_link(obj, name, path, errp);
+ if (!new_target) {
+ g_free(path);
+ return;
+ }
+ } else {
+ new_target = NULL;
}
g_free(path);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
prop->check(obj, name, new_target, &local_err);
if (local_err) {
{
StringProperty *prop = opaque;
char *value;
- Error *local_err = NULL;
- visit_type_str(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (!visit_type_str(v, name, &value, errp)) {
return;
}
{
BoolProperty *prop = opaque;
bool value;
- Error *local_err = NULL;
- visit_type_bool(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (!visit_type_bool(v, name, &value, errp)) {
return;
}
{
EnumProperty *prop = opaque;
int value;
- Error *err = NULL;
- visit_type_enum(v, name, &value, prop->lookup, &err);
- if (err) {
- error_propagate(errp, err);
+ if (!visit_type_enum(v, name, &value, prop->lookup, errp)) {
return;
}
prop->set(obj, value, errp);
goto out;
}
- visit_start_struct(v, name, NULL, 0, &err);
- if (err) {
+ if (!visit_start_struct(v, name, NULL, 0, &err)) {
goto out;
}
- visit_type_int32(v, "tm_year", &value.tm_year, &err);
- if (err) {
+ if (!visit_type_int32(v, "tm_year", &value.tm_year, &err)) {
goto out_end;
}
- visit_type_int32(v, "tm_mon", &value.tm_mon, &err);
- if (err) {
+ if (!visit_type_int32(v, "tm_mon", &value.tm_mon, &err)) {
goto out_end;
}
- visit_type_int32(v, "tm_mday", &value.tm_mday, &err);
- if (err) {
+ if (!visit_type_int32(v, "tm_mday", &value.tm_mday, &err)) {
goto out_end;
}
- visit_type_int32(v, "tm_hour", &value.tm_hour, &err);
- if (err) {
+ if (!visit_type_int32(v, "tm_hour", &value.tm_hour, &err)) {
goto out_end;
}
- visit_type_int32(v, "tm_min", &value.tm_min, &err);
- if (err) {
+ if (!visit_type_int32(v, "tm_min", &value.tm_min, &err)) {
goto out_end;
}
- visit_type_int32(v, "tm_sec", &value.tm_sec, &err);
- if (err) {
+ if (!visit_type_int32(v, "tm_sec", &value.tm_sec, &err)) {
goto out_end;
}
visit_check_struct(v, &err);
NULL, NULL, prop);
}
-static char *qdev_get_type(Object *obj, Error **errp)
+static char *object_get_type(Object *obj, Error **errp)
{
return g_strdup(object_get_typename(obj));
}
{
uint8_t *field = opaque;
uint8_t value;
- Error *local_err = NULL;
- visit_type_uint8(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (!visit_type_uint8(v, name, &value, errp)) {
return;
}
{
uint16_t *field = opaque;
uint16_t value;
- Error *local_err = NULL;
- visit_type_uint16(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (!visit_type_uint16(v, name, &value, errp)) {
return;
}
{
uint32_t *field = opaque;
uint32_t value;
- Error *local_err = NULL;
- visit_type_uint32(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (!visit_type_uint32(v, name, &value, errp)) {
return;
}
{
uint64_t *field = opaque;
uint64_t value;
- Error *local_err = NULL;
- visit_type_uint64(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (!visit_type_uint64(v, name, &value, errp)) {
return;
}
{
AliasProperty *prop = opaque;
- object_property_get(prop->target_obj, v, prop->target_name, errp);
+ object_property_get(prop->target_obj, prop->target_name, v, errp);
}
static void property_set_alias(Object *obj, Visitor *v, const char *name,
{
AliasProperty *prop = opaque;
- object_property_set(prop->target_obj, v, prop->target_name, errp);
+ object_property_set(prop->target_obj, prop->target_name, v, errp);
}
static Object *property_resolve_alias(Object *obj, void *opaque,
static void object_class_init(ObjectClass *klass, void *data)
{
- object_class_property_add_str(klass, "type", qdev_get_type,
+ object_class_property_add_str(klass, "type", object_get_type,
NULL);
}