X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=controller.c;h=3c3f4094c73da445e2864d320a6d79630ffb8358;hb=3e1a99c0f8c5e9ace4748ff818146a70b9549092;hp=e35b8be2a987facf8c7d4bcc45c3cd5bfd4568a3;hpb=4895418c6800ecb128ed36af2a1bc46916c9be85;p=libsigrokdecode.git diff --git a/controller.c b/controller.c index e35b8be..3c3f409 100644 --- a/controller.c +++ b/controller.c @@ -286,14 +286,17 @@ SRD_PRIV int srd_decoder_searchpath_add(const char *path) * @return SRD_OK upon success, a (negative) error code otherwise. */ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, - GHashTable *options) + GHashTable *options) { PyObject *py_dec_options, *py_dec_optkeys, *py_di_options, *py_optval; PyObject *py_optlist, *py_classval; Py_UNICODE *py_ustr; + GVariant *value; unsigned long long int val_ull; + gint64 val_int; int num_optkeys, ret, size, i; - char *key, *value; + const char *val_str; + char *dbg, *key; if (!PyObject_HasAttrString(di->decoder->py_dec, "options")) { /* Decoder has no options. */ @@ -332,20 +335,32 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, } if ((value = g_hash_table_lookup(options, key))) { + dbg = g_variant_print(value, TRUE); + srd_dbg("got option '%s' = %s", key, dbg); + g_free(dbg); /* An override for this option was provided. */ if (PyUnicode_Check(py_classval)) { - if (!(py_optval = PyUnicode_FromString(value))) { + if (!g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + srd_err("Option '%s' requires a string value.", key); + goto err_out; + } + val_str = g_variant_get_string(value, NULL); + if (!(py_optval = PyUnicode_FromString(val_str))) { /* Some UTF-8 encoding error. */ PyErr_Clear(); + srd_err("Option '%s' requires a UTF-8 string value.", key); goto err_out; } } else if (PyLong_Check(py_classval)) { - if (!(py_optval = PyLong_FromString(value, NULL, 0))) { + if (!g_variant_is_of_type(value, G_VARIANT_TYPE_INT64)) { + srd_err("Option '%s' requires an integer value.", key); + goto err_out; + } + val_int = g_variant_get_int64(value); + if (!(py_optval = PyLong_FromLong(val_int))) { /* ValueError Exception */ PyErr_Clear(); - srd_err("Option %s has invalid value " - "%s: expected integer.", - key, value); + srd_err("Option '%s' has invalid integer value.", key); goto err_out; } } @@ -414,13 +429,14 @@ static gint compare_probe_id(const struct srd_probe *a, const char *probe_id) * @return SRD_OK upon success, a (negative) error code otherwise. */ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, - GHashTable *new_probes) + GHashTable *new_probes) { + GVariant *probe_val; GList *l; GSList *sl; struct srd_probe *p; int *new_probemap, new_probenum; - char *probe_id, *probenum_str; + char *probe_id; int i, num_required_probes; srd_dbg("set probes called for instance %s with list of %d probes", @@ -453,22 +469,22 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, for (l = g_hash_table_get_keys(new_probes); l; l = l->next) { probe_id = l->data; - probenum_str = g_hash_table_lookup(new_probes, probe_id); - if (!probenum_str) { + probe_val= g_hash_table_lookup(new_probes, probe_id); + if (!g_variant_is_of_type(probe_val, G_VARIANT_TYPE_INT32)) { /* Probe name was specified without a value. */ srd_err("No probe number was specified for %s.", - probe_id); + probe_id); g_free(new_probemap); return SRD_ERR_ARG; } - new_probenum = strtol(probenum_str, NULL, 10); + new_probenum = g_variant_get_int32(probe_val); if (!(sl = g_slist_find_custom(di->decoder->probes, probe_id, (GCompareFunc)compare_probe_id))) { /* Fall back on optional probes. */ if (!(sl = g_slist_find_custom(di->decoder->opt_probes, probe_id, (GCompareFunc) compare_probe_id))) { srd_err("Protocol decoder %s has no probe " - "'%s'.", di->decoder->name, probe_id); + "'%s'.", di->decoder->name, probe_id); g_free(new_probemap); return SRD_ERR_ARG; } @@ -503,7 +519,7 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, * NULL in case of failure. */ SRD_API struct srd_decoder_inst *srd_inst_new(const char *decoder_id, - GHashTable *options) + GHashTable *options) { int i; struct srd_decoder *dec; @@ -578,7 +594,7 @@ SRD_API struct srd_decoder_inst *srd_inst_new(const char *decoder_id, * @return SRD_OK upon success, a (negative) error code otherwise. */ SRD_API int srd_inst_stack(struct srd_decoder_inst *di_from, - struct srd_decoder_inst *di_to) + struct srd_decoder_inst *di_to) { if (!di_from || !di_to) { srd_err("Invalid from/to instance pair."); @@ -639,9 +655,8 @@ SRD_API struct srd_decoder_inst *srd_inst_find_by_id(const char *inst_id) * @private */ SRD_PRIV struct srd_decoder_inst *srd_inst_find_by_obj(const GSList *stack, - const PyObject *obj) + const PyObject *obj) { -// TODO? const GSList *l; struct srd_decoder_inst *tmp, *di; @@ -711,8 +726,8 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, PyObject *args) * @private */ SRD_PRIV int srd_inst_decode(uint64_t start_samplenum, - const struct srd_decoder_inst *di, - const uint8_t *inbuf, uint64_t inbuflen) + const struct srd_decoder_inst *di, const uint8_t *inbuf, + uint64_t inbuflen) { PyObject *py_res; srd_logic *logic; @@ -756,7 +771,7 @@ SRD_PRIV int srd_inst_decode(uint64_t start_samplenum, end_samplenum, logic))) { srd_exception_catch("Protocol decoder instance %s: ", di->inst_id); - return SRD_ERR_PYTHON; /* TODO: More specific error? */ + return SRD_ERR_PYTHON; } Py_DecRef(py_res); @@ -869,7 +884,7 @@ SRD_API int srd_session_start(int num_probes, int unitsize, uint64_t samplerate) * @return SRD_OK upon success, a (negative) error code otherwise. */ SRD_API int srd_session_send(uint64_t start_samplenum, const uint8_t *inbuf, - uint64_t inbuflen) + uint64_t inbuflen) { GSList *d; int ret; @@ -900,7 +915,7 @@ SRD_API int srd_session_send(uint64_t start_samplenum, const uint8_t *inbuf, * @param cb_data Private data for the callback function. Can be NULL. */ SRD_API int srd_pd_output_callback_add(int output_type, - srd_pd_output_callback_t cb, void *cb_data) + srd_pd_output_callback_t cb, void *cb_data) { struct srd_pd_callback *pd_cb;