question

Upvotes
Accepted
9 3 3 3

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-sdkema-apirrtelektron-message-api
icon clock
10 |1500

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

Hello @ye.li

Thank you for your participation in the forum. Is the reply below satisfactory in resolving your query?

If yes, please click the 'Accept' text next to the reply. This will guide all community members who have a similar question. Otherwise please post again offering further insight into your question.

Thanks,

AHS

1 Answer

· Write an Answer
Upvotes
Accepted
11.3k 25 9 14

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 512.0 KiB each and 1.0 MiB total.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

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