/** @cond PRIVATE */
-/* The list of protocol decoders. */
+/* The list of loaded protocol decoders. */
static GSList *pd_list = NULL;
/* srd.c */
}
/**
- * Returns the list of supported/loaded protocol decoders.
+ * Returns the list of loaded protocol decoders.
*
* This is a GSList of pointers to struct srd_decoder items.
*
return SRD_OK;
}
+/**
+ * Get the API version of the specified decoder.
+ *
+ * @param d The decoder to use. Must not be NULL.
+ *
+ * @return The API version of the decoder, or 0 upon errors.
+ */
+SRD_PRIV long srd_decoder_apiver(const struct srd_decoder *d)
+{
+ PyObject *py_apiver;
+ long apiver;
+
+ if (!d)
+ return 0;
+
+ py_apiver = PyObject_GetAttrString(d->py_dec, "api_version");
+ apiver = (py_apiver && PyLong_Check(py_apiver))
+ ? PyLong_AsLong(py_apiver) : 0;
+ Py_XDECREF(py_apiver);
+
+ return apiver;
+}
+
/**
* Load a protocol decoder module into the embedded Python interpreter.
*
*/
SRD_API int srd_decoder_load(const char *module_name)
{
- PyObject *py_basedec, *py_apiver;
+ PyObject *py_basedec;
struct srd_decoder *d;
long apiver;
int is_subclass;
* Check that this decoder has the correct PD API version.
* PDs of different API versions are incompatible and cannot work.
*/
- py_apiver = PyObject_GetAttrString(d->py_dec, "api_version");
- apiver = (py_apiver && PyLong_Check(py_apiver))
- ? PyLong_AsLong(py_apiver) : 0;
- Py_XDECREF(py_apiver);
-
+ apiver = srd_decoder_apiver(d);
if (apiver != 2) {
srd_exception_catch("Only PDs of API version 2 are supported");
goto err_out;
if (get_binary_classes(d) != SRD_OK)
goto err_out;
- /* Append it to the list of supported/loaded decoders. */
+ /* Append it to the list of loaded decoders. */
pd_list = g_slist_append(pd_list, d);
return SRD_OK;
srd_inst_free_all(sess, NULL);
}
+ /* Remove the PD from the list of loaded decoders. */
+ pd_list = g_slist_remove(pd_list, dec);
+
decoder_free(dec);
return SRD_OK;