RsslRet encodeItemRefresh(RsslChannel* chnl, ItemInfo* itemInfo, RsslBuffer* msgBuf, RsslPostUserInfo *pPostUserInfo, RsslUInt encodeStartTime) { RsslRet ret; RsslRefreshMsg refreshMsg; RsslEncodeIterator encodeIter; rsslClearEncodeIterator(&encodeIter); rsslSetEncodeIteratorRWFVersion(&encodeIter, chnl->majorVersion, chnl->minorVersion); if ((ret = rsslSetEncodeIteratorBuffer(&encodeIter, msgBuf)) != RSSL_RET_SUCCESS) return ret; rsslClearRefreshMsg(&refreshMsg); refreshMsg.flags = RSSL_RFMF_HAS_MSG_KEY | RSSL_RFMF_REFRESH_COMPLETE | RSSL_RFMF_HAS_QOS | RSSL_RFMF_CLEAR_CACHE; if (itemInfo->itemFlags & ITEM_IS_SOLICITED) refreshMsg.flags |= RSSL_RFMF_SOLICITED; if (itemInfo->itemFlags & ITEM_IS_PRIVATE) refreshMsg.flags |= RSSL_RFMF_PRIVATE_STREAM; refreshMsg.msgBase.msgKey = *itemInfo->attributes.pMsgKey; refreshMsg.msgBase.streamId = itemInfo->StreamId; /* Images for snapshot requests should use the non-streaming state. */ refreshMsg.state.streamState = (itemInfo->itemFlags & ITEM_IS_STREAMING_REQ) ? RSSL_STREAM_OPEN : RSSL_STREAM_NON_STREAMING; refreshMsg.state.dataState = RSSL_DATA_OK; refreshMsg.state.code = RSSL_SC_NONE; refreshMsg.qos.dynamic = RSSL_FALSE; refreshMsg.qos.rate = RSSL_QOS_RATE_TICK_BY_TICK; refreshMsg.qos.timeliness = RSSL_QOS_TIME_REALTIME; refreshMsg.msgBase.domainType = itemInfo->attributes.domainType; if (pPostUserInfo) { refreshMsg.flags |= RSSL_RFMF_HAS_POST_USER_INFO; refreshMsg.postUserInfo = *pPostUserInfo; } switch(itemInfo->attributes.domainType) { case RSSL_DMT_MARKET_PRICE: refreshMsg.msgBase.containerType = RSSL_DT_FIELD_LIST; if ((ret = rsslEncodeMsgInit(&encodeIter, (RsslMsg*)&refreshMsg, 0)) < RSSL_RET_SUCCESS) return ret; if ((ret = encodeMarketPriceDataBody(&encodeIter, &xmlMarketPriceMsgs.refreshMsg, RSSL_MC_REFRESH, encodeStartTime)) < RSSL_RET_SUCCESS) return ret; break; case RSSL_DMT_MARKET_BY_ORDER: refreshMsg.msgBase.containerType = RSSL_DT_MAP; if ((ret = rsslEncodeMsgInit(&encodeIter, (RsslMsg*)&refreshMsg, 0)) < RSSL_RET_SUCCESS) return ret; if ((ret = encodeMarketByOrderDataBody(&encodeIter, &xmlMarketByOrderMsgs.refreshMsg, RSSL_MC_REFRESH, 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; }
void encodeRefreshMsg( RsslUInt8 domainType, RsslInt32 streamId, RsslBuffer* pRsslBuffer ) { RsslEncodeIterator eIter; RsslRefreshMsg refreshMsg; 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 ); rsslClearRefreshMsg( &refreshMsg ); rsslClearFieldList( &fList ); rsslClearFieldEntry( &fEntry ); refreshMsg.flags |= RSSL_RFMF_CLEAR_CACHE | RSSL_RFMF_HAS_MSG_KEY | RSSL_RFMF_REFRESH_COMPLETE; refreshMsg.state.code = RSSL_SC_NONE; refreshMsg.state.dataState = RSSL_DATA_OK; refreshMsg.state.streamState = RSSL_STREAM_OPEN; refreshMsg.state.text.data = (char*)"RefreshComplete"; refreshMsg.state.text.length = 15; refreshMsg.msgBase.domainType = domainType; refreshMsg.msgBase.streamId = streamId; refreshMsg.msgBase.msgKey.flags |= RSSL_MKF_HAS_NAME | RSSL_MKF_HAS_SERVICE_ID; refreshMsg.msgBase.msgKey.name.data = (char*)"item"; refreshMsg.msgBase.msgKey.name.length = 4; refreshMsg.msgBase.msgKey.serviceId = 1; if ( domainType = RSSL_DMT_MARKET_PRICE ) { refreshMsg.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 ); refreshMsg.msgBase.encDataBody = payload; rsslClearEncodeIterator( &eIter ); rsslSetEncodeIteratorBuffer( &eIter, pRsslBuffer ); rsslSetEncodeIteratorRWFVersion( &eIter, RSSL_RWF_MAJOR_VERSION, RSSL_RWF_MINOR_VERSION ); rsslEncodeMsg( &eIter, (RsslMsg*)&refreshMsg ); pRsslBuffer->length = rsslGetEncodedBufferLength( &eIter ); } else if ( domainType = RSSL_DMT_MARKET_BY_ORDER ) { refreshMsg.msgBase.containerType = RSSL_DT_MAP; rsslSetEncodeIteratorBuffer( &eIter, &payload ); rsslSetEncodeIteratorRWFVersion( &eIter, RSSL_RWF_MAJOR_VERSION, RSSL_RWF_MINOR_VERSION ); } else { } }