question

Upvotes
Accepted
3 4 9 12

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-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.

Monitored by Veerapath.

@ujjwal

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

Please be informed that a reply has been verified as correct in answering the question, and has been marked as such. Thanks, AHS

1 Answer

· Write an Answer
Upvotes
Accepted
79.4k 253 52 74

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 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.