예제 #1
0
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;
}
예제 #2
0
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
	{
	}
}