Example #1
0
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
	{
	}
}