BasePacket* SFCGSFPacketProtocol::GetPacket(int& errorCode) { SFPacket* pPacket = SFPacketPool::GetInstance()->Alloc(); pPacket->Initialize(); if (FALSE == m_pPacketIOBuffer->GetPacket(*pPacket->GetHeader(), (char*)pPacket->GetData(), m_packetSize, errorCode)) { SFPacketPool::GetInstance()->Release(pPacket); return nullptr; } if (FALSE == pPacket->Decode(m_packetSize, errorCode)) { SFPacketPool::GetInstance()->Release(pPacket); return nullptr; } return pPacket; }
BasePacket* SFDefaultPacketProtocol::GetPacket(int& ErrorCode) { SFPacket* pPacket = PacketPoolSingleton::instance()->Alloc(); pPacket->Initialize(); if(FALSE == m_pPacketIOBuffer->GetPacket(pPacket, ErrorCode)) { PacketPoolSingleton::instance()->Release(pPacket); return NULL; } SFPacketHeader* pHeader = pPacket->GetHeader(); if(TRUE == pHeader->CheckDataCRC()) { DWORD dwDataCRC = 0; BOOL Result = SFPacket::GetDataCRC((BYTE*)pPacket->GetDataBuffer(), pHeader->PacketLen - sizeof(SFPacketHeader), dwDataCRC); if(TRUE != Result || pHeader->DataCRC != dwDataCRC) { //SFLOG_WARN(L"Packet CRC Check Fail!! %d %d", pHeader->DataCRC, dwDataCRC); ErrorCode = PACKETIO_ERROR_DATA_CRC; PacketPoolSingleton::instance()->Release(pPacket); return NULL; } } if (TRUE == pHeader->CheckEncryption()) { if(FALSE == SFEncrytion<SFEncryptionXOR>::Decrypt((BYTE*)pPacket->GetDataBuffer(), pHeader->PacketLen - sizeof(SFPacketHeader))) { SFASSERT(0); PacketPoolSingleton::instance()->Release(pPacket); ErrorCode = PACKETIO_ERROR_DATA_ENCRYPTION; return FALSE; } } if(TRUE == pHeader->CheckCompressed()) { BYTE pSrcBuf[MAX_PACKET_DATA] = {0,}; int DestSize = MAX_PACKET_DATA; memcpy(pSrcBuf, pPacket->GetDataBuffer(), pPacket->GetDataSize()); pPacket->ResetDataBuffer(); if(FALSE == SFCompressor<SFCompressLzf>::GetCompressor()->Uncompress(pPacket->GetDataBuffer(), DestSize, pSrcBuf, pPacket->GetDataSize())) { //SFLOG_WARN(L"Packet Uncompress Fail!! %d %d", pHeader->DataCRC, dwDataCRC); PacketPoolSingleton::instance()->Release(pPacket); ErrorCode = PACKETIO_ERROR_DATA_COMPRESS; return FALSE; } pHeader->PacketLen = DestSize + sizeof(SFPacketHeader); } return pPacket; }