From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH RFC V2 02/10] libxl_json: introduce libx__object_from_json Date: Thu, 17 Apr 2014 12:13:03 +0100 Message-ID: <1397733191-31892-3-git-send-email-wei.liu2@citrix.com> References: <1397733191-31892-1-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1397733191-31892-1-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Wei Liu , ian.jackson@eu.citrix.com, ian.campbell@citrix.com List-Id: xen-devel@lists.xenproject.org Given a JSON string, we need to convert it to libxl_FOO struct. The approach is: JSON string -> libxl__json_object -> libxl_FOO struct With this approach we can make use of libxl's infrastructure to do the first half (JSON string -> libxl__json_object). Second half is done by auto-generated code by libxl's IDL infrastructure. IDL patch(es) will come later. Signed-off-by: Wei Liu --- tools/libxl/libxl_internal.h | 9 +++++++++ tools/libxl/libxl_json.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index c2b73c4..9205c49 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1496,6 +1496,15 @@ typedef yajl_gen_status (*libxl__gen_json_callback)(yajl_gen hand, void *); _hidden char *libxl__object_to_json(libxl_ctx *ctx, const char *type, libxl__gen_json_callback gen, void *p); +typedef struct libxl__json_object libxl__json_object; +typedef int (*libxl__json_parse_callback)(libxl_ctx *ctx, + libxl__json_object *o, + void *p); +_hidden int libxl__object_from_json(libxl_ctx *ctx, const char *type, + libxl__json_parse_callback parse, + void *p, + const char *s); + /* holds the CPUID response for a single CPUID leaf * input contains the value of the EAX and ECX register, * and each policy string contains a filter to apply to diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c index 3ea56a4..361607f 100644 --- a/tools/libxl/libxl_json.c +++ b/tools/libxl/libxl_json.c @@ -794,6 +794,36 @@ out: return ret; } +int libxl__object_from_json(libxl_ctx *ctx, const char *type, + libxl__json_parse_callback parse, + void *p, const char *s) +{ + GC_INIT(ctx); + libxl__json_object *o; + int rc; + + o = libxl__json_parse(gc, s); + if (!o) { + LOG(ERROR, + "unable to generate libxl__json_object from JSON representation of %s.", + type); + rc = ERROR_FAIL; + goto out; + } + + rc = parse(ctx, o, p); + if (rc) { + LOG(ERROR, "unable to convert libxl__json_object to %s.", type); + rc = ERROR_FAIL; + goto out; + } + + rc = 0; +out: + GC_FREE; + return rc; +} + /* * Local variables: * mode: C -- 1.7.10.4