/* this function will encode a basic Element list with several primitives embedded in it */ RsslRet exampleEncodeElementList(RsslEncodeIterator *encIter) { /* create a single RsslElementEntry and reuse for each entry */ RsslElementEntry elemEntry = RSSL_INIT_ELEMENT_ENTRY; /* used to store and check return values */ RsslRet retVal; /* create and initialize element list structure */ RsslElementList elementList = RSSL_INIT_ELEMENT_LIST; /* various data types used during encoding */ RsslTime rsslTime = {10, 21, 16, 777}; RsslUInt rsslUInt = 17; RsslInt rsslInt = 13; /* populate element list structure prior to call to rsslEncodeElementListInit */ /* indicate that standard data will be encoded and that elementListNum is included */ elementList.flags = RSSL_ELF_HAS_STANDARD_DATA | RSSL_ELF_HAS_ELEMENT_LIST_INFO; /* populate elementListNum with info needed to cache */ elementList.elementListNum = 5; /* begin encoding of element list - assumes that the RsslEncodeIterator pointed by the encIter pointer is already populated with buffer and version information */ /* Please note: here for simplicity, we did not use success parameter for rsslEncodeElementListInit/rsslEncodeElementListComplete calls. We are just simply displaying an error if it occurs and exit, thus RSSL_TRUE is used in replacement for success parameter */ if ((retVal = rsslEncodeElementListInit(encIter, &elementList, 0, 0)) < RSSL_RET_SUCCESS) { /* print out message with return value string, value, and text */ printf("Error %s (%d) encountered with rsslEncodeElementListInit(). Error Text: %s\n", rsslRetCodeToString(retVal), retVal, rsslRetCodeInfo(retVal)); return retVal; } /* FIRST Element Entry: encode entry from the RsslTime primitive type */ /* populate and encode element entry with name and dataType information for this element */ elemEntry.name.data = (char *)"Element - RsslTime"; elemEntry.name.length = 20; elemEntry.dataType = RSSL_DT_TIME; printf("\tEncoding Element Entry (name: %.*s) \n", elemEntry.name.length, elemEntry.name.data); retVal = rsslEncodeElementEntry(encIter, &elemEntry, &rsslTime); printf("\t\tEncoded RsslTime: %d:%d:%d\n", rsslTime.hour, rsslTime.minute, rsslTime.second); /* SECOND Element Entry: encode entry from the RsslInt primitive type */ /* populate and encode element entry with name and dataType information for this element */ elemEntry.name.data = (char *)"Element - RsslInt"; elemEntry.name.length = 17; elemEntry.dataType = RSSL_DT_INT; printf("\tEncoding Element Entry (name: %.*s) \n", elemEntry.name.length, elemEntry.name.data); retVal = rsslEncodeElementEntry(encIter, &elemEntry, &rsslInt); printf("\t\tEncoded signed Integer: " RTR_LLD "\n", rsslInt); /* THIRD Element Entry: encode entry from the RsslUInt primitive type */ /* populate and encode element entry with name and dataType information for this element */ elemEntry.name.data = (char *)"Element - RsslUInt"; elemEntry.name.length = 18; elemEntry.dataType = RSSL_DT_UINT; printf("\tEncoding Element Entry (name: %.*s) \n", elemEntry.name.length, elemEntry.name.data); retVal = rsslEncodeElementEntry(encIter, &elemEntry, &rsslUInt); printf("\t\tEncoded Unsigned Integer: " RTR_LLU "\n", rsslUInt); /* FOURTH Element Entry: encode entry from the RsslReal primitive type */ /* populate and encode element entry with name and dataType information for this element */ rsslClearElementEntry(&elemEntry); // clear this to ensure a blank field elemEntry.name.data = (char *)"Element - RsslReal - Blank"; elemEntry.name.length = 26; elemEntry.dataType = RSSL_DT_REAL; printf("\tEncoding Element Entry (name: %.*s) \n", elemEntry.name.length, elemEntry.name.data); retVal = rsslEncodeElementEntry(encIter, &elemEntry, NULL); /* this encodes a blank */ printf("\t\tEncoded RsslReal: Blank\n"); /* complete elementList encoding. If success parameter is true, this will finalize encoding. If success parameter is false, this will roll back encoding prior to rsslEncodeElementListInit */ if ((retVal = rsslEncodeElementListComplete(encIter, RSSL_TRUE)) < RSSL_RET_SUCCESS) { printf("Error %s (%d) encountered with rsslEncodeElementListComplete(). Error Text: %s\n", rsslRetCodeToString(retVal), retVal, rsslRetCodeInfo(retVal)); return retVal; } printf("\tElementList Encoding Complete\n"); return RSSL_RET_SUCCESS; }
//APIQA RsslRet sendGenericMsgOnLogin(RsslChannel* chnl) { RsslRet ret = 0; RsslGenericMsg msg = RSSL_INIT_GENERIC_MSG; RsslMap map = RSSL_INIT_MAP; RsslMapEntry mEntry = RSSL_INIT_MAP_ENTRY; RsslElementList rsslElementList = RSSL_INIT_ELEMENT_LIST; RsslBuffer serviceNameBuffer; RsslEncodeIterator encodeIter; RsslElementEntry element = RSSL_INIT_ELEMENT_ENTRY; RsslBuffer* msgBuf; RsslError error; RsslUInt warmStandByMode = 1; serviceNameBuffer.length = 11; serviceNameBuffer.data = "DIRECT_FEED"; /* clear encode iterator */ rsslClearEncodeIterator(&encodeIter); /* set-up message */ msg.msgBase.msgClass = RSSL_MC_GENERIC; msg.msgBase.domainType = RSSL_DMT_LOGIN; msg.msgBase.containerType = RSSL_DT_MAP; msg.msgBase.msgKey.name.length = 24; msg.msgBase.msgKey.name.data = "ConsumerConnectionStatus"; msg.msgBase.msgKey.flags = RSSL_MKF_HAS_NAME; msg.flags = RSSL_GNMF_HAS_MSG_KEY | RSSL_GNMF_MESSAGE_COMPLETE; /* get a buffer for the login request */ msgBuf = rsslGetBuffer(chnl, MAX_MSG_SIZE, RSSL_FALSE, &error); /* StreamId */ msg.msgBase.streamId = LOGIN_STREAM_ID; /* encode message */ if ((ret = rsslSetEncodeIteratorBuffer(&encodeIter, msgBuf)) < RSSL_RET_SUCCESS) { printf("rsslSetEncodeIteratorBuffer() failed with return code: %d\n", ret); return ret; } rsslSetEncodeIteratorRWFVersion(&encodeIter, chnl->majorVersion, chnl->minorVersion); if ((ret = rsslEncodeMsgInit(&encodeIter, (RsslMsg*)&msg, 0)) < RSSL_RET_SUCCESS) { printf("rsslEncodeMsgInit() failed with return code: %d\n", ret); return ret; } /* encode map */ map.keyPrimitiveType = RSSL_DT_ASCII_STRING; map.containerType = RSSL_DT_ELEMENT_LIST; if ((ret = rsslEncodeMapInit(&encodeIter, &map, 0, 0)) < RSSL_RET_SUCCESS) { printf("rsslEncodeMapInit() failed with return code: %d\n", ret); return ret; } /* encode map entry */ mEntry.action = RSSL_MPEA_ADD_ENTRY; if ((ret = rsslEncodeMapEntryInit(&encodeIter, &mEntry, &serviceNameBuffer, 0)) < RSSL_RET_SUCCESS) { printf("rsslEncodeMapEntry() failed with return code: %d\n", ret); return ret; } /* encode the element list */ rsslElementList.flags = RSSL_ELF_HAS_STANDARD_DATA; if ((ret = rsslEncodeElementListInit(&encodeIter, &rsslElementList, 0, 0)) < RSSL_RET_SUCCESS) { printf("rsslEncodeElementListInit() failed with return code: %d\n", ret); return ret; } /* WarmStandbyMode */ element.dataType = RSSL_DT_UINT; element.name = RSSL_ENAME_WARMSTANDBY_MODE; if ((ret = rsslEncodeElementEntry(&encodeIter, &element, &warmStandByMode)) < RSSL_RET_SUCCESS) { printf("rsslEncodeElementEntry() failed with return code: %d\n", ret); return ret; } /* complete encode element list */ if ((ret = rsslEncodeElementListComplete(&encodeIter, RSSL_TRUE)) < RSSL_RET_SUCCESS) { printf("rsslEncodeElementListComplete() failed with return code: %d\n", ret); return ret; } /* complete encode map entry */ if ((ret = rsslEncodeMapEntryComplete(&encodeIter, RSSL_TRUE)) < RSSL_RET_SUCCESS) { printf("rsslEncodeMapEntryComplete() failed with return code: %d\n", ret); return ret; } /* complete encode map */ if ((ret = rsslEncodeMapComplete(&encodeIter, RSSL_TRUE)) < RSSL_RET_SUCCESS) { printf("rsslEncodeMapComplete() failed with return code: %d\n", ret); return ret; } /* complete encode message */ if ((ret = rsslEncodeMsgComplete(&encodeIter, RSSL_TRUE)) < RSSL_RET_SUCCESS) { printf("rsslEncodeMsgComplete() failed with return code: %d\n", ret); return ret; } msgBuf->length = rsslGetEncodedBufferLength(&encodeIter); if (ret != RSSL_RET_SUCCESS) { rsslReleaseBuffer(msgBuf, &error); printf("\nsendGenericMsgOnLogin() failed with return code: %d\n", ret); return ret; } /* send login request */ if (sendMessage(chnl, msgBuf) != RSSL_RET_SUCCESS) return RSSL_RET_FAILURE; return RSSL_RET_SUCCESS; }
/* * Encodes the View Element Entry. This entry contains an array of FIDs * that the consumer wishes to receive from the provider. * * This function is only used within the Market Price Handler */ static RsslRet encodeViewElementRequest(RsslEncodeIterator* encodeIter) { RsslRet ret = 0; RsslElementEntry eEntry = RSSL_INIT_ELEMENT_ENTRY; RsslArray viewArray = RSSL_INIT_ARRAY; /* These values are taken from the RDMFieldDictionary. * 22 = BID * 25 = ASK * 30 = BIDSIZE * 31 = ASKSIZE * 1025 = QUOTIM */ RsslUInt viewList[5] = {22, 25, 30, 31, 1025}; RsslUInt fdList; int viewListCount = 5; int i; eEntry.name = RSSL_ENAME_VIEW_TYPE; eEntry.dataType = RSSL_DT_UINT; fdList = RDM_VIEW_TYPE_FIELD_ID_LIST; if((ret = rsslEncodeElementEntry(encodeIter, &eEntry, &fdList)) < RSSL_RET_SUCCESS) { printf("rsslEncodeElementEntry() failed with return code: %d\n", ret); return ret; } rsslClearElementEntry(&eEntry); eEntry.name = RSSL_ENAME_VIEW_DATA; eEntry.dataType = RSSL_DT_ARRAY; if((ret = rsslEncodeElementEntryInit(encodeIter, &eEntry, 0)) < RSSL_RET_SUCCESS) { printf("rsslEncodeElementEntryInit() failed with return code: %d\n", ret); return ret; } viewArray.primitiveType = RSSL_DT_INT; viewArray.itemLength = 2; if((ret = rsslEncodeArrayInit(encodeIter, &viewArray)) < RSSL_RET_SUCCESS) { printf("rsslEncodeArrayInit() failed with return code: %d\n", ret); return ret; } for(i = 0; i < viewListCount; i++) { if((ret = rsslEncodeArrayEntry(encodeIter, 0, &viewList[i])) < RSSL_RET_SUCCESS) { printf("rsslEncodeArrayEntry() failed with return code: %d\n", ret); return ret; } } if ((ret = rsslEncodeArrayComplete(encodeIter, RSSL_TRUE)) < RSSL_RET_SUCCESS) { printf("rsslEncodeElementEntryComplete() failed with return code: %d\n", ret); return ret; } /* complete encoding of complex element entry. */ if ((ret = rsslEncodeElementEntryComplete(encodeIter, RSSL_TRUE)) < RSSL_RET_SUCCESS) { printf("rsslEncodeElementEntryComplete() failed with return code: %d\n", ret); return ret; } return RSSL_RET_SUCCESS; }