return SR_ERR;
}
- if (sr_dev_has_option(sdi, SR_CONF_LIMIT_MSEC)) {
+ if (config_key_has_cap(driver, sdi, NULL, SR_CONF_LIMIT_MSEC, SR_CONF_SET)) {
gvar = g_variant_new_uint64(time_msec);
if (sr_config_set(sdi, NULL, SR_CONF_LIMIT_MSEC, gvar) != SR_OK) {
g_critical("Failed to configure time limit.");
return SR_ERR;
}
- } else if (sr_dev_has_option(sdi, SR_CONF_SAMPLERATE)) {
+ } else if (config_key_has_cap(driver, sdi, NULL, SR_CONF_SAMPLERATE,
+ SR_CONF_GET | SR_CONF_SET)) {
/* Convert to samples based on the samplerate. */
sr_config_get(driver, sdi, NULL, SR_CONF_SAMPLERATE, &gvar);
samplerate = g_variant_get_uint64(gvar);
rcvd_samples_logic = rcvd_samples_analog = 0;
- if (sr_config_get(driver, sdi, NULL, SR_CONF_SAMPLERATE,
+ if (maybe_config_get(driver, sdi, NULL, SR_CONF_SAMPLERATE,
&gvar) == SR_OK) {
samplerate = g_variant_get_uint64(gvar);
g_variant_unref(gvar);
double tmp_double, dlow, dhigh;
uint64_t tmp_u64, p, q, low, high;
GVariant *rational[2], *range[2];
+ GVariantBuilder *vbl;
gboolean tmp_bool;
+ gchar **keyval;
int ret;
if (!(srci = sr_config_info_name_get(key))) {
src->data = g_variant_new_tuple(range, 2);
}
break;
+ case SR_T_KEYVALUE:
+ /* Expects the argument to be in the form of key=value. */
+ keyval = g_strsplit(value, "=", 2);
+ if (!keyval[0] || !keyval[1]) {
+ g_strfreev(keyval);
+ ret = -1;
+ break;
+ } else {
+ vbl = g_variant_builder_new(G_VARIANT_TYPE_DICTIONARY);
+ g_variant_builder_add(vbl, "{ss}",
+ keyval[0], keyval[1]);
+ src->data = g_variant_builder_end(vbl);
+ g_strfreev(keyval);
+ }
+ break;
default:
+ g_critical("Unknown data type specified for option '%s' "
+ "(driver implementation bug?).", key);
ret = -1;
}
if ((ret = opt_to_gvar(key, value, &src)) != 0)
return ret;
cg = select_channel_group(sdi);
- ret = sr_config_set(sdi, cg, src.key, src.data);
- if (ret != SR_OK) {
+ if ((ret = maybe_config_set(sr_dev_inst_driver_get(sdi), sdi, cg,
+ src.key, src.data)) != SR_OK) {
g_critical("Failed to set device option '%s'.", (char *)key);
return ret;
}
driver = sr_dev_inst_driver_get(sdi);
if (sr_config_list(driver, sdi, NULL, SR_CONF_DEVICE_OPTIONS, &gvar) != SR_OK) {
- g_critical("Failed to query sr_config_list(SR_CONF_DEVICE_OPTIONS).");
+ g_critical("Failed to query list device options.");
return;
}
sr_session_destroy(session);
return;
}
- if (sr_config_list(driver, sdi, NULL,
- SR_CONF_LIMIT_SAMPLES, &gvar) == SR_OK) {
+ if (maybe_config_list(driver, sdi, NULL, SR_CONF_LIMIT_SAMPLES,
+ &gvar) == SR_OK) {
/* The device has no compression, or compression is turned
* off, and publishes its sample memory size. */
g_variant_get(gvar, "(tt)", &min_samples, &max_samples);
}
}
gvar = g_variant_new_uint64(limit_samples);
- if (sr_config_set(sdi, NULL, SR_CONF_LIMIT_SAMPLES, gvar) != SR_OK) {
+ if (maybe_config_set(sr_dev_inst_driver_get(sdi), sdi, NULL, SR_CONF_LIMIT_SAMPLES, gvar) != SR_OK) {
g_critical("Failed to configure sample limit.");
sr_session_destroy(session);
return;
return;
}
gvar = g_variant_new_uint64(limit_frames);
- if (sr_config_set(sdi, NULL, SR_CONF_LIMIT_FRAMES, gvar) != SR_OK) {
+ if (maybe_config_set(sr_dev_inst_driver_get(sdi), sdi, NULL, SR_CONF_LIMIT_FRAMES, gvar) != SR_OK) {
g_critical("Failed to configure frame limit.");
sr_session_destroy(session);
return;