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