[libvirt] [PATCH 05/12] Add a JSON generator API.

Miloslav Trmač mitr at redhat.com
Thu Sep 20 18:24:04 UTC 2012


This allows incremental use of virJSONStringGeneratorAddProperties
without constructing a full object first, while isolating the rest of
libvirt from the yajl dependency.

Will be used later.

Signed-off-by: Miloslav Trmač <mitr at redhat.com>
---
 src/util/json.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/util/json.h |  3 +++
 2 files changed, 63 insertions(+)

diff --git a/src/util/json.c b/src/util/json.c
index 9b0a6dd..03362c4 100644
--- a/src/util/json.c
+++ b/src/util/json.c
@@ -1094,6 +1094,66 @@ static yajl_gen virYAJLInit(bool pretty)
     return g;
 }
 
+/**
+ * virJSONStringGeneratorInitObject:
+ *
+ * Allocate a generator for creating a string representation of an object using
+ * one or more calls to virJSONStringGeneratorAddProperties().
+ *
+ * Returns the generator on success, NULL on error.
+ */
+virJSONStringGeneratorPtr virJSONStringGeneratorInitObject(void)
+{
+    yajl_gen g;
+
+    g = virYAJLInit(false);
+    if (g == NULL)
+        goto error;
+    if (yajl_gen_map_open(g) != yajl_gen_status_ok)
+        goto error;
+    return g;
+
+ error:
+    if (g != NULL)
+        yajl_gen_free(g);
+    return NULL;
+}
+
+/**
+ * virJSONStringGeneratorFinishObject:
+ * @gen: the destination generator
+ *
+ * Terminate the object being generated in @gen, and return its string value
+ * (or NULL on error).  The value is valid until @gen is freed.
+ */
+const char *virJSONStringGeneratorFinishObject(virJSONStringGeneratorPtr gen)
+{
+    const unsigned char *res;
+    yajl_size_t len;
+
+    if (yajl_gen_map_close(gen) != yajl_gen_status_ok)
+        goto error;
+    if (yajl_gen_get_buf(gen, &res, &len) != yajl_gen_status_ok)
+        goto error;
+    return (const char *)res;
+
+ error:
+    return NULL;
+}
+
+/**
+ * virJSONStringGeneratorFree:
+ * @gen: the generator
+ *
+ * Free @gen if it is not NULL.  Invalidates the result of
+ * virJSONStringGeneratorFinishObject().
+ */
+void virJSONStringGeneratorFree(virJSONStringGeneratorPtr gen)
+{
+    if (gen != NULL)
+        yajl_gen_free(gen);
+}
+
 static int virJSONValueToStringOne(virJSONValuePtr object,
                                    yajl_gen g)
 {
diff --git a/src/util/json.h b/src/util/json.h
index 390e68d..80041eb 100644
--- a/src/util/json.h
+++ b/src/util/json.h
@@ -151,8 +151,11 @@ void virJSONStaticObjectAppendNumberInt(virJSONObjectPtr object,
                                         char *buf, size_t buf_size,
                                         int value);
 
+virJSONStringGeneratorPtr virJSONStringGeneratorInitObject(void);
 int virJSONStringGeneratorAddProperties(virJSONStringGeneratorPtr gen,
                                         virJSONObjectPtr object);
+const char *virJSONStringGeneratorFinishObject(virJSONStringGeneratorPtr gen);
+void virJSONStringGeneratorFree(virJSONStringGeneratorPtr gen);
 
 virJSONValuePtr virJSONValueFromString(const char *jsonstring);
 char *virJSONValueToString(virJSONValuePtr object,
-- 
1.7.11.4




More information about the libvir-list mailing list