]> sigrok.org Git - libsigrok.git/blobdiff - bindings/cxx/ConfigKey_methods.cpp
Add C++ bindings.
[libsigrok.git] / bindings / cxx / ConfigKey_methods.cpp
diff --git a/bindings/cxx/ConfigKey_methods.cpp b/bindings/cxx/ConfigKey_methods.cpp
new file mode 100644 (file)
index 0000000..54fa66c
--- /dev/null
@@ -0,0 +1,70 @@
+const DataType *ConfigKey::get_data_type() const
+{
+       const struct sr_config_info *info = sr_config_info_get(id);
+       if (!info)
+               throw Error(SR_ERR_NA);
+       return DataType::get(info->datatype);
+}
+
+string ConfigKey::get_identifier() const
+{
+       const struct sr_config_info *info = sr_config_info_get(id);
+       if (!info)
+               throw Error(SR_ERR_NA);
+       return valid_string(info->id);
+}
+
+string ConfigKey::get_description() const
+{
+       const struct sr_config_info *info = sr_config_info_get(id);
+       if (!info)
+               throw Error(SR_ERR_NA);
+       return valid_string(info->name);
+}
+
+const ConfigKey *ConfigKey::get(string identifier)
+{
+       const struct sr_config_info *info = sr_config_info_name_get(identifier.c_str());
+       if (!info)
+               throw Error(SR_ERR_ARG);
+       return get(info->key);
+}
+
+Glib::VariantBase ConfigKey::parse_string(string value) const
+{
+       GVariant *variant;
+       uint64_t p, q;
+
+       switch (get_data_type()->get_id())
+       {
+               case SR_T_UINT64:
+                       check(sr_parse_sizestring(value.c_str(), &p));
+                       variant = g_variant_new_uint64(p);
+                       break;
+               case SR_T_STRING:
+                       variant = g_variant_new_string(value.c_str());
+                       break;
+               case SR_T_BOOL:
+                       variant = g_variant_new_boolean(sr_parse_boolstring(value.c_str()));
+                       break;
+               case SR_T_FLOAT:
+                       variant = g_variant_new_double(stod(value));
+                       break;
+               case SR_T_RATIONAL_PERIOD:
+                       check(sr_parse_period(value.c_str(), &p, &q));
+                       variant = g_variant_new("(tt)", p, q);
+                       break;
+               case SR_T_RATIONAL_VOLT:
+                       check(sr_parse_voltage(value.c_str(), &p, &q));
+                       variant = g_variant_new("(tt)", p, q);
+                       break;
+               case SR_T_INT32:
+                       variant = g_variant_new_int32(stoi(value));
+                       break;
+               default:
+                       throw Error(SR_ERR_BUG);
+       }
+
+       return Glib::VariantBase(variant, true);
+}
+