From 7cf79fa127a4b61afb920d4766432bc26352cca6 Mon Sep 17 00:00:00 2001 From: "alexey.stratulat" <alexey.stratulat@demlabs.net> Date: Thu, 23 Jan 2020 23:29:40 +0700 Subject: [PATCH] [+] Added functions to work with manifest python plugins. --- include/dap_chain_plugins_manifest.h | 50 +++++++++++++++ src/dap_chain_plugins_manifest.c | 92 ++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 include/dap_chain_plugins_manifest.h create mode 100644 src/dap_chain_plugins_manifest.c diff --git a/include/dap_chain_plugins_manifest.h b/include/dap_chain_plugins_manifest.h new file mode 100644 index 0000000..c4b9b3b --- /dev/null +++ b/include/dap_chain_plugins_manifest.h @@ -0,0 +1,50 @@ +#ifndef _DAP_CHAIN_PLUGINS_MANIFEST_ +#define _DAP_CHAIN_PLUGINS_MANIFEST_ +#include "dap_common.h" +#include "dap_list.h" +#include "dap_strfuncs.h" +#include "stdio.h" +#include "json-c/json_object.h" +#include "json-c/json_tokener.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +#undef LOG_TAG +#define LOG_TAG "dap_chain_plugins_manifest" + +enum data_in_manifest{ + NAME, + VERSION, + DEPENDENCYS, + AUTHOR, + DESCRIPTION +}; + +typedef struct manifest{ + char *name; + char *version; + dap_list_t *dependencys; + char *author; + char *description; +}manifest_t; + +manifest_t *dap_chain_plugins_manifest_new(const char *name, const char *version, const dap_list_t *dep, const char *author, + const char *description); +void dap_chain_plugins_manifest_free(manifest_t *manifest); +manifest_t* dap_chain_plugins_add_manifest_from_file(const char *file_path); + +static dap_list_t *manifests; + +void dap_chain_plugins_manifest_list_create(); +manifest_t *dap_chain_plugins_manifest_get_list(size_t index); +void dap_chain_plugins_manifest_list_free(); +void dap_chain_plugins_manifest_list_add_manifest(manifest_t *manifest); +bool dap_chain_plugins_manifest_list_add_from_file(const char *file_path); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/dap_chain_plugins_manifest.c b/src/dap_chain_plugins_manifest.c new file mode 100644 index 0000000..877c5f3 --- /dev/null +++ b/src/dap_chain_plugins_manifest.c @@ -0,0 +1,92 @@ +#include "dap_chain_plugins_manifest.h" + +dap_list_t *JSON_array_to_dap_list(json_object *obj){ + int len = json_object_array_length(obj); + dap_list_t *list = dap_list_alloc(); + json_object *j_data; + char *data; + for (int i = 0; i < len; i++){ + j_data = json_object_array_get_idx(obj, i); + data = dap_strdup(json_object_get_string(j_data)); + dap_list_append(list, data); + } + return list; +} + +manifest_t *dap_chain_plugins_manifest_new(const char *name, const char *version, const dap_list_t *dep, const char *author, + const char *description){ + manifest_t *manifest = DAP_NEW(manifest_t); + manifest->name = dap_strdup(name); + manifest->version = dap_strdup(version); + manifest->dependencys = dap_list_copy(dep); + manifest->author = dap_strdup(author); + manifest->description = dap_strdup(description); + return manifest; +} +void dap_chain_plugins_manifest_free(manifest_t *manifest){ + free(manifest->name); + free(manifest->version); + free(manifest->author); + free(manifest->description); + dap_list_free(manifest->dependencys); + free(manifest); +} +manifest_t* dap_chain_plugins_add_manifest_from_file(const char *file_path){ + //READ File in char + log_it(L_INFO, "Parse json file"); + FILE *file = fopen(file_path, "rt"); + if (file == NULL){ + log_it(L_INFO, "Parse json file"); + return NULL; + } + fseek(file, 0, SEEK_END); + size_t size_file = (size_t)ftell(file); + char *json = DAP_NEW_SIZE(char, size_file); + rewind(file); + fread(json, sizeof(char), size_file, file); + fclose(file); + //Parse JSON + json_object *j_obj = json_tokener_parse(json); + json_object *j_name = json_object_object_get(j_obj, "name"); + json_object *j_version = json_object_object_get(j_obj, "version"); + json_object *j_dependencys = json_object_object_get(j_obj, "dependencys"); + json_object *j_author = json_object_object_get(j_obj, "author"); + json_object *j_description = json_object_object_get(j_obj, "description"); + const char *name, *version, *author, *description; + name = json_object_get_string(j_name); + version = json_object_get_string(j_version); + author = json_object_get_string(j_author); + description = json_object_get_string(j_description); + dap_list_t *dep = JSON_array_to_dap_list(j_dependencys); + DAP_FREE(json); + manifest_t *manifest = dap_chain_plugins_manifest_new(name, version, dep, author, description); + return manifest; +} + +//-------------------------------------------------------- +void dap_chain_plugins_manifest_list_create(){ + manifests = dap_list_alloc(); +} +manifest_t *dap_chain_plugins_manifest_get_list(size_t index){ + return (manifest_t*)dap_list_nth_data(manifests, (unsigned int)index); +} + +void dap_chain_plugins_manifest_list_free(){ + unsigned int len = dap_list_length(manifests); + for (unsigned int i = 0; i < len;i++){ + manifest_t* manifest = dap_list_nth_data(manifests, i); + dap_chain_plugins_manifest_free(manifest); + } + dap_list_free(manifests); +} + +void dap_chain_plugins_manifest_list_add_manifest(manifest_t *manifest){ + manifests = dap_list_append(manifests, manifest); +} +bool dap_chain_plugins_manifest_list_add_from_file(const char *file_path){ + manifest_t *manifest = dap_chain_plugins_add_manifest_from_file(file_path); + if (manifest == NULL) + return false; + dap_chain_plugins_manifest_list_add_manifest(manifest); + return true; +} -- GitLab