-
alexey.stratulat authored65326d8a
python-cellframe.c 25.35 KiB
#include "python-cellframe.h"
#define LOG_TAG "python-cellframe"
static bool s_init_crypto = false;
static bool s_init_chain = false;
static bool s_init_app_cli = false;
static bool s_init_stream = false;
static bool s_init_stream_ctl = false;
static bool s_init_http_folder = false;
static bool s_init_http = false;
static bool s_init_http_enc = false;
static bool s_init_server_core = false;
static bool s_init_mempool = false;
static bool s_init_http_client_simple = false;
static bool s_init_wallet = false;
static bool s_init_cs_dag = false;
static bool s_init_cs_dag_poa = false;
static bool s_init_cs_dag_pos = false;
static bool s_init_chain_net_srv = false;
static bool s_init_ks = false;
static bool submodules_deint;
PyObject* CellFrame_error = NULL;
void sigfunc(int sig){
if (sig == SIGINT){
log_it(L_NOTICE, "Handler Ctrl+C");
dap_server_loop_stop();
deinit_modules();
}
}
PyObject *python_cellframe_init(PyObject *self, PyObject *args){
const char *app_name;
const char *file_name_log;
const char *config_dir;
const char *log_level;
const char *JSON_str;
s_init_ks = true;
submodules_deint = false;
signal(SIGINT, sigfunc);
if (!PyArg_ParseTuple(args, "s", &JSON_str)){
PyErr_SetString(CellFrame_error, "ERROR in function call signature: can't get one String argument");
return NULL;
}
PyObject *JSON_Module = PyImport_ImportModule("json");
if (JSON_Module == NULL) {
PyErr_SetString(CellFrame_error, "ERROR importing module");
return NULL;
}
PyObject* JSONLoadsFunction = PyObject_GetAttrString(JSON_Module, "loads");
if (JSONLoadsFunction == NULL) {
PyErr_SetString(CellFrame_error, "Can't find \"loads\" section");
return NULL;
}
PyObject* argsInLoadsJSON = PyTuple_Pack(1,PyUnicode_FromString(JSON_str));
PyObject* result = PyObject_CallObject(JSONLoadsFunction, argsInLoadsJSON);
if (result == NULL){
PyErr_SetString(CellFrame_error, "ERROR in JSONLoadsFunction");
return NULL;
}
PyObject* getModules = PyDict_GetItemString(result, "modules");
if (getModules == NULL){
PyErr_SetString(CellFrame_error, "Can't find \"modules\" section");
return NULL;
}
// DAP or Core
PyObject* getDap = PyDict_GetItemString(result, "DAP");
if (getDap == NULL)
getDap = PyDict_GetItemString(result, "Core");
if( getDap == NULL ){
PyErr_SetString(CellFrame_error, "Can't find \"Core\" or \"DAP\" section");
return NULL;
}
/*Parse DAP*/
PyObject* config_dir_PyObject = PyDict_GetItemString(getDap, "config_dir");
PyObject* application_name_PyObject = PyDict_GetItemString(getDap, "application_name");
PyObject* file_name_log_PyObject = PyDict_GetItemString(getDap, "file_name_log");
PyObject* logLevel_PyObject = PyDict_GetItemString(getDap, "log_level");
if (config_dir_PyObject == NULL || application_name_PyObject == NULL ||
logLevel_PyObject == NULL || file_name_log_PyObject == NULL){
PyErr_SetString(CellFrame_error, "config_dir or application_name or file_name_log or log_level");
return NULL;
}
app_name = PyUnicode_AsUTF8(application_name_PyObject);
file_name_log = PyUnicode_AsUTF8(file_name_log_PyObject);
config_dir = PyUnicode_AsUTF8(config_dir_PyObject);
log_level = PyUnicode_AsUTF8(logLevel_PyObject);
if (dap_common_init(app_name, file_name_log) != 0){
PyErr_SetString(CellFrame_error, "Can't init common functions module");
return NULL;
}
dap_set_appname(app_name);
if ( dap_strcmp( log_level, "L_DEBUG" )==0 || dap_strcmp( log_level, "DEBUG" )==0 ){
dap_log_level_set(L_DEBUG);
}else if ( dap_strcmp( log_level, "L_INFO" )==0 || dap_strcmp( log_level, "INFO" )==0 ){
dap_log_level_set(L_INFO);
}else if ( dap_strcmp( log_level, "L_NOTICE" )==0 || dap_strcmp( log_level, "NOTICE" )==0 ){
dap_log_level_set(L_NOTICE);
}else if ( dap_strcmp( log_level, "L_MSG" )==0 || dap_strcmp( log_level, "MSG" )==0 ){
dap_log_level_set(L_MSG);
}else if ( dap_strcmp( log_level, "L_DAP" )==0 || dap_strcmp( log_level, "DAP" )==0 ){
dap_log_level_set(L_DAP);
}else if ( dap_strcmp( log_level, "L_WARNING" )==0 || dap_strcmp( log_level, "WARNING" )==0 ){
dap_log_level_set(L_WARNING);
}else if ( dap_strcmp( log_level, "L_ATT" )==0 || dap_strcmp( log_level, "ATTENTION" )==0 ){
dap_log_level_set(L_ATT);
}else if ( dap_strcmp( log_level, "L_ERROR" )==0 || dap_strcmp( log_level, "ERROR" )==0 ){
dap_log_level_set(L_ERROR);
}else if ( dap_strcmp( log_level, "L_CRITICAL" )==0 || dap_strcmp( log_level, "CRITICAL" )==0 ){
dap_log_level_set(L_CRITICAL);
}
//generation config files
PyObject *configure = PyDict_GetItemString(result, "Configuration");
int res_gen_config_file = gen_config_files(config_dir, app_name, configure);
switch (res_gen_config_file) {
case -1:
PyErr_SetString(CellFrame_error, "Can't generate configuration files. Can name directory path contains not ASCII simbols.");
return NULL;
case -3:
PyErr_SetString(CellFrame_error, "Can't generate configuration files. Can't open file stream.");
return NULL;
}
//Init config
dap_config_init(config_dir);
if ((g_config = dap_config_open(app_name) ) == NULL){
PyErr_SetString(CellFrame_error, "Can't init general configurations");
return NULL;
}
//Init modules
log_it(L_INFO, "Initializing modules ...");
if (!PyList_Check(getModules)){
PyErr_SetString(CellFrame_error, "Can't find an array of module names");
return NULL;
}
Py_ssize_t size_list = PyList_Size(getModules);
for (int i=0; i < size_list;i++){
PyObject *value = PyList_GetItem(getModules, i);
const char *c_value = PyUnicode_AsUTF8(value);
log_it(L_INFO, "Initializing the %s module ", c_value);
if (strcmp(c_value, "Crypto") == 0){ //Init crypto
// log_it(L_INFO, "Initializing the %s module", c_value);
s_init_crypto = true;
if (dap_crypto_init() != 0){
PyErr_SetString(CellFrame_error, "An error occurred while initializing the libdap-crypto-python module.");
return NULL;
}
dap_cert_init();
}else if (strcmp(c_value, "ServerCore") == 0){
PyObject* getServerCoreData = PyDict_GetItemString(result, "ServerCore");
if (getServerCoreData == NULL){
PyErr_SetString(CellFrame_error, "Initialization failed. ServerCore object not found in JSON."
" No settings are specified for initializing libdap-server-core-python.");
return NULL;
}
PyObject* Nl_thread_cnt = PyDict_GetItemString(getServerCoreData, "thread_cnt");
PyObject* Nl_conn = PyDict_GetItemString(getServerCoreData, "conn");
if ( (Nl_thread_cnt == NULL || Nl_conn == NULL) || !PyNumber_Check(Nl_thread_cnt) ||
!PyNumber_Check(Nl_conn)){
PyErr_SetString(CellFrame_error, "Failed to initialize ServerCore. "
"Fields thread_cnt and conn are not numerical or absent.");
return NULL;
}
PyObject *ll_thread_cnt= PyNumber_Long(Nl_thread_cnt);
PyObject *ll_conn = PyNumber_Long(Nl_conn);
uint32_t ul_thread_cnt = (uint32_t)PyLong_AsUnsignedLong(ll_thread_cnt);
size_t ul_conn = PyLong_AsSize_t(ll_conn);
if(dap_server_core_init(ul_thread_cnt, ul_conn) != 0 ){
PyErr_SetString(CellFrame_error, "Failed to initialize ServerCore.");
return NULL;
}
s_init_server_core = true;
} else if (strcmp(c_value, "Chain") == 0){
if(init_chain_py() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize Chain. "
"Fields thread_cnt and conn are not numerical or absent.");
return NULL;
}
if (dap_chain_cs_init_py() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize Chain CS. "
"Fields thread_cnt and conn are not numerical or absent.");
return NULL;
}
} else if (strcmp(c_value, "Http") == 0){
if(dap_http_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize Http module. ");
return NULL;
}
s_init_http = true;
} else if (strcmp(c_value, "EncHttp") == 0){
if(enc_http_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize EncHttp module. ");
return NULL;
}
s_init_http_enc = true;
} else if (strcmp(c_value, "HttpFolder") == 0){
if (dap_http_folder_init() !=0){
PyErr_SetString(CellFrame_error, "Failed to initialize http folder module. ");
return NULL;
}
s_init_http_folder = true;
} else if (strcmp(c_value, "Stream") == 0){
PyObject* getStreamData = PyDict_GetItemString(result, "Stream");
if (getStreamData == NULL){
PyErr_SetString(CellFrame_error, "Initialization failed. Stream object not found in JSON."
" No settings are specified for initializing libdap-stream-python.");
return NULL;
}
PyObject *debugDumpStreamHeadersObj = PyDict_GetItemString(getStreamData, "DebugDumpStreamHeaders");
if (debugDumpStreamHeadersObj == NULL || !PyBool_Check(debugDumpStreamHeadersObj)){
PyErr_SetString(CellFrame_error, "Failed to initialize Stream. "
"Fields DebugDumpStreamHeaders are not boolean type.");
return NULL;
}
bool res_bollean = (debugDumpStreamHeadersObj == Py_True) ? true : false;
if(dap_stream_init(res_bollean) != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize Stream module. ");
return NULL;
}
s_init_stream = true;
} else if (strcmp(c_value, "StreamCtl") == 0){
// if (dap_stream_ctl_init(DAP_ENC_KEY_TYPE_OAES, 32) != 0){
if (dap_stream_ctl_init_py(DAP_ENC_KEY_TYPE_OAES, 32) != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize StreamCtl module. ");
return NULL;
}
s_init_stream_ctl = true;
} else if (strcmp(c_value, "Mempool") == 0){
if (dap_datum_mempool_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize Mempool module. ");
return NULL;
}
s_init_mempool = true;
} else if (strcmp(c_value, "HttpClientSimple") == 0){
if (dap_http_client_simple_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize HttpClientSimple module. ");
return NULL;
}
s_init_http_client_simple = true;
} else if (strcmp(c_value, "Wallet") == 0){
if (dap_chain_wallet_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize Wallet module. ");
return NULL;
}
s_init_wallet = true;
} else if (strcmp(c_value, "ChainCSDag") == 0){
if (dap_chain_cs_dag_init() != 0)
{
PyErr_SetString(CellFrame_error, "Failed to initialize ChainCSDag module. ");
return NULL;
}
} else if (strcmp(c_value, "ChainCSDagPoa") == 0){
if (dap_chain_cs_dag_poa_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize ChainCSDagPoa module. ");
return NULL;
}
} else if (strcmp(c_value, "ChainCSDagPos") == 0){
if (dap_chain_cs_dag_poa_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize ChainCSDagPos module. ");
return NULL;
}
} else if (strcmp(c_value, "ChainNetSrv") == 0){
if (dap_chain_net_srv_init(g_config) != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize ChainNetSrv module. ");
return NULL;
}
}else if (strcmp(c_value, "HttpSimple") == 0){
if (dap_http_simple_module_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize HttpSimple module. ");
return NULL;
}
} else if (strcmp(c_value, "StreamChChain") == 0){
if (dap_stream_ch_chain_init() != 0 ){
PyErr_SetString(CellFrame_error, "Failed to initialize StreamChChain module. ");
return NULL;
}
} else if (strcmp(c_value, "StreamChChainNet") == 0){
if (dap_stream_ch_chain_net_init() != 0 ){
PyErr_SetString(CellFrame_error, "Failed to initialize StreamChChainNet module. ");
return NULL;
}
}else if (strcmp(c_value, "StreamChChainNetSrv") == 0){
if (dap_stream_ch_chain_net_init() != 0 ){
PyErr_SetString(CellFrame_error, "Failed to initialize StreamChChainNetSrv module. ");
return NULL;
}
}else if (strcmp(c_value, "EncKS") == 0){
// if (dap_enc_ks_init())
// if (dap_enc_ks_
} else if (strcmp(c_value, "GlobalDB") == 0){
if (dap_chain_global_db_init(g_config) != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize GlobalDB module. ");
return NULL;
}
}else if (strcmp(c_value, "Client") == 0){
if (dap_client_init() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize Client module. ");
return NULL;
}
}else if (strcmp(c_value, "GDB") == 0){
if (dap_chain_gdb_init_py() != 0){
PyErr_SetString(CellFrame_error, "Failed to initialize GDB module. ");
return NULL;
}
}else if (strcmp(c_value, "Net") == 0){
if (dap_chain_net_init_py() != 0 ){
PyErr_SetString(CellFrame_error, "Failed to initialize chain net module. ");
return NULL;
}
}else if (strcmp(c_value, "AppCliServer") == 0){
if (dap_chain_node_cli_init(g_config) != 0 ){
PyErr_SetString(CellFrame_error, "Failed to initialize AppCliServer " );
return NULL;
}
}else{
log_it(L_WARNING,"Unknown module \"%s\"", c_value);
}
}
return PyLong_FromLong(0);
}
PyMODINIT_FUNC PyInit_libCellFrame(void){
if ( PyType_Ready( &DapCoreObjectType ) < 0 ||
PyType_Ready( &g_crypto_type_py ) < 0 ||
PyType_Ready( &g_crypto_cert_type_py ) < 0 ||
PyType_Ready( &ServerCore_ServerCoreType ) < 0 ||
PyType_Ready( &dapEvents_dapEventsType ) < 0 ||
PyType_Ready( &dapEventsSocket_dapEventsSocketType ) < 0 ||
PyType_Ready( &CryptoKeyTypeObjecy_CryptoKeyTypeObjecyType ) < 0 ||
PyType_Ready( &CryptoDataTypeObjecy_CryptoDataTypeObjecyType ) < 0 ||
// === Chain ===
PyType_Ready( &dapChainObject_dapChainType ) < 0 ||
PyType_Ready( &dapChainTypeObject_dapChainTypeType ) < 0 ||
PyType_Ready( &dapChainAtomPtr_dapChainAtomPtrType ) < 0 ||
PyType_Ready( &DapChainCell_DapChainCellObjectType ) < 0 ||
// PyType_Ready(&ChainCommonObject_ChainCommonType) < 0 ||
PyType_Ready( &DapChainCellIDObject_DapChainCellIDType) < 0 ||
PyType_Ready( &DapChainCellIDObject_DapChainCellIDType) < 0 ||
PyType_Ready( &DapChainNodeAddrObject_DapChainNodeAddrObjectType) < 0 ||
PyType_Ready( &DapChainHashSlowObject_DapChainHashSlowObjectType) < 0 ||
PyType_Ready( &DapHashFastObject_DapHashFastObjectType) < 0 ||
PyType_Ready( &DapChainHashSlowObject_DapChainHashSlowObjectType) < 0 ||
PyType_Ready( &DapChainAddrObject_DapChainAddrObjectType) < 0 ||
PyType_Ready( &DapChainCsObject_DapChainCsObjectType) < 0 ||
PyType_Ready( &DapChainDatumTypeIdObject_DapChainDatumTypeIdObjectType) < 0 ||
PyType_Ready( &DapChainDatumObject_DapChainDatumObjectType) < 0 ||
PyType_Ready(&DapChainDatumIterObject_DapChainDatumIterObjectType) < 0 ||
PyType_Ready(&DapChainDatumToken_DapChainDatumTokenObjectType) < 0 ||
PyType_Ready(&DapChainDatumTokenEmission_DapChainDatumTokenEmissionObjectType) < 0 ||
PyType_Ready(&DapChainTxItemObject_DapChainTxItemTypeObjectType) < 0 ||
PyType_Ready(&DapChainTxCondType_DapChainTxCondTypeObject) < 0 ||
PyType_Ready(&DapChainDatumTx_DapChainDatumTxObjectType) < 0 ||
PyType_Ready(&DapChainTxOutCond_DapChainTxOutCondObjectType) < 0 ||
PyType_Ready(&DapChainLedger_DapChainLedgerType) < 0 ||
// =============
// === Chain net ===
PyType_Ready(&DapChainNetObject_DapChainNetObjectType) < 0 ||
PyType_Ready(&DapChainNodeCliObject_DapChainNodeCliObjectType) < 0 ||
PyType_Ready(&DapChainNodeClientObject_DapChainNodeClientObjectType) < 0 ||
PyType_Ready(&DapChainNodeInfoObject_DapChainNodeInfoObjectType) < 0 ||
PyType_Ready(&DapChainNetNodeObject_DapChainNetNodeObjectType) < 0 ||
PyType_Ready(&DapChainNetStateObject_DapChainNetStateObjectType) < 0 ||
// =============
PyType_Ready(&DapChainGDBObject_DapChainGDBType) < 0 ||
PyType_Ready(&DapHTTP_DapHTTPType) < 0 ||
PyType_Ready(&DapEncHTTP_DapEncHTTPType) < 0 ||
PyType_Ready(&DapStream_DapStreamType) < 0 ||
PyType_Ready(&DapStreamCtl_DapStreamCtlType) < 0 ||
PyType_Ready(&DapMempool_DapMempoolType) < 0 ||
// ====
PyType_Ready(&DapAppCli_dapAppCliType ) < 0
){
log_it(L_CRITICAL,"Not all py modules are ready for init");
return NULL;
}
PyObject *module = PyModule_Create(&CellFramePythonModule);
PyModule_AddStringConstant(module, "__author__", "Alexey Stratulat <alexey.stratulat@demlabs.net>");
PyModule_AddStringConstant(module, "__version__", DAP_VERSION);
CellFrame_error = PyErr_NewException("CellFrame.error", NULL, NULL);
PyModule_AddObject(module, "error", CellFrame_error);
PyModule_AddObject(module, "DEBUG", PyLong_FromLong(L_DEBUG));
PyModule_AddObject(module, "INFO", PyLong_FromLong(L_INFO));
PyModule_AddObject(module, "NOTICE", PyLong_FromLong(L_NOTICE));
PyModule_AddObject(module, "MESSAGE", PyLong_FromLong(L_MSG));
PyModule_AddObject(module, "DAP", PyLong_FromLong(L_DAP));
PyModule_AddObject(module, "WARNING", PyLong_FromLong(L_WARNING));
PyModule_AddObject(module, "ATT", PyLong_FromLong(L_ATT));
PyModule_AddObject(module, "ERROR", PyLong_FromLong(L_ERROR));
PyModule_AddObject(module, "CRITICAL", PyLong_FromLong(L_CRITICAL));
PyModule_AddObject(module, "Crypto", (PyObject*)&g_crypto_type_py);
PyModule_AddObject(module, "Cert", (PyObject*)&g_crypto_cert_type_py);
PyModule_AddObject(module, "ServerCore", (PyObject*)&ServerCore_ServerCoreType);
PyModule_AddObject(module, "Events", (PyObject*)&dapEvents_dapEventsType);
PyModule_AddObject(module, "EventsSocket", (PyObject*)&dapEventsSocket_dapEventsSocketType);
PyModule_AddObject(module, "CryptoKeyType", (PyObject*)&CryptoKeyTypeObjecy_CryptoKeyTypeObjecyType);
PyModule_AddObject(module, "CryptoDataType", (PyObject*)&CryptoDataTypeObjecy_CryptoDataTypeObjecyType);
// === Chain ===
PyModule_AddObject(module, "Chain", (PyObject*)&dapChainObject_dapChainType);
PyModule_AddObject(module, "ChainType", (PyObject*)&dapChainTypeObject_dapChainTypeType);
PyModule_AddObject(module, "ChainAtomIter", (PyObject*)&dapChainAtomPtr_dapChainAtomPtrType);
PyModule_AddObject(module, "ChainCell", (PyObject*)&DapChainCell_DapChainCellObjectType);
// PyModule_AddObject(module, "ChainCommon", (PyObject*)&ChainCommonObject_ChainCommonType);
// PyModule_AddObject(module, "ChainID", (PyObject*)&DapChainIDObject_DapChainIDType);
PyModule_AddObject(module, "ChainCellID", (PyObject*)&DapChainCellIDObject_DapChainCellIDType);
PyModule_AddObject(module, "ChainNodeAddr", (PyObject*)&DapChainNodeAddrObject_DapChainNodeAddrObjectType);
//// PyModule_AddObject(module, "ChainNetID", (PyObject*)&DapChainNetIdObject_DapChainNetIdObjectType);
PyModule_AddObject(module, "ChainHashSlow", (PyObject*)&DapChainHashSlowObject_DapChainHashSlowObjectType);
PyModule_AddObject(module, "ChainHashFast", (PyObject*)&DapHashFastObject_DapHashFastObjectType);
// PyModule_AddObject(module, "ChainHAshSlowKind", (PyObject*)&DapChainSlowKindObject_DapChainSlowKindType);
PyModule_AddObject(module, "ChainAddr", (PyObject*)&DapChainAddrObject_DapChainAddrObjectType);
//
PyModule_AddObject(module, "ChainCS", (PyObject*)&DapChainCsObject_DapChainCsObjectType);
PyModule_AddObject(module, "ChainDatumTypeID", (PyObject*)&DapChainDatumTypeIdObject_DapChainDatumTypeIdObjectType);
PyModule_AddObject(module, "ChainDatum", (PyObject*)&DapChainDatumObject_DapChainDatumObjectType);
PyModule_AddObject(module, "ChainDatumIter", (PyObject*)&DapChainDatumIterObject_DapChainDatumIterObjectType);
PyModule_AddObject(module, "ChainDatumToken", (PyObject*)&DapChainDatumToken_DapChainDatumTokenObjectType);
PyModule_AddObject(module, "ChainDatumTokenEmisson", (PyObject*)&DapChainDatumTokenEmission_DapChainDatumTokenEmissionObjectType);
PyModule_AddObject(module, "ChainTxItemType", (PyObject*)&DapChainTxItemObject_DapChainTxItemTypeObjectType);
PyModule_AddObject(module, "ChainTxCondType", (PyObject*)&DapChainTxCondType_DapChainTxCondTypeObject);
PyModule_AddObject(module, "ChainDatumTx", (PyObject*)&DapChainDatumTx_DapChainDatumTxObjectType);
PyModule_AddObject(module, "ChainTxOutCond", (PyObject*)&DapChainTxOutCond_DapChainTxOutCondObjectType);
PyModule_AddObject(module, "ChainLedger", (PyObject*)&DapChainLedger_DapChainLedgerType);
// =============
// === Chain net ===
// PyModule_AddObject(module, "ChainNet", (PyObject*)&DapChainNetObject_DapChainNetObjectType);
PyModule_AddObject(module, "ChainNodeClient", (PyObject*)&DapChainNodeClientObject_DapChainNodeClientObjectType);
PyModule_AddObject(module, "ChainNodeInfo", (PyObject*)&DapChainNodeInfoObject_DapChainNodeInfoObjectType);
PyModule_AddObject(module, "ChainNetNode", (PyObject*)&DapChainNetNodeObject_DapChainNetNodeObjectType);
PyModule_AddObject(module, "ChainNetState", (PyObject*)&DapChainNetStateObject_DapChainNetStateObjectType);
// =============
PyModule_AddObject(module, "ChainGDB", (PyObject*)&DapChainGDBObject_DapChainGDBType);
PyModule_AddObject(module, "Http", (PyObject*)&DapHTTP_DapHTTPType);
PyModule_AddObject(module, "EncHttp", (PyObject*)&DapEncHTTP_DapEncHTTPType);
PyModule_AddObject(module, "Stream", (PyObject*)&DapStream_DapStreamType);
PyModule_AddObject(module, "StreamCtl", (PyObject*)&DapStreamCtl_DapStreamCtlType);
PyModule_AddObject(module, "Mempool", (PyObject*)&DapMempool_DapMempoolType);
// ==============
PyModule_AddObject(module, "AppCli", (PyObject*)&DapAppCli_dapAppCliType);
PyModule_AddObject(module, "AppCliServer", (PyObject*)&DapChainNodeCliObject_DapChainNodeCliObjectType);
return module;
}
void deinit_modules(void){
if (!submodules_deint){
log_it(L_NOTICE, "Start deint submodules");
if (s_init_crypto){
dap_crypto_deinit();
dap_cert_deinit();
}
if (s_init_chain){
deinit_chain_py();
dap_chain_cs_deinit_py();
}
if (s_init_stream){
dap_stream_deinit();
}
if (s_init_stream_ctl){
dap_stream_ctl_deinit();
}
if (s_init_http_folder){
dap_http_folder_deinit();
}
if (s_init_http){
dap_http_deinit();
}
if (s_init_server_core){
dap_server_core_deinit();
}
if (s_init_ks){
dap_enc_ks_deinit();
}
dap_config_close(g_config);
dap_config_deinit();
dap_common_deinit();
submodules_deint = true;
}
}
PyObject *python_cellframe_deinit(PyObject *self, PyObject *args){
deinit_modules();
return PyLong_FromLong(0);
}
#ifndef DAP_SUPPORT_PYTHON_PLUGINS
int main(int argc, char **argv) {
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("CellFrame", PyInit_libCellFrame);
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(program);
/* Initialize the Python interpreter. Required. */
Py_Initialize();
/* Optionally import the module; alternatively,
import can be deferred until the embedded script
imports it. */
PyImport_ImportModule(".");
PyMem_RawFree(program);
return 0;
}
#endif