Files
wnmj/Servers/服务器组件/服务核心/WHDataQueue.cpp

302 lines
6.2 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "WHDataQueue.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CWHDataQueue::CWHDataQueue()
{
//<2F><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>
m_dwInsertPos=0L;
m_dwTerminalPos=0L;
m_dwDataQueryPos=0L;
//<2F><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
m_dwDataSize=0L;
m_dwDataPacketCount=0L;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_dwBufferSize=0L;
m_pDataQueueBuffer=NULL;
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CWHDataQueue::~CWHDataQueue()
{
SafeDeleteArray(m_pDataQueueBuffer);
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
VOID CWHDataQueue::GetBurthenInfo(tagBurthenInfo & BurthenInfo)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
BurthenInfo.dwDataSize=m_dwDataSize;
BurthenInfo.dwBufferSize=m_dwBufferSize;
BurthenInfo.dwDataPacketCount=m_dwDataPacketCount;
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CWHDataQueue::InsertData(WORD wIdentifier, VOID * pBuffer, WORD wDataSize)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagDataHead DataHead;
ZeroMemory(&DataHead,sizeof(DataHead));
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
DataHead.wDataSize=wDataSize;
DataHead.wIdentifier=wIdentifier;
//<2F><><EFBFBD><EFBFBD><EFBFBD>
if (RectifyBuffer(sizeof(DataHead)+DataHead.wDataSize)==false)
{
ASSERT(FALSE);
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
try
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CopyMemory(m_pDataQueueBuffer+m_dwInsertPos,&DataHead,sizeof(DataHead));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (wDataSize>0)
{
ASSERT(pBuffer!=NULL);
CopyMemory(m_pDataQueueBuffer+m_dwInsertPos+sizeof(DataHead),pBuffer,wDataSize);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_dwDataPacketCount++;
m_dwDataSize+=sizeof(DataHead)+wDataSize;
m_dwInsertPos+=sizeof(DataHead)+wDataSize;
m_dwTerminalPos=__max(m_dwTerminalPos,m_dwInsertPos);
return true;
}
catch (...)
{
ASSERT(FALSE);
return false;
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CWHDataQueue::InsertData(WORD wIdentifier, tagDataBuffer DataBuffer[], WORD wDataCount)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagDataHead DataHead;
ZeroMemory(&DataHead,sizeof(DataHead));
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
DataHead.wDataSize=0;
DataHead.wIdentifier=wIdentifier;
//<2F>ۼƴ<DBBC>С
for (WORD i=0;i<wDataCount;i++)
{
if (DataBuffer[i].wDataSize>0)
{
DataHead.wDataSize+=DataBuffer[i].wDataSize;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>
if (RectifyBuffer(sizeof(DataHead)+DataHead.wDataSize)==false)
{
ASSERT(FALSE);
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
try
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CopyMemory(m_pDataQueueBuffer+m_dwInsertPos,&DataHead,sizeof(DataHead));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (DataHead.wDataSize>0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wExcursion=sizeof(DataHead);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (WORD i=0;i<wDataCount;i++)
{
if (DataBuffer[i].wDataSize>0)
{
//Ч<><D0A7>״̬
ASSERT(DataBuffer[i].pDataBuffer!=NULL);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CopyMemory(m_pDataQueueBuffer+m_dwInsertPos+wExcursion,DataBuffer[i].pDataBuffer,DataBuffer[i].wDataSize);
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
wExcursion+=DataBuffer[i].wDataSize;
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_dwDataPacketCount++;
m_dwDataSize+=sizeof(DataHead)+DataHead.wDataSize;
m_dwInsertPos+=sizeof(DataHead)+DataHead.wDataSize;
m_dwTerminalPos=__max(m_dwTerminalPos,m_dwInsertPos);
return true;
}
catch (...)
{
ASSERT(FALSE);
return false;
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool CWHDataQueue::DistillData(tagDataHead & DataHead, VOID * pBuffer, WORD wBufferSize)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(m_dwDataSize>0L);
ASSERT(m_dwDataPacketCount>0);
ASSERT(m_pDataQueueBuffer!=NULL);
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_dwDataSize==0L) return false;
if (m_dwDataPacketCount==0L) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_dwDataQueryPos==m_dwTerminalPos)
{
m_dwDataQueryPos=0L;
m_dwTerminalPos=m_dwInsertPos;
}
//<2F><>ȡָ<C8A1><D6B8>
ASSERT(m_dwBufferSize>=(m_dwDataQueryPos+sizeof(tagDataHead)));
tagDataHead * pDataHead=(tagDataHead *)(m_pDataQueueBuffer+m_dwDataQueryPos);
ASSERT(wBufferSize>=pDataHead->wDataSize);
//<2F><>ȡ<EFBFBD><C8A1>С
WORD wPacketSize=sizeof(DataHead)+pDataHead->wDataSize;
ASSERT(m_dwBufferSize>=(m_dwDataQueryPos+wPacketSize));
//<2F>жϻ<D0B6><CFBB><EFBFBD>
WORD wCopySize=0;
ASSERT(wBufferSize>=pDataHead->wDataSize);
if (wBufferSize>=pDataHead->wDataSize) wCopySize=pDataHead->wDataSize;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DataHead=*pDataHead;
if (DataHead.wDataSize>0)
{
if (wBufferSize<pDataHead->wDataSize) DataHead.wDataSize=0;
else CopyMemory(pBuffer,pDataHead+1,DataHead.wDataSize);
}
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wPacketSize<=m_dwDataSize);
ASSERT(m_dwBufferSize>=(m_dwDataQueryPos+wPacketSize));
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_dwDataPacketCount--;
m_dwDataSize-=wPacketSize;
m_dwDataQueryPos+=wPacketSize;
return true;
}
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VOID CWHDataQueue::RemoveData(bool bFreeMemroy)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_dwDataSize=0L;
m_dwInsertPos=0L;
m_dwTerminalPos=0L;
m_dwDataQueryPos=0L;
m_dwDataPacketCount=0L;
//ɾ<><C9BE><EFBFBD>ڴ<EFBFBD>
if (bFreeMemroy==true)
{
m_dwBufferSize=0;
SafeDeleteArray(m_pDataQueueBuffer);
}
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>
bool CWHDataQueue::RectifyBuffer(DWORD dwNeedSize)
{
try
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((m_dwDataSize+dwNeedSize)>m_dwBufferSize) throw 0;
//<2F><><EFBFBD>¿<EFBFBD>ʼ
//if ((m_dwInsertPos==m_dwTerminalPos)&&((m_dwInsertPos+dwNeedSize)>m_dwBufferSize))
if ((m_dwInsertPos == m_dwTerminalPos) && ((m_dwInsertPos + dwNeedSize)>=m_dwBufferSize))
{
if (m_dwDataQueryPos>=dwNeedSize) m_dwInsertPos=0;
else throw 0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((m_dwInsertPos<m_dwTerminalPos)&&((m_dwInsertPos+dwNeedSize)>m_dwDataQueryPos)) throw 0;
}
catch (...)
{
try
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
DWORD dwRiseSize=__max(m_dwBufferSize/2L,dwNeedSize*10L);
LPBYTE pNewQueueServiceBuffer=new BYTE [m_dwBufferSize+dwRiseSize];
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
ASSERT(pNewQueueServiceBuffer!=NULL);
if (pNewQueueServiceBuffer==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_pDataQueueBuffer!=NULL)
{
//Ч<><D0A7>״̬
ASSERT(m_dwTerminalPos>=m_dwDataSize);
ASSERT(m_dwTerminalPos>=m_dwDataQueryPos);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwPartOneSize=m_dwTerminalPos-m_dwDataQueryPos;
if (dwPartOneSize>0L) CopyMemory(pNewQueueServiceBuffer,m_pDataQueueBuffer+m_dwDataQueryPos,dwPartOneSize);
if (m_dwDataSize>dwPartOneSize)
{
ASSERT((m_dwInsertPos+dwPartOneSize)==m_dwDataSize);
CopyMemory(pNewQueueServiceBuffer+dwPartOneSize,m_pDataQueueBuffer,m_dwInsertPos);
}
}
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_dwDataQueryPos=0L;
m_dwInsertPos=m_dwDataSize;
m_dwTerminalPos=m_dwDataSize;
m_dwBufferSize=m_dwBufferSize+dwRiseSize;
//<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>
SafeDeleteArray(m_pDataQueueBuffer);
m_pDataQueueBuffer=pNewQueueServiceBuffer;
}
catch (...) { return false; }
}
return true;
}
//////////////////////////////////////////////////////////////////////////////////