X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fprop%2Fbinding%2Fdecoderoptions.cpp;h=5ad7e3562e6150e057c9299964069af1e931feba;hp=27ac44566e68323ee5ab0a453006a25d23f4b486;hb=4e5a4405482a296ebb6014e627298ad156c78d55;hpb=21ad818feabcb0a1cb51c61c534adce553c7e325 diff --git a/pv/prop/binding/decoderoptions.cpp b/pv/prop/binding/decoderoptions.cpp index 27ac4456..5ad7e356 100644 --- a/pv/prop/binding/decoderoptions.cpp +++ b/pv/prop/binding/decoderoptions.cpp @@ -18,18 +18,95 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include "decoderoptions.h" +#include +#include + +#include +#include +#include + +using namespace boost; +using namespace std; + namespace pv { namespace prop { namespace binding { -DecoderOptions::DecoderOptions(struct srd_decoder *decoder) : +DecoderOptions::DecoderOptions(shared_ptr decoder) : _decoder(decoder) { + assert(_decoder); + + const srd_decoder *const dec = _decoder->decoder(); + assert(dec); + + for (GSList *l = dec->options; l; l = l->next) + { + const srd_decoder_option *const opt = + (srd_decoder_option*)l->data; + + const QString name(opt->desc); + + const Property::Getter getter = bind( + &DecoderOptions::getter, this, opt->id); + const Property::Setter setter = bind( + &DecoderOptions::setter, this, opt->id, _1); + + shared_ptr prop; + + if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) + prop = shared_ptr( + new Int(name, "", none, getter, setter)); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) + prop = shared_ptr( + new String(name, getter, setter)); + else + continue; + + _properties.push_back(prop); + } +} + +GVariant* DecoderOptions::getter(const char *id) +{ + assert(_decoder); + + // Get the value from the hash table if it is already present + GVariant *val = (GVariant*)g_hash_table_lookup( + (GHashTable*)_decoder->options(), id); + + if (!val) + { + assert(_decoder->decoder()); + + // Get the default value if not + for (GSList *l = _decoder->decoder()->options; l; l = l->next) + { + const srd_decoder_option *const opt = + (srd_decoder_option*)l->data; + if (strcmp(opt->id, id) == 0) { + val = opt->def; + break; + } + } + } + + if (val) + g_variant_ref(val); + + return val; +} + +void DecoderOptions::setter(const char *id, GVariant *value) +{ + assert(_decoder); + _decoder->set_option(id, value); } } // binding } // prop } // pv -