2 * This file is part of the sigrok project.
4 * Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
5 * Copyright (C) 2011 Bert Vermeulen <bert@biot.com>
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "sigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
23 #include "sigrokdecode-internal.h"
26 /* The list of protocol decoders. */
27 GSList *pd_list = NULL;
29 /* lives in module_sigrokdecode.c */
30 extern PyObject *mod_sigrokdecode;
34 * Returns the list of supported/loaded protocol decoders.
36 * This is a GSList containing the names of the decoders as strings.
38 * @return List of decoders, NULL if none are supported or loaded.
40 GSList *srd_list_decoders(void)
48 * Get the decoder with the specified ID.
50 * @param id The ID string of the decoder to return.
51 * @return The decoder with the specified ID, or NULL if not found.
53 struct srd_decoder *srd_get_decoder_by_id(const char *id)
56 struct srd_decoder *dec;
58 for (l = srd_list_decoders(); l; l = l->next) {
60 if (!strcmp(dec->id, id))
69 * Load a protocol decoder module into the embedded python interpreter.
71 * @param name The module name to be loaded.
72 * @param dec Pointer to the struct srd_decoder filled with the loaded module.
74 * @return SRD_OK upon success, a (negative) error code otherwise.
76 int srd_load_decoder(const char *name, struct srd_decoder **dec)
78 PyObject *py_basedec, *py_annlist, *py_ann;
79 struct srd_decoder *d;
85 srd_dbg("loading module %s", name);
87 if (!(d = g_try_malloc0(sizeof(struct srd_decoder)))) {
92 /* Import the Python module. */
93 if (!(d->py_mod = PyImport_ImportModule(name))) {
94 /* TODO: report exception message/traceback to err/dbg */
95 srd_dbg("import failed");
101 /* Get the 'Decoder' class as Python object. */
102 if (!(d->py_dec = PyObject_GetAttrString(d->py_mod, "Decoder"))) {
103 /* This generated an AttributeError exception. */
105 srd_err("Decoder class not found in protocol decoder module %s", name);
106 ret = SRD_ERR_PYTHON;
110 if (!(py_basedec = PyObject_GetAttrString(mod_sigrokdecode, "Decoder"))) {
111 srd_dbg("sigrokdecode module not loaded");
112 ret = SRD_ERR_PYTHON;
116 if (!PyObject_IsSubclass(d->py_dec, py_basedec)) {
117 srd_err("Decoder class in protocol decoder module %s is not "
118 "a subclass of sigrokdecode.Decoder", name);
119 ret = SRD_ERR_PYTHON;
122 Py_DecRef(py_basedec);
124 if (py_attr_as_str(d->py_dec, "id", &(d->id)) != SRD_OK) {
125 return SRD_ERR_PYTHON;
129 if (py_attr_as_str(d->py_dec, "name", &(d->name)) != SRD_OK) {
130 return SRD_ERR_PYTHON;
134 if (py_attr_as_str(d->py_dec, "longname", &(d->longname)) != SRD_OK) {
135 return SRD_ERR_PYTHON;
139 if (py_attr_as_str(d->py_dec, "desc", &(d->desc)) != SRD_OK) {
140 return SRD_ERR_PYTHON;
144 if (py_attr_as_str(d->py_dec, "license", &(d->license)) != SRD_OK) {
145 return SRD_ERR_PYTHON;
149 /* TODO: Handle inputformats, outputformats. */
150 d->inputformats = NULL;
151 d->outputformats = NULL;
153 /* Convert class annotation attribute to GSList of **char */
154 d->annotations = NULL;
155 if (PyObject_HasAttrString(d->py_dec, "annotations")) {
156 py_annlist = PyObject_GetAttrString(d->py_dec, "annotations");
157 if (!PyList_Check(py_annlist)) {
158 srd_err("Protocol decoder module %s annotations should be a list", name);
159 ret = SRD_ERR_PYTHON;
162 alen = PyList_Size(py_annlist);
163 for (i = 0; i < alen; i++) {
164 py_ann = PyList_GetItem(py_annlist, i);
165 if (!PyList_Check(py_ann) || PyList_Size(py_ann) != 2) {
166 srd_err("Protocol decoder module %s annotation %d should be a list with two elements",
168 ret = SRD_ERR_PYTHON;
172 if (py_strlist_to_char(py_ann, &ann) != SRD_OK) {
173 ret = SRD_ERR_PYTHON;
176 d->annotations = g_slist_append(d->annotations, ann);
185 Py_XDECREF(py_basedec);
186 Py_XDECREF(d->py_dec);
187 Py_XDECREF(d->py_mod);
194 char *srd_decoder_doc(struct srd_decoder *dec)
199 if (!PyObject_HasAttrString(dec->py_mod, "__doc__"))
202 if (!(py_str = PyObject_GetAttrString(dec->py_mod, "__doc__"))) {
208 if (py_str != Py_None)
209 py_str_as_str(py_str, &doc);
217 * Unload decoder module.
219 * @param dec The decoder struct to be unloaded.
221 * @return SRD_OK upon success, a (negative) error code otherwise.
223 int srd_unload_decoder(struct srd_decoder *dec)
228 g_free(dec->longname);
230 g_free(dec->license);
232 /* TODO: Free everything in inputformats and outputformats. */
233 if (dec->inputformats != NULL)
234 g_slist_free(dec->inputformats);
235 if (dec->outputformats != NULL)
236 g_slist_free(dec->outputformats);
238 Py_XDECREF(dec->py_dec);
239 Py_XDECREF(dec->py_mod);
241 /* TODO: (g_)free dec itself? */
247 int srd_load_all_decoders(void)
253 struct srd_decoder *dec;
255 if (!(dir = opendir(DECODERS_DIR))) {
256 Py_Finalize(); /* Returns void. */
257 return SRD_ERR_DECODERS_DIR;
260 while ((dp = readdir(dir)) != NULL) {
261 /* Ignore filenames which don't end with ".py". */
262 if (!g_str_has_suffix(dp->d_name, ".py"))
265 /* Decoder name == filename (without .py suffix). */
266 decodername = g_strndup(dp->d_name, strlen(dp->d_name) - 3);
268 /* TODO: Error handling. Use g_try_malloc(). */
269 if (!(dec = malloc(sizeof(struct srd_decoder)))) {
270 Py_Finalize(); /* Returns void. */
271 return SRD_ERR_MALLOC;
274 /* Load the decoder. */
275 /* TODO: Warning if loading fails for a decoder. */
276 if ((ret = srd_load_decoder(decodername, &dec)) == SRD_OK) {
277 /* Append it to the list of supported/loaded decoders. */
278 pd_list = g_slist_append(pd_list, dec);
290 int srd_unload_all_decoders(void)
293 struct srd_decoder *dec;
295 for (l = srd_list_decoders(); l; l = l->next) {
297 /* TODO: Error handling. */
298 srd_unload_decoder(dec);