Patchwork [10/11] Add a QObject JSON wrapper

login
register
mail settings
Submitter Anthony Liguori
Date Nov. 11, 2009, 5:29 p.m.
Message ID <1257960543-26373-10-git-send-email-aliguori@us.ibm.com>
Download mbox | patch
Permalink /patch/38160/
State New
Headers show

Comments

Anthony Liguori - Nov. 11, 2009, 5:29 p.m.
This provides a QObject interface for creating QObjects from a JSON expression.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
---
 Makefile |    2 +-
 qjson.c  |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 qjson.h  |   23 +++++++++++++++++++++++
 3 files changed, 84 insertions(+), 1 deletions(-)
 create mode 100644 qjson.c
 create mode 100644 qjson.h
Luiz Capitulino - Nov. 11, 2009, 6:12 p.m.
On Wed, 11 Nov 2009 11:29:02 -0600
Anthony Liguori <aliguori@us.ibm.com> wrote:

> This provides a QObject interface for creating QObjects from a JSON expression.
> 
> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
> ---
>  Makefile |    2 +-
>  qjson.c  |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  qjson.h  |   23 +++++++++++++++++++++++
>  3 files changed, 84 insertions(+), 1 deletions(-)
>  create mode 100644 qjson.c
>  create mode 100644 qjson.h
> 
> diff --git a/Makefile b/Makefile
> index 6d68a1f..3818c51 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -136,7 +136,7 @@ obj-y += qemu-char.o aio.o savevm.o
>  obj-y += msmouse.o ps2.o
>  obj-y += qdev.o qdev-properties.o
>  obj-y += qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o json-lexer.o
> -obj-y += json-streamer.o json-parser.o
> +obj-y += json-streamer.o json-parser.o qjson.o
>  obj-y += qemu-config.o
>  
>  obj-$(CONFIG_BRLAPI) += baum.o
> diff --git a/qjson.c b/qjson.c
> new file mode 100644
> index 0000000..45207f2
> --- /dev/null
> +++ b/qjson.c
> @@ -0,0 +1,60 @@
> +/*
> + * QObject JSON integration
> + *
> + * Copyright IBM, Corp. 2009
> + *
> + * Authors:
> + *  Anthony Liguori   <aliguori@us.ibm.com>
> + *
> + * 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"
> +
> +typedef struct JSONParsingState
> +{
> +    JSONMessageParser parser;
> +    va_list *ap;
> +    QObject *result;
> +} JSONParsingState;
> +
> +static void parse_json(JSONMessageParser *parser, QList *tokens)
> +{
> +    JSONParsingState *s = container_of(parser, JSONParsingState, parser);
> +    s->result = json_parser_parse(tokens, s->ap);
> +}
> +
> +QObject *qobject_from_json(const char *string)
> +{
> +    JSONParsingState state = {};
> +
> +    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);
> +
> +    return state.result;
> +}
> +
> +QObject *qobject_from_jsonf(const char *string, ...)
> +{
> +    JSONParsingState state = {};
> +    va_list ap;
> +
> +    va_start(ap, string);
> +    state.ap = &ap;
> +
> +    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);
> +
> +    va_end(ap);
> +
> +    return state.result;

 I think we should abort() on error, assuming the only way to fail
is a bad syntax.
Anthony Liguori - Nov. 11, 2009, 7:39 p.m.
Luiz Capitulino wrote:
>  I think we should abort() on error, assuming the only way to fail
> is a bad syntax.
>   

We'll be using qobject_from_jsonf() to parse incoming QMP traffic.   We 
definitely don't want to abort when we receive invalid input on the QMP 
port.   Best to just close the session and let the user connect again.

Regards,

Anthony Liguori
Luiz Capitulino - Nov. 11, 2009, 7:58 p.m.
On Wed, 11 Nov 2009 13:39:29 -0600
Anthony Liguori <anthony@codemonkey.ws> wrote:

> Luiz Capitulino wrote:
> >  I think we should abort() on error, assuming the only way to fail
> > is a bad syntax.
> >   
> 
> We'll be using qobject_from_jsonf() to parse incoming QMP traffic.   We 
> definitely don't want to abort when we receive invalid input on the QMP 
> port.   Best to just close the session and let the user connect again.

 Sure, I just wouldn't like to add a check on every handler call to
qobject_from_jsonf().

 What about a new wrapper?

Patch

diff --git a/Makefile b/Makefile
index 6d68a1f..3818c51 100644
--- a/Makefile
+++ b/Makefile
@@ -136,7 +136,7 @@  obj-y += qemu-char.o aio.o savevm.o
 obj-y += msmouse.o ps2.o
 obj-y += qdev.o qdev-properties.o
 obj-y += qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o json-lexer.o
-obj-y += json-streamer.o json-parser.o
+obj-y += json-streamer.o json-parser.o qjson.o
 obj-y += qemu-config.o
 
 obj-$(CONFIG_BRLAPI) += baum.o
diff --git a/qjson.c b/qjson.c
new file mode 100644
index 0000000..45207f2
--- /dev/null
+++ b/qjson.c
@@ -0,0 +1,60 @@ 
+/*
+ * QObject JSON integration
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ *  Anthony Liguori   <aliguori@us.ibm.com>
+ *
+ * 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"
+
+typedef struct JSONParsingState
+{
+    JSONMessageParser parser;
+    va_list *ap;
+    QObject *result;
+} JSONParsingState;
+
+static void parse_json(JSONMessageParser *parser, QList *tokens)
+{
+    JSONParsingState *s = container_of(parser, JSONParsingState, parser);
+    s->result = json_parser_parse(tokens, s->ap);
+}
+
+QObject *qobject_from_json(const char *string)
+{
+    JSONParsingState state = {};
+
+    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);
+
+    return state.result;
+}
+
+QObject *qobject_from_jsonf(const char *string, ...)
+{
+    JSONParsingState state = {};
+    va_list ap;
+
+    va_start(ap, string);
+    state.ap = &ap;
+
+    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);
+
+    va_end(ap);
+
+    return state.result;
+}
diff --git a/qjson.h b/qjson.h
new file mode 100644
index 0000000..38be643
--- /dev/null
+++ b/qjson.h
@@ -0,0 +1,23 @@ 
+/*
+ * QObject JSON integration
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ *  Anthony Liguori   <aliguori@us.ibm.com>
+ *
+ * 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.
+ *
+ */
+
+#ifndef QJSON_H
+#define QJSON_H
+
+#include "qobject.h"
+
+QObject *qobject_from_json(const char *string);
+QObject *qobject_from_jsonf(const char *string, ...)
+    __attribute__((__format__ (__printf__, 1, 2)));
+
+#endif /* QJSON_H */