X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fbinding%2Fdecoder.cpp;fp=pv%2Fbinding%2Fdecoder.cpp;h=dd5716027aeb492d47ab298c3f506f7f028148cc;hb=3cc9ad7b867853315473df611612c562d562ed8a;hp=0000000000000000000000000000000000000000;hpb=61703a0124c7ace84caf415f7d491a3ad6f42599;p=pulseview.git diff --git a/pv/binding/decoder.cpp b/pv/binding/decoder.cpp new file mode 100644 index 0000000..dd57160 --- /dev/null +++ b/pv/binding/decoder.cpp @@ -0,0 +1,151 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2013 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "decoder.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +using boost::none; +using std::make_pair; +using std::map; +using std::pair; +using std::shared_ptr; +using std::string; +using std::vector; + +using pv::prop::Double; +using pv::prop::Enum; +using pv::prop::Int; +using pv::prop::Property; +using pv::prop::String; + +namespace pv { +namespace binding { + +Decoder::Decoder( + shared_ptr decoder_stack, + shared_ptr decoder) : + decoder_stack_(decoder_stack), + 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 = QString::fromUtf8(opt->desc); + + const Property::Getter get = [&, opt]() { + return getter(opt->id); }; + const Property::Setter set = [&, opt](Glib::VariantBase value) { + setter(opt->id, value); }; + + shared_ptr prop; + + if (opt->values) + prop = bind_enum(name, opt, get, set); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("d"))) + prop = shared_ptr(new Double(name, 2, "", + none, none, get, set)); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) + prop = shared_ptr( + new Int(name, "", none, get, set)); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) + prop = shared_ptr( + new String(name, get, set)); + else + continue; + + properties_.push_back(prop); + } +} + +shared_ptr Decoder::bind_enum( + const QString &name, const srd_decoder_option *option, + Property::Getter getter, Property::Setter setter) +{ + vector< pair > values; + for (GSList *l = option->values; l; l = l->next) { + Glib::VariantBase var = Glib::VariantBase((GVariant*)l->data, true); + values.push_back(make_pair(var, print_gvariant(var))); + } + + return shared_ptr(new Enum(name, values, getter, setter)); +} + +Glib::VariantBase Decoder::getter(const char *id) +{ + GVariant *val = NULL; + + assert(decoder_); + + // Get the value from the hash table if it is already present + const map& options = decoder_->options(); + const auto iter = options.find(id); + + if (iter != options.end()) + val = (*iter).second; + else + { + 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) + return Glib::VariantBase(val, true); + else + return Glib::VariantBase(); +} + +void Decoder::setter(const char *id, Glib::VariantBase value) +{ + assert(decoder_); + decoder_->set_option(id, value.gobj()); + + assert(decoder_stack_); + decoder_stack_->begin_decode(); +} + +} // binding +} // pv