From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Subject: [Qemu-devel] [PATCH 5/7] add json encoder for qobjects
Date: Sat, 17 Oct 2009 09:55:34 +0200 [thread overview]
Message-ID: <1255766136-3028-6-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1255766136-3028-1-git-send-email-pbonzini@redhat.com>
The JSON encoder is just a virtual method on QObject.
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
Makefile | 4 ++--
qdict.c | 32 ++++++++++++++++++++++++++++++++
qint.c | 16 ++++++++++++++++
qlist.c | 28 ++++++++++++++++++++++++++++
qobject.h | 10 ++++++++++
qstring.c | 32 ++++++++++++++++++++++++++++++++
qstring.h | 5 +++++
7 files changed, 125 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
index 7d4d75c..2447d23 100644
--- a/Makefile
+++ b/Makefile
@@ -210,10 +210,10 @@ qemu-io$(EXESUF): qemu-io.o qemu-tool.o cmd.o $(block-obj-y)
qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx
$(call quiet-command,sh $(SRC_PATH)/hxtool -h < $< > $@," GEN $@")
-check-qint: check-qint.o qint.o qemu-malloc.o
+check-qint: check-qint.o qint.o qstring.o qemu-malloc.o
check-qstring: check-qstring.o qstring.o qemu-malloc.o
check-qdict: check-qdict.o qdict.o qint.o qstring.o qemu-malloc.o
-check-qlist: check-qlist.o qlist.o qint.o qemu-malloc.o
+check-qlist: check-qlist.o qlist.o qint.o qstring.o qemu-malloc.o
clean:
# avoid old build problems by removing potentially incorrect old files
diff --git a/qdict.c b/qdict.c
index a302f4c..efbc53d 100644
--- a/qdict.c
+++ b/qdict.c
@@ -18,10 +18,12 @@
#include "qemu-common.h"
static void qdict_destroy_obj(QObject *obj);
+static void qdict_encode_json(const QObject *obj, QString *str);
static const QType qdict_type = {
.code = QTYPE_QDICT,
.destroy = qdict_destroy_obj,
+ .encode_json = qdict_encode_json,
};
/**
@@ -295,3 +297,33 @@ static void qdict_destroy_obj(QObject *obj)
qemu_free(qdict);
}
+
+/**
+ * qdict_encode_json(): Encode the dictionary to JSON on a QString.
+ */
+static void qdict_encode_json(const QObject *obj, QString *str)
+{
+ int i, first;
+ const QDict *qdict;
+
+ assert(obj != NULL);
+ qdict = qobject_to_qdict((QObject *) obj);
+
+ qstring_append_ch (str, '{');
+ for (first = 1, i = 0; i < QDICT_HASH_SIZE; i++) {
+ QDictEntry *entry = QLIST_FIRST(&qdict->table[i]);
+ while (entry) {
+ if (!first)
+ qstring_append_ch (str, ',');
+ qstring_append_ch (str, '"');
+ qstring_append_escaped (str, entry->key);
+ qstring_append_ch (str, '"');
+ qstring_append_ch (str, ':');
+ qobject_encode_json (entry->value, str);
+ entry = QLIST_NEXT(entry, next);
+ first = 0;
+ }
+ }
+
+ qstring_append_ch (str, '}');
+}
diff --git a/qint.c b/qint.c
index 447e847..b5ceea3 100644
--- a/qint.c
+++ b/qint.c
@@ -10,14 +10,17 @@
* the COPYING file in the top-level directory.
*/
#include "qint.h"
+#include "qstring.h"
#include "qobject.h"
#include "qemu-common.h"
static void qint_destroy_obj(QObject *obj);
+static void qint_encode_json(const QObject *obj, QString *str);
static const QType qint_type = {
.code = QTYPE_QINT,
.destroy = qint_destroy_obj,
+ .encode_json = qint_encode_json,
};
/**
@@ -64,3 +67,16 @@ static void qint_destroy_obj(QObject *obj)
assert(obj != NULL);
qemu_free(qobject_to_qint(obj));
}
+
+/**
+ * qint_encode_json(): Encode the integer to JSON on a QString.
+ */
+static void qint_encode_json(const QObject *obj, QString *str)
+{
+ char buf[32];
+ QInt *qint;
+
+ qint = qobject_to_qint((QObject *) obj);
+ sprintf (buf, "%" PRId64, qint->value);
+ qstring_append (str, buf);
+}
diff --git a/qlist.c b/qlist.c
index ba2c66c..4c7e1b2 100644
--- a/qlist.c
+++ b/qlist.c
@@ -10,15 +10,18 @@
* the COPYING file in the top-level directory.
*/
#include "qlist.h"
+#include "qstring.h"
#include "qobject.h"
#include "qemu-queue.h"
#include "qemu-common.h"
static void qlist_destroy_obj(QObject *obj);
+static void qlist_encode_json(const QObject *obj, QString *str);
static const QType qlist_type = {
.code = QTYPE_QLIST,
.destroy = qlist_destroy_obj,
+ .encode_json = qlist_encode_json,
};
/**
@@ -98,3 +101,28 @@ static void qlist_destroy_obj(QObject *obj)
qemu_free(qlist);
}
+
+/**
+ * qlist_encode_json(): Encode the list to JSON on a QString.
+ */
+static void qlist_encode_json(const QObject *obj, QString *str)
+{
+ const QList *qlist;
+ QListEntry *entry;
+ int first;
+
+ assert(obj != NULL);
+ qlist = qobject_to_qlist((QObject *) obj);
+
+ first = 1;
+ qstring_append_ch (str, '[');
+ QTAILQ_FOREACH(entry, &qlist->head, next) {
+ if (!first)
+ qstring_append_ch (str, ',');
+ qobject_encode_json (entry->value, str);
+ first = 0;
+ }
+
+ qstring_append_ch (str, ']');
+}
+
diff --git a/qobject.h b/qobject.h
index f5c78b2..d941a73 100644
--- a/qobject.h
+++ b/qobject.h
@@ -52,6 +52,7 @@ struct QList;
typedef struct QType {
qtype_code code;
void (*destroy)(struct QObject *);
+ void (*encode_json)(const struct QObject *, struct QString *);
} QType;
typedef struct QObject {
@@ -112,4 +113,13 @@ static inline qtype_code qobject_type(const QObject *obj)
return obj->type->code;
}
+/**
+ * qobject_type(): Return the QObject's type
+ */
+static inline void qobject_encode_json(const QObject *obj, struct QString *str)
+{
+ assert(obj->type != NULL);
+ obj->type->encode_json (obj, str);
+}
+
#endif /* QOBJECT_H */
diff --git a/qstring.c b/qstring.c
index ab77fba..10c1952 100644
--- a/qstring.c
+++ b/qstring.c
@@ -14,10 +14,12 @@
#include "qemu-common.h"
static void qstring_destroy_obj(QObject *obj);
+static void qstring_encode_json(const QObject *obj, QString *str);
static const QType qstring_type = {
.code = QTYPE_QSTRING,
.destroy = qstring_destroy_obj,
+ .encode_json = qstring_encode_json,
};
/**
@@ -63,6 +65,22 @@ QString *qstring_from_str(const char *str)
}
/**
+ * qstring_json_from_qobject_obj(): Encode a QObject as JSON and return
+ * a QString with the result.
+ *
+ * Return strong reference.
+ */
+QString *qstring_json_from_qobject_obj(const QObject *qobject)
+{
+ QString *qstring;
+
+ qstring = qstring_new();
+ qobject_encode_json(qobject, qstring);
+ return qstring;
+}
+
+
+/**
* qstring_append(): Append a regular C string to a QString
*/
void qstring_append(QString *qstring, const char *str)
@@ -172,3 +190,17 @@ static void qstring_destroy_obj(QObject *obj)
qemu_free(qs->string);
qemu_free(qs);
}
+
+/**
+ * qstring_encode_json(): Encode the string to JSON on a QString.
+ */
+static void qstring_encode_json(const QObject *obj, QString *str)
+{
+ QString *qstring;
+
+ assert(obj != NULL);
+ qstring = qobject_to_qstring((QObject *) obj);
+ qstring_append_ch (str, '"');
+ qstring_append_escaped (str, qstring_get_str(qstring));
+ qstring_append_ch (str, '"');
+}
diff --git a/qstring.h b/qstring.h
index 6e16d58..efc1d7a 100644
--- a/qstring.h
+++ b/qstring.h
@@ -11,6 +11,11 @@ typedef struct QString {
QString *qstring_new(void);
QString *qstring_from_str(const char *str);
+QString *qstring_json_from_qobject_obj(const QObject *obj);
+
+#define qstring_json_from_qobject(obj) \
+ qstring_json_from_qobject_obj(QOBJECT(obj))
+
const char *qstring_get_str(const QString *qstring);
void qstring_append(QString *qstring, const char *str);
void qstring_append_escaped(QString *qstring, const char *str);
--
1.6.2.5
next prev parent reply other threads:[~2009-10-17 7:55 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-17 7:55 [Qemu-devel] [PATCH 0/7] Add JSON enconding and formatted printing to QObject Paolo Bonzini
2009-10-17 7:55 ` [Qemu-devel] [PATCH 1/7] add qemu_memdup Paolo Bonzini
2009-10-17 7:55 ` [Qemu-devel] [PATCH 2/7] allow passing NULL to qobject_type Paolo Bonzini
2009-10-17 7:55 ` [Qemu-devel] [PATCH 3/7] forward declare all QObject subclasses in qobject.h Paolo Bonzini
2009-10-17 13:02 ` Anthony Liguori
2009-10-17 7:55 ` [Qemu-devel] [PATCH 4/7] add mutable qstring functions Paolo Bonzini
2009-10-17 13:03 ` Anthony Liguori
2009-10-17 7:55 ` Paolo Bonzini [this message]
2009-10-17 13:03 ` [Qemu-devel] [PATCH 5/7] add json encoder for qobjects Anthony Liguori
2009-10-17 13:44 ` Paolo Bonzini
2009-10-17 16:20 ` Anthony Liguori
2009-10-17 7:55 ` [Qemu-devel] [PATCH 6/7] add testsuite for qobject json encoder Paolo Bonzini
2009-10-17 7:55 ` [Qemu-devel] [PATCH 7/7] add formatted printing of QObjects Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1255766136-3028-6-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).