/*
- * QObject JSON integration
+ * QEMU JSON writer
*
- * Copyright IBM, Corp. 2009
+ * Copyright Alexander Graf
*
* Authors:
*
* 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.
*
*/
-#include "json-lexer.h"
-#include "json-parser.h"
-#include "json-streamer.h"
-#include "qjson.h"
+#include "qemu/osdep.h"
+#include <qapi/qmp/qstring.h>
+#include <glib.h>
+#include <qjson.h>
+#include <qemu/module.h>
+#include <qom/object.h>
-typedef struct JSONParsingState
+struct QJSON {
+ Object obj;
+ QString *str;
+ bool omit_comma;
+};
+
+#define QJSON(obj) OBJECT_CHECK(QJSON, (obj), TYPE_QJSON)
+
+static void json_emit_element(QJSON *json, const char *name)
{
- JSONMessageParser parser;
- va_list *ap;
- QObject *result;
-} JSONParsingState;
+ /* 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, "\" : ");
+ }
+}
-static void parse_json(JSONMessageParser *parser, QList *tokens)
+void json_start_object(QJSON *json, const char *name)
{
- JSONParsingState *s = container_of(parser, JSONParsingState, parser);
- s->result = json_parser_parse(tokens, s->ap);
+ json_emit_element(json, name);
+ qstring_append(json->str, "{ ");
+ json->omit_comma = true;
}
-QObject *qobject_from_json(const char *string)
+void json_end_object(QJSON *json)
{
- JSONParsingState state = {};
+ qstring_append(json->str, " }");
+ json->omit_comma = false;
+}
- json_message_parser_init(&state.parser, parse_json);
- json_message_parser_feed(&state.parser, string, strlen(string));
- json_message_parser_flush(&state.parser);
- json_message_parser_destroy(&state.parser);
+void json_start_array(QJSON *json, const char *name)
+{
+ json_emit_element(json, name);
+ qstring_append(json->str, "[ ");
+ json->omit_comma = true;
+}
- return state.result;
+void json_end_array(QJSON *json)
+{
+ qstring_append(json->str, " ]");
+ json->omit_comma = false;
}
-QObject *qobject_from_jsonf(const char *string, ...)
+void json_prop_int(QJSON *json, const char *name, int64_t val)
{
- JSONParsingState state = {};
- va_list ap;
+ json_emit_element(json, name);
+ qstring_append_int(json->str, val);
+}
- va_start(ap, string);
- state.ap = ≈
+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, '"');
+}
- json_message_parser_init(&state.parser, parse_json);
- json_message_parser_feed(&state.parser, string, strlen(string));
- json_message_parser_flush(&state.parser);
- json_message_parser_destroy(&state.parser);
+const char *qjson_get_str(QJSON *json)
+{
+ return qstring_get_str(json->str);
+}
- va_end(ap);
+QJSON *qjson_new(void)
+{
+ QJSON *json = QJSON(object_new(TYPE_QJSON));
+ return json;
+}
- return state.result;
+void qjson_finish(QJSON *json)
+{
+ json_end_object(json);
+}
+
+static void qjson_initfn(Object *obj)
+{
+ QJSON *json = QJSON(obj);
+
+ json->str = qstring_from_str("{ ");
+ json->omit_comma = true;
+}
+
+static void qjson_finalizefn(Object *obj)
+{
+ QJSON *json = QJSON(obj);
+
+ qobject_decref(QOBJECT(json->str));
}
+
+static const TypeInfo qjson_type_info = {
+ .name = TYPE_QJSON,
+ .parent = TYPE_OBJECT,
+ .instance_size = sizeof(QJSON),
+ .instance_init = qjson_initfn,
+ .instance_finalize = qjson_finalizefn,
+};
+
+static void qjson_register_types(void)
+{
+ type_register_static(&qjson_type_info);
+}
+
+type_init(qjson_register_types)