diff --git a/include/dap_chain_plugins_list.h b/include/dap_chain_plugins_list.h new file mode 100644 index 0000000000000000000000000000000000000000..7d5336af1c80f6f9011ecb2819d271219a53da8e --- /dev/null +++ b/include/dap_chain_plugins_list.h @@ -0,0 +1,49 @@ +#ifndef _DAP_CHAIN_PLUGINS_LIST_ +#define _DAP_CHAIN_PLUGINS_LIST_ + +#include "Python.h" +#include "stdbool.h" +#include "dap_list.h" +#include "dap_common.h" +#include "dap_strfuncs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#undef LOG_TAG +#define LOG_TAG "dap_chain_plugins_list" + +typedef struct dap_chain_plugin_module{ + char *name; + PyObject *obj_module; + bool isFuncOnChainsUpdated; + bool isFuncOnGdbUpdated; + bool isFuncOnNetStatusChanged; +}dap_chain_plugins_module_t; + +static dap_list_t* dap_chain_plugins_module_list; + +int dap_chain_plugins_list_init(); +void dap_chain_plugins_list_deint(); + +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); + +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); + + +#ifdef __cplusplus +extern "C" { +#endif +#endif // _DAP_CHAIN_PLUGINS_LIST_ diff --git a/src/dap_chain_plugins_list.c b/src/dap_chain_plugins_list.c new file mode 100644 index 0000000000000000000000000000000000000000..224a170d15e5969bcfc772ddf6ca8ef77dba58bb --- /dev/null +++ b/src/dap_chain_plugins_list.c @@ -0,0 +1,109 @@ +#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_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"); + 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; + } + 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; + } + 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; + } + //Added structur to list + dap_list_append(dap_chain_plugins_module_list, module_s); +} + +unsigned int dap_chain_plugins_list_lenght(){ + return dap_list_length(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; +} + +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_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) + 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; + } + } + return false; +}