* Add search directories for the protocol decoders.
*
* TODO: add path from env var SIGROKDECODE_PATH, config etc
+ * TODO: Should take directoryname/path as input.
*/
int set_modulepath(void)
{
int ret;
+ gchar *path, *s;
- PyRun_SimpleString("import sys");
- ret = PyRun_SimpleString("sys.path.append(r'" DECODERS_DIR "');");
+#ifdef _WIN32
+ gchar **splitted;
+
+ /*
+ * On Windows/MinGW, Python's sys.path needs entries of the form
+ * 'C:\\foo\\bar' instead of '/foo/bar'.
+ */
+
+ splitted = g_strsplit(DECODERS_DIR, "/", 0);
+ path = g_build_pathv("\\\\", splitted);
+ g_strfreev(splitted);
+#else
+ path = g_strdup(DECODERS_DIR);
+#endif
+
+ /* TODO: Prepend instead of appending. */
+ /* TODO: Sanity check on 'path' (length, escape special chars, ...). */
+ s = g_strdup_printf("import sys; sys.path.append(r'%s')", path);
+
+ ret = PyRun_SimpleString(s);
+
+ g_free(path);
+ g_free(s);
return ret;
}
int num_optkeys, ret, size, i;
char *key, *value;
- if (g_hash_table_size(options) == 0)
- /* No options provided. */
- return SRD_OK;
-
- if(!PyObject_HasAttrString(di->decoder->py_dec, "options"))
+ if(!PyObject_HasAttrString(di->decoder->py_dec, "options")) {
/* Decoder has no options. */
+ if (g_hash_table_size(options) == 0) {
+ /* No options provided. */
+ return SRD_OK;
+ } else {
+ srd_err("Protocol decoder has no options.");
+ return SRD_ERR_ARG;
+ }
return SRD_OK;
+ }
ret = SRD_ERR_PYTHON;
key = NULL;
goto err_out;
if (!(py_classval = PyList_GetItem(py_optlist, 1)))
goto err_out;
+ if (!PyUnicode_Check(py_classval) && !PyLong_Check(py_classval)) {
+ srd_err("Options of type %s are not yet supported.", Py_TYPE(py_classval)->tp_name);
+ goto err_out;
+ }
if ((value = g_hash_table_lookup(options, key))) {
/* An override for this option was provided. */