]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoder.c
srd: decoder class structure check belongs in module loader
[libsigrokdecode.git] / decoder.c
index 7dd1e968da23c88e0d936f4f31217d13b24635c1..5b9223c630812599548e0dcebfeac1a5104161b0 100644 (file)
--- a/decoder.c
+++ b/decoder.c
@@ -21,7 +21,7 @@
 #include "config.h"
 #include "sigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
 #include "sigrokdecode-internal.h"
-#include <dirent.h>
+#include <glib.h>
 
 /* The list of protocol decoders. */
 GSList *pd_list = NULL;
@@ -75,12 +75,12 @@ struct srd_decoder *srd_get_decoder_by_id(const char *id)
  */
 int srd_load_decoder(const char *name, struct srd_decoder **dec)
 {
-       PyObject *py_basedec, *py_method, *py_annlist, *py_ann;
+       PyObject *py_basedec, *py_method, *py_attr, *py_annlist, *py_ann;
        struct srd_decoder *d;
        int alen, ret, i;
        char **ann;
 
-       py_basedec = py_method = NULL;
+       py_basedec = py_method = py_attr = NULL;
 
        srd_dbg("decoder: %s: loading module '%s'", __func__, name);
 
@@ -150,6 +150,17 @@ int srd_load_decoder(const char *name, struct srd_decoder **dec)
        }
        Py_DecRef(py_method);
 
+       /* If present, options must be a dictionary. */
+       if (PyObject_HasAttrString(d->py_dec, "options")) {
+               py_attr = PyObject_GetAttrString(d->py_dec, "options");
+               if (!PyDict_Check(py_attr)) {
+                       srd_err("Protocol decoder %s options attribute is not "
+                                       "a dictionary.", d->name);
+                       goto err_out;
+               }
+               Py_DecRef(py_attr);
+       }
+
        if (py_attr_as_str(d->py_dec, "id", &(d->id)) != SRD_OK)
                goto err_out;
 
@@ -262,24 +273,20 @@ int srd_unload_decoder(struct srd_decoder *dec)
 
 int srd_load_all_decoders(void)
 {
-       DIR *dir;
-       struct dirent *dp;
+       GDir *dir;
+       GError *error;
+       struct srd_decoder *dec;
        int ret;
+       const gchar *direntry;
        char *decodername;
-       struct srd_decoder *dec;
 
-       if (!(dir = opendir(DECODERS_DIR))) {
-               Py_Finalize(); /* Returns void. */
+       if (!(dir = g_dir_open(DECODERS_DIR, 0, &error))) {
                return SRD_ERR_DECODERS_DIR;
        }
 
-       while ((dp = readdir(dir)) != NULL) {
-               /* Ignore filenames which don't end with ".py". */
-               if (!g_str_has_suffix(dp->d_name, ".py"))
-                       continue;
-
+       while ((direntry = g_dir_read_name(dir)) != NULL) {
                /* The decoder name is the PD directory name (e.g. "i2c"). */
-               decodername = g_strndup(dp->d_name, strlen(dp->d_name) - 3);
+               decodername = g_strdup(direntry);
 
                /* TODO: Error handling. Use g_try_malloc(). */
                if (!(dec = malloc(sizeof(struct srd_decoder)))) {
@@ -294,7 +301,7 @@ int srd_load_all_decoders(void)
                        pd_list = g_slist_append(pd_list, dec);
                }
        }
-       closedir(dir);
+       g_dir_close(dir);
 
        return SRD_OK;
 }