From fe40f4f4f45f9b2e269d1cd799352d9d25aa3508 Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Fri, 13 Mar 2020 16:41:43 +0700
Subject: [PATCH] [*] Fix. The list of loaded plugins now also uses utlist
 instead of dap_list_t. A function has been added to check if all plugins from
 the list are arguments, which is an argument to the function.

---
 include/dap_chain_plugins_list.h |  30 +++-----
 src/dap_chain_plugins_list.c     | 126 ++++++++++---------------------
 2 files changed, 49 insertions(+), 107 deletions(-)

diff --git a/include/dap_chain_plugins_list.h b/include/dap_chain_plugins_list.h
index 7d5336a..0231547 100644
--- a/include/dap_chain_plugins_list.h
+++ b/include/dap_chain_plugins_list.h
@@ -3,9 +3,11 @@
 
 #include "Python.h"
 #include "stdbool.h"
-#include "dap_list.h"
+//#include "dap_list.h"
 #include "dap_common.h"
 #include "dap_strfuncs.h"
+#include "utlist.h"
+#include "dap_chain_plugins_manifest.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,34 +16,24 @@ extern "C" {
 #undef LOG_TAG
 #define LOG_TAG "dap_chain_plugins_list"
 
-typedef struct dap_chain_plugin_module{
+typedef struct dap_chain_list_plugin_module{
     char *name;
     PyObject *obj_module;
     bool isFuncOnChainsUpdated;
     bool isFuncOnGdbUpdated;
     bool isFuncOnNetStatusChanged;
-}dap_chain_plugins_module_t;
+    struct dap_chain_list_plugin_module *next;
+}dap_chain_plugin_list_module_t;
 
-static dap_list_t* dap_chain_plugins_module_list;
+static dap_chain_plugin_list_module_t* m_dap_chain_plugins_module_list;
 
-int dap_chain_plugins_list_init();
-void dap_chain_plugins_list_deint();
+void dap_chain_plugins_list_init();
 
-void dap_chain_plugins_list_add(PyObject *module, const char *name);
-
-unsigned int dap_chain_plugins_list_lenght();
-
-dap_chain_plugins_module_t *dap_chain_plugins_list_get_module(unsigned int id);
-PyObject *dap_chain_plugins_list_get_object(unsigned int id);
+dap_chain_plugin_list_module_t* dap_chain_plugins_list_get();
 
-bool dap_chai_plugins_list_module_check_on_chains_updated(unsigned int id);
-bool dap_chai_plugins_list_module_check_on_gdb_updated(unsigned int id);
-bool dap_chai_plugins_list_module_check_on_net_status_updated(unsigned int id);
-
-bool dap_chain_plugins_list_module_del(dap_chain_plugins_module_t *module);
-bool dap_chain_plugins_list_id_del(unsigned int id_module);
-bool dap_chain_plugins_list_name_del(const char *name_module);
+bool dap_chain_plugins_list_check_load_plugins(dap_chain_plugins_list_char_t *list);
 
+void dap_chain_plugins_list_add(PyObject *module, const char *name);
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/dap_chain_plugins_list.c b/src/dap_chain_plugins_list.c
index 224a170..9529b01 100644
--- a/src/dap_chain_plugins_list.c
+++ b/src/dap_chain_plugins_list.c
@@ -1,109 +1,59 @@
 #include "dap_chain_plugins_list.h"
 
-int dap_chain_plugins_list_init(){
-    dap_chain_plugins_module_list = dap_list_alloc();
-}
-void dap_chain_plugins_list_deint(){
-    unsigned int len = dap_chain_plugins_list_lenght();
-    if (len > 0){
-        for (unsigned int i=0; i < len; i++){
-            dap_chain_plugins_list_id_del(i);
-        }
-    }
-    dap_list_free(dap_chain_plugins_module_list);
+void dap_chain_plugins_list_init(){
+    m_dap_chain_plugins_module_list = NULL;
 }
 
 void dap_chain_plugins_list_add(PyObject *module, const char *name){
-    dap_chain_plugins_module_t *module_s = (dap_chain_plugins_module_t*)malloc(sizeof (dap_chain_plugins_module_t));
-    module_s->name = dap_strdup(name);
-    module_s->obj_module = module;
-    module_s->isFuncOnGdbUpdated = true;
-    module_s->isFuncOnChainsUpdated = true;
-    module_s->isFuncOnNetStatusChanged = true;
-    //Checking func
-    PyObject *F_FuncOnGdbUpdated = PyObject_GetAttrString(module_s->obj_module, "onGdbUpdated");
-    PyObject *F_FuncOnChainsUpdated = PyObject_GetAttrString(module_s->obj_module, "onChainsUpdated");
-    PyObject *F_FuncOnNetStatusChanged = PyObject_GetAttrString(module_s->obj_module, "onNetStatusChanged");
+    dap_chain_plugin_list_module_t *elemnet = (dap_chain_plugin_list_module_t*)DAP_NEW(dap_chain_plugin_list_module_t);
+    elemnet->name = dap_strdup(name);
+    elemnet->obj_module = module;
+    elemnet->isFuncOnGdbUpdated = true;
+    elemnet->isFuncOnChainsUpdated = true;
+    elemnet->isFuncOnNetStatusChanged = true;
+    //Checking function
+    PyObject *F_FuncOnGdbUpdated = PyObject_GetAttrString(elemnet->obj_module, "onGdbUpdated");
+    PyObject *F_FuncOnChainsUpdated = PyObject_GetAttrString(elemnet->obj_module, "onChainsUpdated");
+    PyObject *F_FuncOnNetStatusChanged = PyObject_GetAttrString(elemnet->obj_module, "onNetStatusChanged");
     if (F_FuncOnGdbUpdated == NULL || !PyCallable_Check(F_FuncOnGdbUpdated)){
-        log_it(L_WARNING, "Plugin %s don't callable function onGdbUpdated", module_s->name);
-        module_s->isFuncOnGdbUpdated = false;
+        log_it(L_WARNING, "Plugin %s don't callable function onGdbUpdated", elemnet->name);
+        elemnet->isFuncOnGdbUpdated = false;
     }
     if (F_FuncOnChainsUpdated == NULL || !PyCallable_Check(F_FuncOnChainsUpdated)){
-        log_it(L_WARNING, "Plugin %s don't callable function onChainsUpdated", module_s->name);
-        module_s->isFuncOnChainsUpdated = false;
+        log_it(L_WARNING, "Plugin %s don't callable function onChainsUpdated", elemnet->name);
+        elemnet->isFuncOnChainsUpdated = false;
     }
     if (F_FuncOnNetStatusChanged == NULL || !PyCallable_Check(F_FuncOnNetStatusChanged)){
-        log_it(L_WARNING, "Plugin %s don't callable function onNetStatusChanged", module_s->name);
-        module_s->isFuncOnNetStatusChanged = false;
+        log_it(L_WARNING, "Plugin %s don't callable function onNetStatusChanged", elemnet->name);
+        elemnet->isFuncOnNetStatusChanged = false;
     }
-    //Added structur to list
-    dap_list_append(dap_chain_plugins_module_list, module_s);
+    LL_APPEND(m_dap_chain_plugins_module_list, elemnet);
 }
 
-unsigned int dap_chain_plugins_list_lenght(){
-    return dap_list_length(dap_chain_plugins_module_list);
+dap_chain_plugin_list_module_t* dap_chain_plugins_list_get(){
+    return m_dap_chain_plugins_module_list;
 }
 
-dap_chain_plugins_module_t *dap_chain_plugins_list_get_module(unsigned int id){
-    if (dap_chain_plugins_list_lenght() < id)
-        return NULL;
-    return (dap_chain_plugins_module_t*)dap_list_nth_data(dap_chain_plugins_module_list, id);
-}
-PyObject *dap_chain_plugins_list_get_object(unsigned int id){
-    if (dap_chain_plugins_list_lenght() < id)
-        return NULL;
-    return (dap_chain_plugins_list_get_module(id))->obj_module;
+int dap_chain_plugins_list_cmp(dap_chain_plugin_list_module_t *e1, dap_chain_plugin_list_module_t *e2){
+    return strcmp(e1->name, e2->name);
 }
 
-bool dap_chai_plugins_list_module_check_on_chains_updated(unsigned int id){
-    if (dap_chain_plugins_list_lenght() < id)
-        return NULL;
-    dap_chain_plugins_module_t *module = (dap_chain_plugins_module_t*)dap_list_nth_data(
-                dap_chain_plugins_module_list, id
-                );
-    return module->isFuncOnChainsUpdated;
-}
-bool dap_chai_plugins_list_module_check_on_gdb_updated(unsigned int id){
-    if (dap_chain_plugins_list_lenght() < id)
-        return NULL;
-    dap_chain_plugins_module_t *module = (dap_chain_plugins_module_t*)dap_list_nth_data(
-                dap_chain_plugins_module_list, id
-                );
-    return module->isFuncOnGdbUpdated;
-}
-bool dap_chai_plugins_list_module_check_on_net_status_updated(unsigned int id){
-    if (dap_chain_plugins_list_lenght() < id)
-        return NULL;
-    dap_chain_plugins_module_t *module = (dap_chain_plugins_module_t*)dap_list_nth_data(
-                dap_chain_plugins_module_list, id
-                );
-    return module->isFuncOnNetStatusChanged;
-}
+bool dap_chain_plugins_list_check_load_plugins(dap_chain_plugins_list_char_t *list){
+    dap_chain_plugins_list_char_t *value_from_list = NULL;
+    dap_chain_plugin_list_module_t *element_from_list_module;
+    dap_chain_plugin_list_module_t *element_lnk = (dap_chain_plugin_list_module_t*)DAP_NEW(
+                dap_chain_plugin_list_module_t);
 
-bool dap_chain_plugins_list_module_del(dap_chain_plugins_module_t *module){
-    for (unsigned int i=0; i < dap_chain_plugins_list_lenght(); i++){
-        if (((dap_chain_plugins_module_t*)dap_list_nth_data(dap_chain_plugins_module_list, i)) == module){
-            dap_chain_plugins_list_id_del(i);
-            return true;
-        }
-    }
-    return false;
-}
-bool dap_chain_plugins_list_id_del(unsigned int id_module){
-    if (dap_chain_plugins_list_lenght() < id_module)
+    int lenght;
+    LL_COUNT(m_dap_chain_plugins_module_list, element_from_list_module, lenght);
+    if (lenght == 0)
         return false;
-    dap_chain_plugins_module_t *mod = (dap_chain_plugins_module_t*)dap_list_nth_data(dap_chain_plugins_module_list, id_module);
-    Py_XDECREF(mod->obj_module);
-    free(mod->name);
-    dap_list_remove(dap_chain_plugins_module_list, dap_list_nth_data(dap_chain_plugins_module_list, id_module));
-    return true;
-}
-bool dap_chain_plugins_list_name_del(const char *name_module){
-    for (unsigned int i=0; i < dap_chain_plugins_list_lenght(); i++){
-        if (strcmp(((dap_chain_plugins_module_t*)dap_list_nth_data(dap_chain_plugins_module_list, i))->name, name_module) == 0){
-            dap_chain_plugins_list_id_del(i);
-            return true;
-        }
+    LL_FOREACH(list, value_from_list){
+        element_lnk->name = value_from_list->value;
+        LL_SEARCH(m_dap_chain_plugins_module_list, element_from_list_module, element_lnk, dap_chain_plugins_list_cmp);
+        if (!element_from_list_module)
+            return false;
     }
-    return false;
+    return true;
 }
+
-- 
GitLab