cb3e7f08ae
Now that we can safely call QOBJECT() on QObject * as well as its subtypes, we can have macros qobject_ref() / qobject_unref() that work everywhere instead of having to use QINCREF() / QDECREF() for QObject and qobject_incref() / qobject_decref() for its subtypes. The replacement is mechanical, except I broke a long line, and added a cast in monitor_qmp_cleanup_req_queue_locked(). Unlike qobject_decref(), qobject_unref() doesn't accept void *. Note that the new macros evaluate their argument exactly once, thus no need to shout them. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20180419150145.24795-4-marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> [Rebased, semantic conflict resolved, commit message improved] Signed-off-by: Markus Armbruster <armbru@redhat.com>
115 lines
2.4 KiB
C
115 lines
2.4 KiB
C
/*
|
|
* A simple JSON writer
|
|
*
|
|
* Copyright Alexander Graf
|
|
*
|
|
* Authors:
|
|
* Alexander Graf <agraf@suse.de>
|
|
*
|
|
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
* See the COPYING.LIB file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Type QJSON lets you build JSON text. Its interface mirrors (a
|
|
* subset of) abstract JSON syntax.
|
|
*
|
|
* It does *not* detect incorrect use. It happily produces invalid
|
|
* JSON then. This is what migration wants.
|
|
*
|
|
* QAPI output visitors also produce JSON text. However, they do
|
|
* assert their preconditions and invariants, and therefore abort on
|
|
* incorrect use.
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "qapi/qmp/qstring.h"
|
|
#include "qjson.h"
|
|
|
|
struct QJSON {
|
|
QString *str;
|
|
bool omit_comma;
|
|
};
|
|
|
|
static void json_emit_element(QJSON *json, const char *name)
|
|
{
|
|
/* Check whether we need to print a , before an element */
|
|
if (json->omit_comma) {
|
|
json->omit_comma = false;
|
|
} else {
|
|
qstring_append(json->str, ", ");
|
|
}
|
|
|
|
if (name) {
|
|
qstring_append(json->str, "\"");
|
|
qstring_append(json->str, name);
|
|
qstring_append(json->str, "\" : ");
|
|
}
|
|
}
|
|
|
|
void json_start_object(QJSON *json, const char *name)
|
|
{
|
|
json_emit_element(json, name);
|
|
qstring_append(json->str, "{ ");
|
|
json->omit_comma = true;
|
|
}
|
|
|
|
void json_end_object(QJSON *json)
|
|
{
|
|
qstring_append(json->str, " }");
|
|
json->omit_comma = false;
|
|
}
|
|
|
|
void json_start_array(QJSON *json, const char *name)
|
|
{
|
|
json_emit_element(json, name);
|
|
qstring_append(json->str, "[ ");
|
|
json->omit_comma = true;
|
|
}
|
|
|
|
void json_end_array(QJSON *json)
|
|
{
|
|
qstring_append(json->str, " ]");
|
|
json->omit_comma = false;
|
|
}
|
|
|
|
void json_prop_int(QJSON *json, const char *name, int64_t val)
|
|
{
|
|
json_emit_element(json, name);
|
|
qstring_append_int(json->str, val);
|
|
}
|
|
|
|
void json_prop_str(QJSON *json, const char *name, const char *str)
|
|
{
|
|
json_emit_element(json, name);
|
|
qstring_append_chr(json->str, '"');
|
|
qstring_append(json->str, str);
|
|
qstring_append_chr(json->str, '"');
|
|
}
|
|
|
|
const char *qjson_get_str(QJSON *json)
|
|
{
|
|
return qstring_get_str(json->str);
|
|
}
|
|
|
|
QJSON *qjson_new(void)
|
|
{
|
|
QJSON *json = g_new0(QJSON, 1);
|
|
|
|
json->str = qstring_from_str("{ ");
|
|
json->omit_comma = true;
|
|
return json;
|
|
}
|
|
|
|
void qjson_finish(QJSON *json)
|
|
{
|
|
json_end_object(json);
|
|
}
|
|
|
|
void qjson_destroy(QJSON *json)
|
|
{
|
|
qobject_unref(json->str);
|
|
g_free(json);
|
|
}
|