RsslRet encodeItemUpdate(RsslChannel* chnl, ItemInfo* itemInfo, RsslBuffer* msgBuf, RsslPostUserInfo *pPostUserInfo, RsslUInt encodeStartTime) { RsslRet ret; RsslUpdateMsg updateMsg; RsslEncodeIterator encodeIter; rsslClearUpdateMsg(&updateMsg); updateMsg.msgBase.streamId = itemInfo->StreamId; rsslClearEncodeIterator(&encodeIter); rsslSetEncodeIteratorRWFVersion(&encodeIter, chnl->majorVersion, chnl->minorVersion); if ((ret = rsslSetEncodeIteratorBuffer(&encodeIter, msgBuf)) != RSSL_RET_SUCCESS) return ret; updateMsg.msgBase.domainType = itemInfo->attributes.domainType; if (pPostUserInfo) { updateMsg.flags |= RSSL_UPMF_HAS_POST_USER_INFO; updateMsg.postUserInfo = *pPostUserInfo; } switch(itemInfo->attributes.domainType) { case RSSL_DMT_MARKET_PRICE: updateMsg.msgBase.containerType = RSSL_DT_FIELD_LIST; if ((ret = rsslEncodeMsgInit(&encodeIter, (RsslMsg*)&updateMsg, 0)) < RSSL_RET_SUCCESS) return ret; if ((ret = encodeMarketPriceDataBody(&encodeIter, getNextMarketPriceUpdate((MarketPriceItem*)itemInfo->itemData), RSSL_MC_UPDATE, encodeStartTime)) < RSSL_RET_SUCCESS) return ret; break; case RSSL_DMT_MARKET_BY_ORDER: updateMsg.msgBase.containerType = RSSL_DT_MAP; if ((ret = rsslEncodeMsgInit(&encodeIter, (RsslMsg*)&updateMsg, 0)) < RSSL_RET_SUCCESS) return ret; if ((ret = encodeMarketByOrderDataBody(&encodeIter, getNextMarketByOrderUpdate((MarketByOrderItem*)itemInfo->itemData), RSSL_MC_UPDATE, encodeStartTime)) < RSSL_RET_SUCCESS) return ret; break; default: assert(0); break; } if ((ret = rsslEncodeMsgComplete(&encodeIter, RSSL_TRUE)) < RSSL_RET_SUCCESS) return ret; msgBuf->length = rsslGetEncodedBufferLength(&encodeIter); return RSSL_RET_SUCCESS; }
static RsslRet reflectPostMsg(ProviderThread *pProvThread, RsslDecodeIterator *pIter, ProviderSession *pProvSession, RsslPostMsg *pPostMsg) { RsslRet ret; RsslChannel *pChannel = pProvSession->pChannelInfo->pChannel; RsslMsg msgToReflect; RsslEncodeIterator eIter; switch(pPostMsg->msgBase.containerType) { case RSSL_DT_MSG: if ((ret = rsslDecodeMsg(pIter, &msgToReflect)) != RSSL_RET_SUCCESS) return ret; break; default: /* It's a container(e.g. field list). Add an update header for reflecting. */ rsslClearUpdateMsg(&msgToReflect.updateMsg); msgToReflect.updateMsg.msgBase.containerType = pPostMsg->msgBase.containerType; msgToReflect.updateMsg.msgBase.domainType = pPostMsg->msgBase.domainType; msgToReflect.updateMsg.msgBase.encDataBody = pPostMsg->msgBase.encDataBody; break; } /* get a buffer for the response */ if (rtrUnlikely((ret = getItemMsgBuffer(pProvThread, pProvSession, 128 + msgToReflect.msgBase.encDataBody.length)) < RSSL_RET_SUCCESS)) return ret; /* Add the post user info from the post message to the nested message and re-encode. */ rsslClearEncodeIterator(&eIter); rsslSetEncodeIteratorRWFVersion(&eIter, pChannel->majorVersion, pChannel->minorVersion); rsslSetEncodeIteratorBuffer(&eIter, pProvSession->pWritingBuffer); /* Add stream ID of PostMsg to nested message. */ msgToReflect.msgBase.streamId = pPostMsg->msgBase.streamId; /* Add PostUserInfo of PostMsg to nested message. */ switch(msgToReflect.msgBase.msgClass) { case RSSL_MC_REFRESH: msgToReflect.refreshMsg.postUserInfo = pPostMsg->postUserInfo; msgToReflect.refreshMsg.flags |= RSSL_RFMF_HAS_POST_USER_INFO; msgToReflect.refreshMsg.flags &= ~RSSL_RFMF_SOLICITED; break; case RSSL_MC_UPDATE: msgToReflect.updateMsg.postUserInfo = pPostMsg->postUserInfo; msgToReflect.updateMsg.flags |= RSSL_UPMF_HAS_POST_USER_INFO; break; case RSSL_MC_STATUS: msgToReflect.statusMsg.postUserInfo = pPostMsg->postUserInfo; msgToReflect.statusMsg.flags |= RSSL_STMF_HAS_POST_USER_INFO; break; default: printf("Error: Unhandled message class in post: %s(%u)\n", rsslMsgClassToString(msgToReflect.msgBase.msgClass), msgToReflect.msgBase.msgClass); return RSSL_RET_FAILURE; } /* Other header members & data body should be properly set, so re-encode. */ if (ret = rsslEncodeMsg(&eIter, &msgToReflect) != RSSL_RET_SUCCESS) return ret; pProvSession->pWritingBuffer->length = rsslGetEncodedBufferLength(&eIter); return sendItemMsgBuffer(pProvThread, pProvSession, RSSL_FALSE); }
void encodeUpdateMsg( RsslUInt8 domainType, RsslInt32 streamId, RsslBuffer* pRsslBuffer ) { RsslEncodeIterator eIter; RsslUpdateMsg updateMsg; RsslFieldList fList; RsslFieldEntry fEntry; RsslBuffer payload; char payloadBuffer[1024]; RsslUInt value; RsslReal real; RsslDate date; RsslTime time; payload.data = &payloadBuffer[0]; payload.length = 1024; rsslClearEncodeIterator( &eIter ); rsslClearUpdateMsg( &updateMsg ); rsslClearFieldList( &fList ); rsslClearFieldEntry( &fEntry ); updateMsg.flags |= RSSL_UPMF_DO_NOT_CONFLATE; updateMsg.msgBase.domainType = domainType; updateMsg.msgBase.streamId = streamId; if ( domainType = RSSL_DMT_MARKET_PRICE ) { updateMsg.msgBase.containerType = RSSL_DT_FIELD_LIST; rsslSetEncodeIteratorBuffer( &eIter, &payload ); rsslSetEncodeIteratorRWFVersion( &eIter, RSSL_RWF_MAJOR_VERSION, RSSL_RWF_MINOR_VERSION ); fList.flags |= RSSL_FLF_HAS_STANDARD_DATA | RSSL_FLF_HAS_FIELD_LIST_INFO; fList.fieldListNum = 1; fList.dictionaryId = 1; rsslEncodeFieldListInit( &eIter, &fList, 0, 0 ); fEntry.dataType = RSSL_DT_UINT; fEntry.fieldId = 1; value = 1; rsslEncodeFieldEntry( &eIter, &fEntry, (void*)&value ); fEntry.dataType = RSSL_DT_REAL; fEntry.fieldId = 6; real.isBlank = RSSL_FALSE; real.hint = RSSL_RH_EXPONENT_2; real.value = 11; rsslEncodeFieldEntry( &eIter, &fEntry, (void*)&real ); fEntry.dataType = RSSL_DT_DATE; fEntry.fieldId = 16; rsslClearDate(&date); date.day = 7; date.month = 11; date.year = 1999; rsslEncodeFieldEntry( &eIter, &fEntry, (void*)&date ); fEntry.dataType = RSSL_DT_TIME; fEntry.fieldId = 18; rsslClearTime(&time); time.hour = 02; time.minute = 03; time.second = 04; time.millisecond = 005; rsslEncodeFieldEntry( &eIter, &fEntry, (void*)&time ); rsslEncodeFieldListComplete( &eIter, RSSL_TRUE ); payload.length = rsslGetEncodedBufferLength( &eIter ); updateMsg.msgBase.encDataBody = payload; rsslClearEncodeIterator( &eIter ); rsslSetEncodeIteratorBuffer( &eIter, pRsslBuffer ); rsslSetEncodeIteratorRWFVersion( &eIter, RSSL_RWF_MAJOR_VERSION, RSSL_RWF_MINOR_VERSION ); rsslEncodeMsg( &eIter, (RsslMsg*)&updateMsg ); pRsslBuffer->length = rsslGetEncodedBufferLength( &eIter ); } else if ( domainType = RSSL_DMT_MARKET_BY_ORDER ) { updateMsg.msgBase.containerType = RSSL_DT_MAP; rsslSetEncodeIteratorBuffer( &eIter, &payload ); rsslSetEncodeIteratorRWFVersion( &eIter, RSSL_RWF_MAJOR_VERSION, RSSL_RWF_MINOR_VERSION ); updateMsg.msgBase.encDataBody = payload; rsslClearEncodeIterator( &eIter ); rsslSetEncodeIteratorBuffer( &eIter, &payload ); rsslSetEncodeIteratorRWFVersion( &eIter, RSSL_RWF_MAJOR_VERSION, RSSL_RWF_MINOR_VERSION ); rsslEncodeMsg( &eIter, (RsslMsg*)&updateMsg ); pRsslBuffer->length = rsslGetEncodedBufferLength( &eIter ); } else { } }