decode of just encoded object in EMA C++

I have a C++ application that subscribe to other data, convert some of the fields to EMA data field and post to TRCC. I added those fields to a FieldList.

I want to print out the fields in the Fieldlist for sanity check on how the conversion works and keep a record of what is posted to TRCC. But if I run FieldList::toString() or other get functions, it complains that "Decoding of just encoded object in the same application is not supported". Is there an easier way to do decoding in the same application?

Best Answer

  • Hi @ye.li,

    I have found a method in the EMA C++ UnitTest application provided in the EMA C++ package to decode just encoded FieldList in EMA application using StaticDecoder class. Below is the sample code.

    #include "Access/Impl/StaticDecoder.h" ...
    FieldList fl;
    fl.addReal(25, 80, OmmReal::ExponentPos1Enum);
    fl.complete();

    StaticDecoder::setData(&fl, &dictionary);
    while (fl.forth())
    {
    const FieldEntry& fe = fl.getEntry();
    cout << "Name: " << fe.getName() << " Value: ";
    cout << fe.toString() << endl;
    }

    The StaticDecoder::setData() requires RsslDataDictionary object which required dictionary data loaded from local dictionary files (RDMFIeldDictionary, enumtype.def) first.

    RsslDataDictionary dictionary;
    loadDictionaryFromFile(&dictionary);

    loadDictionaryFromFile() code

    bool loadDictionaryFromFile(RsslDataDictionary* pDictionary)
    {
        RsslBool fieldDictionaryLoaded = RSSL_FALSE, enumTableLoaded = RSSL_FALSE;
        char errTxt[256];
        RsslBuffer errorText = { 255, (char*)errTxt };

        const char* fieldDictionaryFileName = "RDMFieldDictionary";
        const char* enumTableFileName = "enumtype.def";

        rsslClearDataDictionary(pDictionary);

        if (rsslLoadFieldDictionary(fieldDictionaryFileName, pDictionary, &errorText) < 0)
            cout << "\nUnable to load field dictionary.\n\tError Text: " << errorText.data << endl;
        else
            fieldDictionaryLoaded = RSSL_TRUE;

        if (rsslLoadEnumTypeDictionary(enumTableFileName, pDictionary, &errorText) < 0)
            cout << "\nUnable to load enum type dictionary.\n\tError Text: " << errorText.data << endl;
        else
            enumTableLoaded = RSSL_TRUE;

        if (fieldDictionaryLoaded && enumTableLoaded)
        {
            return true;
        }
        else
        {
            rsslDeleteDataDictionary(pDictionary);

            return false;
        }
    }