Esempio n. 1
0
int SFProtobufProtocol::tryDeframeIncomingPacket(DataBuffer& Buffer, BasePacket*& pPacket, int& packetId, unsigned int& nExtractedBytes)
{
	if(Buffer.GetDataSize() < 8)
		return SFProtocol::eIncompletePacket;


    char* pBuffer = Buffer.GetBuffer();

    unsigned int sStart = 0;
    unsigned int packetLen = 0;
	packetId = 0;
    unsigned int sEnd = 0;

    for (int i=0; i<2; i++)
    {
        *((BYTE*)(&sStart)+i)=pBuffer[i];
        *((BYTE*)(&packetLen)+i)=pBuffer[i+2];
		*((BYTE*)(&packetId) + i) = pBuffer[i + 4];
    }

    if (sStart!=SignatureStart)
        return SFProtocol::eCorruptPacket;

    if (packetLen > Buffer.GetDataSize())
        return SFProtocol::eIncompletePacket;

    for (int i=0; i<2; i++)
        *((BYTE*)(&sEnd)+i)=pBuffer[packetLen-2+i];

    if(sEnd!=SignatureEnd)
        return SFProtocol::eCorruptPacket;

    char* pData = pBuffer + 6;
    unsigned int dataSize = packetLen - 8;

    nExtractedBytes = packetLen;

	pPacket = CreateIncomingPacketFromPacketId(packetId);

	if(pPacket==NULL)
		return SFProtocol::eUndefinedFailure;

	if(!pPacket->Decode(pData, dataSize))
	{
		disposeIncomingPacket(pPacket);
		return SFProtocol::eDecodingFailure;
	}

	return SFProtocol::Success;
}
Esempio n. 2
0
BasePacket* SFAvroProtocol::GetPacket(int& errorCode)
{
	errorCode = PACKETIO_ERROR_NONE;

	SFPacketHeader header;

	if (false == m_pPacketIOBuffer->GetHeader(header, errorCode))
		return NULL;

	BasePacket* pPacket = CreateIncomingPacketFromPacketId(header.packetID);

	if (pPacket == NULL)
		return NULL;

	SFAvroPacketImpl* pAvroPacket = (SFAvroPacketImpl*)pPacket;

	memcpy(pAvroPacket->GetHeader(), &header, sizeof(SFPacketHeader));

	char dataBuffer[8096] = { 0, };

	if (false == m_pPacketIOBuffer->GetPacket(header, dataBuffer, m_packetSize, errorCode))
	{
		DisposePacket(pPacket);
		return NULL;
	}

	if (false == pPacket->Decode(dataBuffer, header.dataSize))
	{
		errorCode = PACKETIO_ERROR_DATA;
		DisposePacket(pPacket);
		return NULL;
	}

	pPacket->SetPacketID(header.packetID);

	return pPacket;
}