From 37f6fb7f2d957a87e9c599ebb141c072bfa79140 Mon Sep 17 00:00:00 2001
From: Alexey Stratulat <--local>
Date: Thu, 1 Aug 2019 23:49:19 +0700
Subject: [PATCH] [*] Changed the wrapper. Added temporary initialization of
 dap_common. Made a DapServer object. And we changed the wrapping functions to
 work with them.

---
 include/libdap-server-core-python.h | 31 +++++++++++++++++++++++++++--
 src/libdap-server-core-python.c     | 18 +++++++++++++----
 2 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/include/libdap-server-core-python.h b/include/libdap-server-core-python.h
index 1d7771d1..cc71a4db 100644
--- a/include/libdap-server-core-python.h
+++ b/include/libdap-server-core-python.h
@@ -11,7 +11,34 @@ extern "C" {
 
 dap_server_t *t_server;
 
-
+typedef struct PyDapServer {
+    PyObject_HEAD
+    dap_server_t *t_server;
+}PyDapServerObject;
+
+static PyTypeObject dapServer_dapServerType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "libdap_server_core_python_module.DapServer",             /* tp_name */
+    sizeof(PyDapServerObject), /* tp_basicsize */
+    0,                         /* tp_itemsize */
+    0,                         /* tp_dealloc */
+    0,                         /* tp_print */
+    0,                         /* tp_getattr */
+    0,                         /* tp_setattr */
+    0,                         /* tp_compare */
+    0,                         /* tp_repr */
+    0,                         /* tp_as_number */
+    0,                         /* tp_as_sequence */
+    0,                         /* tp_as_mapping */
+    0,                         /* tp_hash */
+    0,                         /* tp_call */
+    0,                         /* tp_str */
+    0,                         /* tp_getattro */
+    0,                         /* tp_setattro */
+    0,                         /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT,        /* tp_flags */
+    "DapServer objects",           /* tp_doc */
+};
 
 #define LOG_TAG "libdap-server-core-python"
 
@@ -31,7 +58,7 @@ static PyMethodDef DapServerCorePythonMethods[] = {
 
 static struct PyModuleDef dapservercorepythonmodule = {
         PyModuleDef_HEAD_INIT,
-        "libdap_python_module",   /* name of module */
+        "libdap_server_core_python_module",   /* name of module */
         NULL, /* module documentation, may be NULL */
         -1,       /* size of per-interpreter state of the module,
                  or -1 if the module keeps state in global variables. */
diff --git a/src/libdap-server-core-python.c b/src/libdap-server-core-python.c
index 4eb618a5..fed7b846 100644
--- a/src/libdap-server-core-python.c
+++ b/src/libdap-server-core-python.c
@@ -4,13 +4,14 @@
 static PyObject *dap_server_core_init(PyObject *self, PyObject *args){
     uint32_t l_thread_cnt;
     size_t conn_t;
+    dap_common_init("CVNT", "CVNT.log");
     if (!PyArg_ParseTuple(args, "I|n", &l_thread_cnt, &conn_t)){
         return NULL;
     }
     int32_t result = dap_server_init(l_thread_cnt);
     if ( result != 0 ) {
        log_it( L_CRITICAL, "Can't init socket server module" );
-     }
+    }
     dap_events_init(l_thread_cnt, conn_t);
     dap_client_remote_init();
     return PyLong_FromLong(result);
@@ -23,7 +24,12 @@ static PyObject *dap_server_core_deinit(){
 }
 
 static PyObject *dap_server_core_loop(PyObject *self, PyObject *args){
-    int32_t result = dap_server_loop(t_server);
+    PyObject *obj_server;
+    if (!PyArg_ParseTuple(args, "O", &obj_server)){
+        return NULL;
+    }
+    int32_t result = dap_server_loop(((PyDapServerObject*)obj_server)->t_server);
+    log_it( result ? L_CRITICAL : L_NOTICE, "Server loop stopped with return code %d", ((PyDapServerObject*)obj_server)->t_server );
     return PyLong_FromLong(result);
 }
 
@@ -36,11 +42,15 @@ static PyObject *dap_server_core_listen(PyObject *self, PyObject *args){
     }
     if (type > 1)
         return  NULL;
-    t_server = dap_server_listen(addr, port, type);
-    return PyLong_FromLong(0);
+    PyObject *obj = _PyObject_New(&dapServer_dapServerType);
+    ((PyDapServerObject*)obj)->t_server = dap_server_listen(addr, port, type);
+    return Py_BuildValue("O", obj);
 }
 
 PyMODINIT_FUNC PyInit_libdap_server_core_python_module(void){
+    dapServer_dapServerType.tp_new = PyType_GenericNew;
+    if (PyType_Ready(&dapServer_dapServerType) < 0)
+            return NULL;
     return PyModule_Create(&dapservercorepythonmodule);
 }
 
-- 
GitLab