question

Upvotes
Accepted
3 2 2 10

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;
            .....
            }
    
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
38.1k 71 35 53

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;
		}
	}
}
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