|
@@ -22,9 +22,12 @@
|
|
|
#include <unistd.h>
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
+#include <Python.h>
|
|
|
+
|
|
|
#include "../../dprint.h"
|
|
|
#include "../../route.h"
|
|
|
#include "../../kemi.h"
|
|
|
+#include "../../mem/pkg.h"
|
|
|
|
|
|
#include "python_exec.h"
|
|
|
#include "apy_kemi.h"
|
|
@@ -84,10 +87,133 @@ int sr_kemi_config_engine_python(sip_msg_t *msg, int rtype, str *rname)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+static PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args)
|
|
|
+{
|
|
|
+ str mname = str_init("");
|
|
|
+ int midx = 0;
|
|
|
+ str fname = str_init("");
|
|
|
+ int i;
|
|
|
+ PyTypeObject *pto;
|
|
|
+ sr_kemi_t *ket = NULL;
|
|
|
+ sr_kemi_val_t vps[SR_KEMI_PARAMS_MAX];
|
|
|
+ sr_apy_env_t *env_P;
|
|
|
+
|
|
|
+ env_P = sr_apy_env_get();
|
|
|
+
|
|
|
+ if(env_P==NULL || env_P->msg==NULL) {
|
|
|
+ LM_ERR("invalid Python environment attributes\n");
|
|
|
+ Py_INCREF(Py_None);
|
|
|
+ return Py_None;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(self!=NULL) {
|
|
|
+ pto = Py_TYPE(self);
|
|
|
+ if(pto==NULL) {
|
|
|
+ Py_INCREF(Py_None);
|
|
|
+ return Py_None;
|
|
|
+ }
|
|
|
+ LM_DBG("execution of method: %s\n", pto->tp_name);
|
|
|
+ fname.s = (char*)pto->tp_name;
|
|
|
+ fname.len = strlen(fname.s);
|
|
|
+ } else {
|
|
|
+ fname.s = "[test]";
|
|
|
+ fname.len = strlen(fname.s);
|
|
|
+ LM_DBG("execution of method: %.*s\n", fname.len, fname.s);
|
|
|
+ }
|
|
|
+
|
|
|
+ ket = sr_kemi_lookup(&mname, midx, &fname);
|
|
|
+ if(ket==NULL) {
|
|
|
+ Py_INCREF(Py_None);
|
|
|
+ return Py_None;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(vps, 0, SR_KEMI_PARAMS_MAX*sizeof(sr_kemi_val_t));
|
|
|
+ for(i=0; i<SR_KEMI_PARAMS_MAX; i++) {
|
|
|
+ if(ket->ptypes[i]==SR_KEMIP_NONE) {
|
|
|
+ break;
|
|
|
+ } else if(ket->ptypes[i]==SR_KEMIP_STR) {
|
|
|
+ if(!PyArg_ParseTuple(args, "s:kemi-param", &vps[i].s.s)) {
|
|
|
+ LM_ERR("unable to retrieve str param %d\n", i);
|
|
|
+ Py_INCREF(Py_None);
|
|
|
+ return Py_None;
|
|
|
+ }
|
|
|
+ vps[i].s.len = strlen(vps[i].s.s);
|
|
|
+ LM_DBG("param[%d] for: %.*s is str: %.*s\n", i,
|
|
|
+ fname.len, fname.s, vps[i].s.len, vps[i].s.s);
|
|
|
+ } else if(ket->ptypes[i]==SR_KEMIP_INT) {
|
|
|
+ if(!PyArg_ParseTuple(args, "i:kemi-param", &vps[i].n)) {
|
|
|
+ LM_ERR("unable to retrieve int param %d\n", i);
|
|
|
+ Py_INCREF(Py_None);
|
|
|
+ return Py_None;
|
|
|
+ }
|
|
|
+ LM_DBG("param[%d] for: %.*s is int: %d\n", i,
|
|
|
+ fname.len, fname.s, vps[i].n);
|
|
|
+ } else {
|
|
|
+ LM_ERR("unknown parameter type %d (%d)\n", ket->ptypes[i], i);
|
|
|
+ Py_INCREF(Py_None);
|
|
|
+ return Py_None;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Py_INCREF(Py_None);
|
|
|
+ return Py_None;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+PyObject *_sr_apy_ksr_module = NULL;
|
|
|
+PyObject *_sr_apy_ksr_module_dict = NULL;
|
|
|
+
|
|
|
+PyMethodDef *_sr_KSRMethods = NULL;
|
|
|
+#define SR_APY_KSR_METHOS_SIZE 256
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
*/
|
|
|
int sr_apy_init_ksr(void)
|
|
|
{
|
|
|
+ _sr_KSRMethods = pkg_malloc(SR_APY_KSR_METHOS_SIZE * sizeof(PyMethodDef));
|
|
|
+ if(_sr_KSRMethods==NULL) {
|
|
|
+ LM_ERR("no more pkg memory\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ memset(_sr_KSRMethods, 0, SR_APY_KSR_METHOS_SIZE * sizeof(PyMethodDef));
|
|
|
+
|
|
|
+ _sr_KSRMethods[0].ml_name = "test";
|
|
|
+ _sr_KSRMethods[0].ml_meth = (PyCFunction)sr_apy_kemi_exec_func;
|
|
|
+ _sr_KSRMethods[0].ml_flags = METH_VARARGS;
|
|
|
+ _sr_KSRMethods[0].ml_doc = "Kamailio function";
|
|
|
+
|
|
|
+ _sr_apy_ksr_module = Py_InitModule("KSR", _sr_KSRMethods);
|
|
|
+ _sr_apy_ksr_module_dict = PyModule_GetDict(_sr_apy_ksr_module);
|
|
|
+
|
|
|
+ Py_INCREF(_sr_apy_ksr_module);
|
|
|
+
|
|
|
+ LM_DBG("module 'KSR' has been initialized\n");
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+void sr_apy_destroy_ksr(void)
|
|
|
+{
|
|
|
+ if(_sr_apy_ksr_module!=NULL) {
|
|
|
+ Py_XDECREF(_sr_apy_ksr_module);
|
|
|
+ _sr_apy_ksr_module = NULL;
|
|
|
+ }
|
|
|
+ if(_sr_apy_ksr_module_dict!=NULL) {
|
|
|
+ Py_XDECREF(_sr_apy_ksr_module_dict);
|
|
|
+ _sr_apy_ksr_module_dict = NULL;
|
|
|
+ }
|
|
|
+ if(_sr_KSRMethods!=NULL) {
|
|
|
+ pkg_free(_sr_KSRMethods);
|
|
|
+ _sr_KSRMethods = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ LM_DBG("module 'KSR' has been destroyed\n");
|
|
|
+}
|