/*
- * Copyright (C) 2016, 2017, 2018 "IoT.bzh"
+ * Copyright (C) 2016-2019 "IoT.bzh"
* Author José Bollo <jose.bollo@iot.bzh>
*
* Licensed under the Apache License, Version 2.0 (the "License");
int refcount;
int count;
struct afb_verb_v3 **verbs;
+#if WITH_LEGACY_BINDING_V2
const struct afb_verb_v2 *verbsv2;
+#endif
const struct afb_verb_v3 *verbsv3;
struct afb_export *export;
const char *info;
void afb_api_v3_process_call(struct afb_api_v3 *api, struct afb_xreq *xreq)
{
const struct afb_verb_v3 *verbsv3;
+#if WITH_LEGACY_BINDING_V2
const struct afb_verb_v2 *verbsv2;
+#endif
const char *name;
name = xreq->request.called_verb;
return;
}
+#if WITH_LEGACY_BINDING_V2
/* look in legacy set */
verbsv2 = api->verbsv2;
if (verbsv2) {
}
}
}
-
+#endif
afb_xreq_reply_unknown_verb(xreq);
}
json_object_object_add(i, "version", json_object_new_string("0.0.0"));
json_object_object_add(i, "description", json_object_new_string(api->info));
+ buffer[0] = '/';
+ buffer[sizeof buffer - 1] = 0;
+
p = json_object_new_object();
json_object_object_add(r, "paths", p);
iter = api->verbs;
end = iter + api->count;
while (iter != end) {
verb = *iter++;
- buffer[0] = '/';
- strncpy(buffer + 1, verb->verb, sizeof buffer - 1);
+ strncpy(buffer + 1, verb->verb, sizeof buffer - 2);
json_object_object_add(p, buffer, describe_verb_v3(verb));
}
verb = api->verbsv3;
if (verb)
while(verb->verb) {
- buffer[0] = '/';
- strncpy(buffer + 1, verb->verb, sizeof buffer - 1);
+ strncpy(buffer + 1, verb->verb, sizeof buffer - 2);
json_object_object_add(p, buffer, describe_verb_v3(verb));
verb++;
}
return r;
}
-struct afb_api_v3 *afb_api_v3_create(
- struct afb_apiset *declare_set,
+struct afb_api_v3 *afb_api_v3_create(struct afb_apiset *declare_set,
struct afb_apiset *call_set,
const char *apiname,
const char *info,
int noconcurrency,
int (*preinit)(void*, struct afb_api_x3 *),
void *closure,
- int copy_info
-)
+ int copy_info,
+ struct afb_export* creator,
+ const char* path)
{
struct afb_api_v3 *api;
/* allocates the description */
api = calloc(1, sizeof *api + (copy_info && info ? 1 + strlen(info) : 0));
- if (!api)
+ if (!api) {
+ ERROR("out of memory");
goto oom;
+ }
api->refcount = 1;
if (!info)
api->info = &nulchar;
else
api->info = info;
- api->export = afb_export_create_v3(declare_set, call_set, apiname, api);
+ api->export = afb_export_create_v3(declare_set, call_set, apiname, api, creator, path);
if (!api->export)
goto oom2;
oom2:
free(api);
oom:
- ERROR("out of memory");
return NULL;
}
{
if (api && !__atomic_sub_fetch(&api->refcount, 1, __ATOMIC_RELAXED)) {
afb_export_destroy(api->export);
+ while (api->count)
+ free(api->verbs[--api->count]);
+ free(api->verbs);
free(api);
}
}
return api->export;
}
+#if WITH_LEGACY_BINDING_V2
void afb_api_v3_set_verbs_v2(
struct afb_api_v3 *api,
const struct afb_verb_v2 *verbs)
{
api->verbsv2 = verbs;
}
+#endif
void afb_api_v3_set_verbs_v3(
struct afb_api_v3 *api,
const char *verb,
void **vcbdata)
{
- struct afb_verb_v3 **v, **e, *i;
+ struct afb_verb_v3 *v;
+ int i;
- v = api->verbs;
- e = &v[api->count];
- while (v != e) {
- i = *v++;
- if (!strcasecmp(i->verb, verb)) {
- api->count--;
+ for (i = 0 ; i < api->count ; i++) {
+ v = api->verbs[i];
+ if (!strcasecmp(verb, v->verb)) {
+ api->verbs[i] = api->verbs[--api->count];
if (vcbdata)
- *vcbdata = i->vcbdata;
- if (v != e)
- *--v = *--e;
- free(i);
+ *vcbdata = v->vcbdata;
+ free(v);
return 0;
}
}
if (!rc && desc->require_class)
rc = afb_api_x3_require_class(api, desc->require_class);
if (!rc && desc->require_api)
- rc = afb_api_x3_require_api(api, desc->require_api, 1);
+ rc = afb_api_x3_require_api(api, desc->require_api, 0);
return rc;
}
struct afb_api_v3 *afb_api_v3_from_binding(const struct afb_binding_v3 *desc, struct afb_apiset *declare_set, struct afb_apiset * call_set)
{
- return afb_api_v3_create(declare_set, call_set, desc->api, desc->info, desc->noconcurrency, init_binding, (void*)desc, 0);
+ return afb_api_v3_create(declare_set, call_set, desc->api, desc->info, desc->noconcurrency, init_binding, (void*)desc, 0, NULL, NULL);
}