Skip to content
Snippets Groups Projects
dap_chain_plugins_list.c 4.57 KiB
Newer Older
#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;
}