Skip to content

Commit 4bb7bbb

Browse files
committed
pyapi FEATURE allow setting callback to retreive required YANG schema
1 parent 488b070 commit 4bb7bbb

1 file changed

Lines changed: 71 additions & 0 deletions

File tree

python/netconf.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ PyObject *libnetconf2ReplyError;
2727
/* syslog usage flag */
2828
static int syslogEnabled = 0;
2929

30+
/* libyang schema callback */
31+
static PyObject *schemaCallback = NULL;
32+
static void *schemaCallbackData = NULL;
33+
3034
static void
3135
clb_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+
126192
static 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

Comments
 (0)