Python-API: Inital commit of Python bindings for the VPP API.
[vpp.git] / vpp-api / python / vpp_papi / pneum_wrap.c
1 #include <Python.h>
2 #include "pneum.h"
3
4 static PyObject *pneum_callback = NULL;
5
6 int
7 wrap_pneum_callback (char *data, int len)
8 {
9   PyGILState_STATE gstate;
10   PyObject *result;//, *arglist;
11
12   gstate = PyGILState_Ensure();
13
14   /* Time to call the callback */
15   result = PyObject_CallFunction(pneum_callback, "y#", data, len);
16   if (result)
17     Py_DECREF(result);
18   else
19     PyErr_Print();
20
21   PyGILState_Release(gstate);
22   return (0);
23 }
24
25 static PyObject *
26 wrap_connect (PyObject *self, PyObject *args)
27 {
28   char *name;
29   int rv;
30   PyObject *temp;
31
32   if (!PyArg_ParseTuple(args, "sO:set_callback", &name, &temp))
33     return (NULL);
34   
35   if (!PyCallable_Check(temp)) {
36     PyErr_SetString(PyExc_TypeError, "parameter must be callable");
37     return NULL;
38   }
39
40   Py_XINCREF(temp);         /* Add a reference to new callback */
41   Py_XDECREF(pneum_callback);  /* Dispose of previous callback */
42   pneum_callback = temp;       /* Remember new callback */
43
44   Py_BEGIN_ALLOW_THREADS
45   rv = pneum_connect(name);
46   Py_END_ALLOW_THREADS
47   return PyLong_FromLong(rv);
48 }
49
50 static PyObject *
51 wrap_disconnect (PyObject *self, PyObject *args)
52 {
53   int rv;
54   Py_BEGIN_ALLOW_THREADS
55   rv = pneum_disconnect();
56   Py_END_ALLOW_THREADS
57   return PyLong_FromLong(rv);
58 }
59 static PyObject *
60 wrap_write (PyObject *self, PyObject *args)
61 {
62   char *data;
63   int len, rv;
64
65   if (!PyArg_ParseTuple(args, "s#", &data, &len)) 
66     return NULL;     
67   Py_BEGIN_ALLOW_THREADS
68   rv = pneum_write(data, len);
69   Py_END_ALLOW_THREADS
70
71   return PyLong_FromLong(rv);
72 }
73
74 void vl_msg_api_free(void *);
75
76 static PyObject *
77 wrap_read (PyObject *self, PyObject *args)
78 {
79   char *data;
80   int len, rv;
81
82   Py_BEGIN_ALLOW_THREADS
83   rv = pneum_read(&data, &len);
84   Py_END_ALLOW_THREADS
85
86   if (rv != 0) { Py_RETURN_NONE; }
87
88   PyObject *ret = Py_BuildValue("y#", data, len);
89   if (!ret) { Py_RETURN_NONE; }
90
91   vl_msg_api_free(data);
92   return ret;
93 }
94
95 static PyMethodDef vpp_api_Methods[] = {
96   {"connect", wrap_connect, METH_VARARGS, "Connect to the VPP API."},
97   {"disconnect", wrap_disconnect, METH_VARARGS, "Disconnect from the VPP API."},
98   {"write", wrap_write, METH_VARARGS, "Write data to the VPP API."},
99   {"read", wrap_read, METH_VARARGS, "Read data from the VPP API."},
100   {NULL, NULL, 0, NULL}        /* Sentinel */
101 };
102
103 static struct PyModuleDef vpp_api_module = {
104   PyModuleDef_HEAD_INIT,
105   "vpp_api",   /* name of module */
106    NULL, /* module documentation, may be NULL */
107   -1,       /* size of per-interpreter state of the module,
108                or -1 if the module keeps state in global variables. */
109   vpp_api_Methods
110 };
111
112 PyMODINIT_FUNC
113 PyInit_vpp_api (void)
114 {
115   /* Ensure threading is initialised */
116   if (!PyEval_ThreadsInitialized()) {
117     PyEval_InitThreads();
118   }
119   return PyModule_Create(&vpp_api_module);
120 }