how to get string representation of enum in EMA c++ library

How do I get string value for an enum field?

See the **** in the code below.

So, for example, in following

FieldEntry fid="118" name="PRC_QL_CD" dataType="Enum" value="62"

I dont want 62, I want CQ

62 "CQ " closing quotation - supplied by CQS and Japanese SE's. // from enumtype.def

It seems that EMA c++ may not have a direct way of achieving this. Is there a code snippet to parse RDMFieldDictionary and enumtype.def files? If code snippet is not available than is there any doc that describes the exact syntax of these files so that I can parse it myself and compute the mappings.

    while (fl.forth()) {
const FieldEntry& fe = fl.getEntry();
switch (fe.getLoadType()) {
case DataType::IntEnum: {
// use fe.getInt();
}; break;
case DataType::EnumEnum: {
fe.getEnum() **** returns integer value like 62, not useful
static_cast<const OmmEnum&>(fe.getLoad()).toString() **** returns "62", again not useful
}; break;
.....
}

Best Answer

  • Jirapongse
    Answer ✓

    Dictionary in EMA is hidden so the application can't access it.

    However, the application can load its own dictionary. You can use rsslDataDictionary.h in \Eta\Include\Codec\rtr directory to decode the data dictionary. The below snippet code shows how to use RsslDataDictionary to load dictionary from local files.

    Consumer.h

    #include "Ema.h"
    #include "rtr/rsslDataDictionary.h"
    ...

    class AppClient : public thomsonreuters::ema::access::OmmConsumerClient
    {
    private:
    RsslDataDictionary dict;

    public :
    AppClient();
    void decode( const thomsonreuters::ema::access::FieldList& ); // print content of passed in FieldList to screen

    Consumer.cpp

    AppClient::AppClient()
    {
    char errText[256];
    RsslBuffer errorText = { 255, (char*)errText };
    rsslClearDataDictionary(&dict);


    if (rsslLoadFieldDictionary("RDMFieldDictionary", &dict, &errorText) < 0)
    printf("\nUnable to load field dictionary. Will attempt to download from provider.\n\tError Text: %s\n", errorText.data);




    if (rsslLoadEnumTypeDictionary("enumtype.def", &dict, &errorText) < 0)
    printf("\nUnable to load enum type dictionary. Will attempt to download from provider.\n\tError Text: %s\n", errorText.data);



    }
    ...
    void AppClient::decode( const FieldList& fl )
    {
    RsslDictionaryEntry* dictionaryEntry = NULL;


    while ( fl.forth() )
    {
    if (fl.getEntry().getLoadType()==DataType::EnumEnum)
    {
    dictionaryEntry = dict.entriesArray[fl.getEntry().getFieldId()];
    RsslEnumType *pEnumType = getFieldEntryEnumType(dictionaryEntry, fl.getEntry().getEnum());
    if (pEnumType)
    {
    cout << "Enum Fid: " << fl.getEntry().getFieldId() << " Name: " << fl.getEntry().getName() << " value: " << fl.getEntry().getLoad().toString();
    printf("(%.*s)\n", pEnumType->display.length, pEnumType->display.data);
    }
    else
    cout << "Fid: " << fl.getEntry().getFieldId() << " Name: " << fl.getEntry().getName() << " value: " << fl.getEntry().getLoad().toString() << endl;
    }
    else{
    cout << "Fid: " << fl.getEntry().getFieldId() << " Name: " << fl.getEntry().getName() << " value: " << fl.getEntry().getLoad().toString() << endl;
    }
    }
    }