diff options
author | Bert Vermeulen <bert@biot.com> | 2013-03-19 01:47:53 +0100 |
---|---|---|
committer | Bert Vermeulen <bert@biot.com> | 2013-03-19 01:58:22 +0100 |
commit | 2f395bff8f096ef738140913e2d01ff0a8c07002 (patch) | |
tree | 4ea2f246a5acaea67945a0ff52998e715b26fcec /controller.c | |
parent | 0ff2d191726ef2e5a30ce697c7c93e4b0b1605f3 (diff) | |
download | libsigrokdecode-2f395bff8f096ef738140913e2d01ff0a8c07002.tar.gz libsigrokdecode-2f395bff8f096ef738140913e2d01ff0a8c07002.zip |
use GVariant for passing decoder options and probes
Decoder options are now exposed in struct srd_decoder, via a GSList
of the new struct srd_decoder_option. The 'def' field represents
the default value as set in the decoder, converted to GVariant. This
allows a library user to determine the type as well as default value.
Diffstat (limited to 'controller.c')
-rw-r--r-- | controller.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/controller.c b/controller.c index cabca3b..3c3f409 100644 --- a/controller.c +++ b/controller.c @@ -291,9 +291,12 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, 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; } } @@ -416,11 +431,12 @@ static gint compare_probe_id(const struct srd_probe *a, const char *probe_id) SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, 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; } |