X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2FConfigKey_methods.cpp;h=be70b06df0e8380cab8aa5209fb554553afcd11e;hb=fcd6a8bdf179d7ac0558eef2e205bfb941e5ba5c;hp=d391561047f32e234d9c9eb9200e575418ff873d;hpb=21d1bec60e6d69f6f2ef6f3dc3e07219153285c0;p=libsigrok.git diff --git a/bindings/cxx/ConfigKey_methods.cpp b/bindings/cxx/ConfigKey_methods.cpp index d3915610..be70b06d 100644 --- a/bindings/cxx/ConfigKey_methods.cpp +++ b/bindings/cxx/ConfigKey_methods.cpp @@ -70,12 +70,12 @@ static inline double stod( const std::string& str ) } #endif -Glib::VariantBase ConfigKey::parse_string(string value) const +Glib::VariantBase ConfigKey::parse_string(string value, enum sr_datatype dt) { GVariant *variant; uint64_t p, q; - switch (data_type()->id()) + switch (dt) { case SR_T_UINT64: check(sr_parse_sizestring(value.c_str(), &p)); @@ -88,7 +88,11 @@ Glib::VariantBase ConfigKey::parse_string(string value) const variant = g_variant_new_boolean(sr_parse_boolstring(value.c_str())); break; case SR_T_FLOAT: - variant = g_variant_new_double(stod(value)); + try { + variant = g_variant_new_double(stod(value)); + } catch (invalid_argument) { + throw Error(SR_ERR_ARG); + } break; case SR_T_RATIONAL_PERIOD: check(sr_parse_period(value.c_str(), &p, &q)); @@ -99,7 +103,11 @@ Glib::VariantBase ConfigKey::parse_string(string value) const variant = g_variant_new("(tt)", p, q); break; case SR_T_INT32: - variant = g_variant_new_int32(stoi(value)); + try { + variant = g_variant_new_int32(stoi(value)); + } catch (invalid_argument) { + throw Error(SR_ERR_ARG); + } break; default: throw Error(SR_ERR_BUG); @@ -108,3 +116,8 @@ Glib::VariantBase ConfigKey::parse_string(string value) const return Glib::VariantBase(variant, false); } +Glib::VariantBase ConfigKey::parse_string(string value) const +{ + enum sr_datatype dt = (enum sr_datatype)(data_type()->id()); + return parse_string(value, dt); +}