From e5e99cbf29b685d1b6357f3e924bfd6bfc3dd236 Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Wed, 27 Feb 2013 14:51:39 +0200 Subject: [PATCH] core: support objects as plugin arguments. --- src/core/plugin.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++------ src/core/plugin.h | 13 +++++++++ 2 files changed, 87 insertions(+), 9 deletions(-) diff --git a/src/core/plugin.c b/src/core/plugin.c index 5d4357b..f72b7b1 100644 --- a/src/core/plugin.c +++ b/src/core/plugin.c @@ -373,21 +373,42 @@ int mrp_unload_plugin(mrp_plugin_t *plugin) pa = plugin->args; da = plugin->descriptor->args; + if (pa != da) { - for (i = 0; i < plugin->descriptor->narg; i++, pa++, da++) { - if (pa->type == MRP_PLUGIN_ARG_TYPE_STRING) { + for (i = 0; i < plugin->descriptor->narg; i++) { + switch (pa->type) { + case MRP_PLUGIN_ARG_TYPE_STRING: if (pa->str != da->str) mrp_free(pa->str); - } - else if (pa->type == MRP_PLUGIN_ARG_TYPE_UNDECL) { - for (j = 0, ra = pa->rest.args; - j < pa->rest.narg; - j++, ra++) { + break; + + case MRP_PLUGIN_ARG_TYPE_OBJECT: + mrp_json_unref(pa->obj.json); + break; + + case MRP_PLUGIN_ARG_TYPE_UNDECL: + ra = pa->rest.args; + for (j = 0; j < pa->rest.narg; j++) { mrp_free(ra->key); - if (ra->type == MRP_PLUGIN_ARG_TYPE_STRING) + switch (ra->type) { + case MRP_PLUGIN_ARG_TYPE_STRING: mrp_free(ra->str); + break; + case MRP_PLUGIN_ARG_TYPE_OBJECT: + mrp_json_unref(ra->obj.json); + break; + default: + break; + } + ra++; } + break; + default: + break; } + + pa++; + da++; } mrp_free(plugin->args); } @@ -598,7 +619,10 @@ static mrp_plugin_descr_t *open_builtin(const char *name) static int parse_plugin_arg(mrp_plugin_arg_t *arg, mrp_plugin_arg_t *parg) { - char *end; + char *end; + mrp_json_t **json; + char *jstr; + int jlen; switch (parg->type) { case MRP_PLUGIN_ARG_TYPE_STRING: @@ -642,6 +666,15 @@ static int parse_plugin_arg(mrp_plugin_arg_t *arg, mrp_plugin_arg_t *parg) else return FALSE; + case MRP_PLUGIN_ARG_TYPE_OBJECT: + jstr = arg->obj.str; + jlen = strlen(jstr); + json = &parg->obj.json; + if (mrp_json_parse_object(&jstr, &jlen, json) < 0 || jlen != 0) + return FALSE; + else + return TRUE; + default: return FALSE; } @@ -652,6 +685,7 @@ static int parse_undeclared_arg(mrp_plugin_arg_t *arg, mrp_plugin_arg_t *pa) { mrp_plugin_arg_t *a; char *value, *end; + int prfx; if (mrp_reallocz(pa->rest.args, pa->rest.narg, pa->rest.narg + 1)) { a = pa->rest.args + pa->rest.narg++; @@ -660,6 +694,13 @@ static int parse_undeclared_arg(mrp_plugin_arg_t *arg, mrp_plugin_arg_t *pa) if (a->key == NULL) return FALSE; + if (arg->str == NULL) { + a->type = MRP_PLUGIN_ARG_TYPE_STRING; + a->str = NULL; + + return TRUE; + } + if (!strncmp(arg->str, "string:", 7)) { value = arg->str + 7; string: @@ -704,6 +745,19 @@ static int parse_undeclared_arg(mrp_plugin_arg_t *arg, mrp_plugin_arg_t *pa) else return FALSE; } + else if (!strncmp(arg->str, "object:", prfx=7) || + !strncmp(arg->str, "json:" , prfx=5)) { + mrp_json_t **json = &a->obj.json; + char *jstr = a->obj.str + prfx; + int jlen = strlen(jstr); + + if (mrp_json_parse_object(&jstr, &jlen, json) < 0 || jlen != 0) + return FALSE; + else { + a->type = MRP_PLUGIN_ARG_TYPE_OBJECT; + return TRUE; + } + } else { if (!strcasecmp(arg->str, "TRUE") || !strcasecmp(arg->str, "FALSE")) { @@ -769,6 +823,17 @@ static int parse_plugin_args(mrp_plugin_t *plugin, memcpy(args, descr->args, descr->narg * sizeof(*args)); plugin->args = args; + for (i = 0, pa = plugin->args; i < descr->narg; i++, pa++) { + if (pa->type == MRP_PLUGIN_ARG_TYPE_OBJECT) { + mrp_json_t **json = &pa->obj.json; + char *jstr = pa->obj.str; + int jlen = strlen(jstr); + + if (mrp_json_parse_object(&jstr, &jlen, json) < 0 || jlen != 0) + return FALSE; + } + } + rest = NULL; j = 0; for (i = 0, a = argv; i < argc; i++, a++) { diff --git a/src/core/plugin.h b/src/core/plugin.h index 911c14c..c006830 100644 --- a/src/core/plugin.h +++ b/src/core/plugin.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -83,6 +84,7 @@ typedef enum { MRP_PLUGIN_ARG_TYPE_UINT32, MRP_PLUGIN_ARG_TYPE_INT32, MRP_PLUGIN_ARG_TYPE_DOUBLE, + MRP_PLUGIN_ARG_TYPE_OBJECT, MRP_PLUGIN_ARG_TYPE_UNDECL, /* add more as needed */ } mrp_plugin_arg_type_t; @@ -98,6 +100,10 @@ struct mrp_plugin_arg_s { uint32_t u32; /* 32-bit unsigned values */ int32_t i32; /* 32-bit signed values */ double dbl; /* double prec. floating pt. values */ + struct { /* a JSON object */ + char *str; + mrp_json_t *json; + } obj; struct { /* other undeclared arguments */ mrp_plugin_arg_t *args; int narg; @@ -128,6 +134,10 @@ struct mrp_plugin_arg_s { #define MRP_PLUGIN_ARG_DOUBLE(name, defval) \ { key: name, type: MRP_PLUGIN_ARG_TYPE_DOUBLE, { dbl: defval } } +#define MRP_PLUGIN_ARG_OBJECT(name, defval) \ + { key: name, type: MRP_PLUGIN_ARG_TYPE_OBJECT, \ + { obj: { str: defval, json: NULL } } } + #define MRP_PLUGIN_ARG_UNDECL(name, defval) \ { key: "*", type: MRP_PLUGIN_ARG_TYPE_UNDECL, { str: NULL } } @@ -150,6 +160,9 @@ struct mrp_plugin_arg_s { #define MRP_PLUGIN_ARGIDX_DOUBLE(idx, name, defval) \ [idx] MRP_PLUGIN_ARG_DOUBLE(name, defval) +#define MRP_PLUGIN_ARGIDX_OBJECT(idx, name, defval) \ + [idx] MRP_PLUGIN_ARG_OBJECT(name, defval) + #define MRP_PLUGIN_ARGIDX_UNDECL(idx, name, defval) \ [idx] MRP_PLUGIN_ARG_UNDECL(name, defval) -- 2.7.4