@@ -27,6 +27,10 @@ PyObject *libnetconf2ReplyError;
2727/* syslog usage flag */
2828static int syslogEnabled = 0 ;
2929
30+ /* libyang schema callback */
31+ static PyObject * schemaCallback = NULL ;
32+ static void * schemaCallbackData = NULL ;
33+
3034static void
3135clb_print (NC_VERB_LEVEL level , const char * msg )
3236{
@@ -123,6 +127,68 @@ setSearchpath(PyObject *self, PyObject *args, PyObject *keywds)
123127 Py_RETURN_NONE ;
124128}
125129
130+ char *
131+ schemaCallbackWrapper (const char * mod_name , const char * mod_rev , const char * submod_name , const char * sub_rev ,
132+ void * user_data , LYS_INFORMAT * format , void (* * free_module_data )(void * model_data ))
133+ {
134+ PyObject * arglist , * result , * data = NULL ;
135+ char * str = NULL ;
136+
137+ arglist = Py_BuildValue ("(ssssO)" , mod_name , mod_rev , submod_name , sub_rev , schemaCallbackData ? schemaCallbackData : Py_None );
138+ if (!arglist ) {
139+ PyErr_Print ();
140+ return NULL ;
141+ }
142+ result = PyObject_CallObject (schemaCallback , arglist );
143+ Py_DECREF (arglist );
144+
145+ if (result ) {
146+ if (!PyArg_ParseTuple (result , "iU" , format , & data )) {
147+ Py_DECREF (result );
148+ return NULL ;
149+ }
150+ Py_DECREF (result );
151+ * free_module_data = free ;
152+ str = strdup (PyUnicode_AsUTF8 (data ));
153+ Py_DECREF (data );
154+ }
155+
156+ return str ;
157+ }
158+
159+ static PyObject *
160+ setSchemaCallback (PyObject * self , PyObject * args , PyObject * keywds )
161+ {
162+ PyObject * clb = NULL , * data = NULL ;
163+ static char * kwlist [] = {"func" , "priv" , NULL };
164+
165+ if (!PyArg_ParseTupleAndKeywords (args , keywds , "O|O:setSchemaCallback" , kwlist , & clb , & data )) {
166+ return NULL ;
167+ }
168+
169+ if (!clb || clb == Py_None ) {
170+ Py_XDECREF (schemaCallback );
171+ Py_XDECREF (schemaCallbackData );
172+ data = NULL ;
173+ } else if (!PyCallable_Check (clb )) {
174+ PyErr_SetString (PyExc_TypeError , "The callback must be a function." );
175+ return NULL ;
176+ } else {
177+ Py_XDECREF (schemaCallback );
178+ Py_XDECREF (schemaCallbackData );
179+
180+ Py_INCREF (clb );
181+ if (data ) {
182+ Py_INCREF (data );
183+ }
184+ }
185+ nc_client_set_schema_callback (schemaCallbackWrapper , NULL );
186+ schemaCallback = clb ;
187+ schemaCallbackData = data ;
188+
189+ Py_RETURN_NONE ;
190+ }
191+
126192static PyMethodDef netconf2Methods [] = {
127193 {"setVerbosity" , (PyCFunction )setVerbosity , METH_VARARGS | METH_KEYWORDS ,
128194 "setVerbosity(level)\n--\n\n"
@@ -150,6 +216,11 @@ static PyMethodDef netconf2Methods[] = {
150216 ":param path: Search directory.\n"
151217 ":type path: string\n"
152218 ":returns: None\n" },
219+ {"setSchemaCallback" , (PyCFunction )setSchemaCallback , METH_VARARGS | METH_KEYWORDS ,
220+ "Set schema search callaback.\n\n"
221+ "setSchemaCallback(func, priv=None)\n"
222+ "with func(str mod_name, str mod_rev, str submod_name, str submod_rev, priv)\n"
223+ "callback returns tuple of format (e.g. LYS_IN_YANG) and string of the schema content.\n" },
153224 {NULL , NULL , 0 , NULL }
154225};
155226
0 commit comments