]> sigrok.org Git - pulseview.git/blobdiff - pv/prop/binding/decoderoptions.cpp
pv::prop::Int: Removed assert from Int::get_widget
[pulseview.git] / pv / prop / binding / decoderoptions.cpp
index dc3a8e974355c515322d3fb30e1920f4148afaab..e29436768ab499d8364790cd9605335b00f810ad 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#include <libsigrokdecode/libsigrokdecode.h>
+
 #include "decoderoptions.h"
 
+#include <boost/bind.hpp>
 #include <boost/foreach.hpp>
 #include <boost/none_t.hpp>
 
+#include <pv/data/decoderstack.h>
+#include <pv/data/decode/decoder.h>
 #include <pv/prop/int.h>
 #include <pv/prop/string.h>
 
-using namespace boost;
-using namespace std;
+using boost::bind;
+using boost::none;
+using boost::shared_ptr;
+using std::map;
+using std::string;
 
 namespace pv {
 namespace prop {
 namespace binding {
 
-DecoderOptions::DecoderOptions(const srd_decoder *decoder,
-       GHashTable *options) :
-       _decoder(decoder),
-       _options(options)
+DecoderOptions::DecoderOptions(
+       shared_ptr<pv::data::DecoderStack> decoder_stack,
+       shared_ptr<data::decode::Decoder> decoder) :
+       _decoder_stack(decoder_stack),
+       _decoder(decoder)
 {
-       assert(decoder);
+       assert(_decoder);
 
+       const srd_decoder *const dec = _decoder->decoder();
+       assert(dec);
 
-       for (GSList *l = decoder->options; l; l = l->next)
+       for (GSList *l = dec->options; l; l = l->next)
        {
                const srd_decoder_option *const opt =
                        (srd_decoder_option*)l->data;
@@ -70,13 +81,22 @@ DecoderOptions::DecoderOptions(const srd_decoder *decoder,
 
 GVariant* DecoderOptions::getter(const char *id)
 {
+       GVariant *val = NULL;
+
+       assert(_decoder);
+
        // Get the value from the hash table if it is already present
-       GVariant *val = (GVariant*)g_hash_table_lookup(_options, id);
+       const map<string, GVariant*>& options = _decoder->options();
+       map<string, GVariant*>::const_iterator iter = options.find(id);
 
-       if (!val)
+       if (iter != options.end())
+               val = (*iter).second;
+       else
        {
+               assert(_decoder->decoder());
+
                // Get the default value if not
-               for (GSList *l = _decoder->options; l; l = l->next)
+               for (GSList *l = _decoder->decoder()->options; l; l = l->next)
                {
                        const srd_decoder_option *const opt =
                                (srd_decoder_option*)l->data;
@@ -95,8 +115,11 @@ GVariant* DecoderOptions::getter(const char *id)
 
 void DecoderOptions::setter(const char *id, GVariant *value)
 {
-       g_variant_ref(value);
-       g_hash_table_insert(_options, (void*)g_strdup(id), value);
+       assert(_decoder);
+       _decoder->set_option(id, value);
+
+       assert(_decoder_stack);
+       _decoder_stack->begin_decode();
 }
 
 } // binding