Object *user_creatable_add_opts(QemuOpts *opts, Error **errp) { Visitor *v; QDict *pdict; Object *obj; const char *id = qemu_opts_id(opts); char *type = qemu_opt_get_del(opts, "qom-type"); if (!type) { error_setg(errp, QERR_MISSING_PARAMETER, "qom-type"); return NULL; } if (!id) { error_setg(errp, QERR_MISSING_PARAMETER, "id"); qemu_opt_set(opts, "qom-type", type, &error_abort); g_free(type); return NULL; } qemu_opts_set_id(opts, NULL); pdict = qemu_opts_to_qdict(opts, NULL); v = opts_visitor_new(opts); obj = user_creatable_add_type(type, id, pdict, v, errp); visit_free(v); qemu_opts_set_id(opts, (char *) id); qemu_opt_set(opts, "qom-type", type, &error_abort); g_free(type); qobject_unref(pdict); return obj; }
Object *user_creatable_add(const QDict *qdict, Visitor *v, Error **errp) { char *type = NULL; char *id = NULL; Object *obj = NULL; Error *local_err = NULL; QDict *pdict; pdict = qdict_clone_shallow(qdict); visit_start_struct(v, NULL, NULL, 0, &local_err); if (local_err) { goto out; } qdict_del(pdict, "qom-type"); visit_type_str(v, "qom-type", &type, &local_err); if (local_err) { goto out_visit; } qdict_del(pdict, "id"); visit_type_str(v, "id", &id, &local_err); if (local_err) { goto out_visit; } visit_check_struct(v, &local_err); if (local_err) { goto out_visit; } obj = user_creatable_add_type(type, id, pdict, v, &local_err); out_visit: visit_end_struct(v, NULL); out: QDECREF(pdict); g_free(id); g_free(type); if (local_err) { error_propagate(errp, local_err); object_unref(obj); return NULL; } return obj; }
static QAuthZ * qauthz_list_file_load(QAuthZListFile *fauthz, Error **errp) { GError *err = NULL; gchar *content = NULL; gsize len; QObject *obj = NULL; QDict *pdict; Visitor *v = NULL; QAuthZ *ret = NULL; trace_qauthz_list_file_load(fauthz, fauthz->filename); if (!g_file_get_contents(fauthz->filename, &content, &len, &err)) { error_setg(errp, "Unable to read '%s': %s", fauthz->filename, err->message); goto cleanup; } obj = qobject_from_json(content, errp); if (!obj) { goto cleanup; } pdict = qobject_to(QDict, obj); if (!pdict) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, "obj", "dict"); goto cleanup; } v = qobject_input_visitor_new(obj); ret = (QAuthZ *)user_creatable_add_type(TYPE_QAUTHZ_LIST, NULL, pdict, v, errp); cleanup: visit_free(v); qobject_unref(obj); if (err) { g_error_free(err); } g_free(content); return ret; }