question

Upvotes
Accepted
9 0 0 1

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?

elektronrefinitiv-realtimeelektron-sdkrrtema-apielektron-message-api
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 5.0 MiB each and 10.0 MiB total.

1 Answer

Upvotes
Accepted
11.3k 25 8 13

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;
    }
}
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 5.0 MiB each and 10.0 MiB total.

Click below to post an Idea Post Idea