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(a)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