+ key->id(), &data));
+ return Glib::VariantContainerBase(data);
+}
+
+map<const ConfigKey *, set<Capability>> Configurable::config_keys(const ConfigKey *key)
+{
+ GVariant *gvar_opts;
+ gsize num_opts;
+ const uint32_t *opts;
+ map<const ConfigKey *, set<Capability>> result;
+
+ check(sr_config_list(
+ config_driver, config_sdi, config_channel_group,
+ key->id(), &gvar_opts));
+
+ opts = (const uint32_t *) g_variant_get_fixed_array(
+ gvar_opts, &num_opts, sizeof(uint32_t));
+
+ for (gsize i = 0; i < num_opts; i++)
+ {
+ auto key = ConfigKey::get(opts[i] & SR_CONF_MASK);
+ set<Capability> capabilities;
+ if (opts[i] & SR_CONF_GET)
+ capabilities.insert(GET);
+ if (opts[i] & SR_CONF_SET)
+ capabilities.insert(SET);
+ if (opts[i] & SR_CONF_LIST)
+ capabilities.insert(LIST);
+ result[key] = capabilities;
+ }
+
+ g_variant_unref(gvar_opts);
+
+ return result;
+}
+
+bool Configurable::config_check(const ConfigKey *key,
+ const ConfigKey *index_key)
+{
+ GVariant *gvar_opts;
+ gsize num_opts;
+ const uint32_t *opts;
+
+ if (sr_config_list(config_driver, config_sdi, config_channel_group,
+ index_key->id(), &gvar_opts) != SR_OK)
+ return false;
+
+ opts = (const uint32_t *) g_variant_get_fixed_array(
+ gvar_opts, &num_opts, sizeof(uint32_t));
+
+ for (gsize i = 0; i < num_opts; i++)
+ {
+ if ((opts[i] & SR_CONF_MASK) == key->id())
+ {
+ g_variant_unref(gvar_opts);
+ return true;
+ }
+ }
+
+ g_variant_unref(gvar_opts);
+
+ return false;