请教,请大家指点下面的这个函数的作用是什么?? 怎么改写可以更好?
bool CExchangeManager::ProcessMessage (const char* pStrMsg, const int& nBuflen)
{
bool bOK(false);
short nMsgLength = 0;
int bufferRead = 0;
if (m_bPartMessage)
{
int nToCopy = 0;
int nBuffRemainingSize = MAX_EXCH_MSG_SIZE - m_nSizeOfPartMessage;
nToCopy = (nBuflen < nBuffRemainingSize ? nBuflen : nBuffRemainingSize);
if (((nToCopy + m_nSizeOfPartMessage) > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg)-1, "Part+Remainder > buffer size (Pt: %d, Rm: %d)", m_nSizeOfPartMessage, nToCopy);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(&m_cMessageBuffer[m_nSizeOfPartMessage], pStrMsg, nToCopy);
if (m_nSizeOfPartMessage+nBuflen > S_MSG_HEADER_SIZE)
{
nMsgLength = ntohs(*((short*)&m_cMessageBuffer[1])) + 3;
if (nMsgLength > nBuflen + m_nSizeOfPartMessage)
{
m_nSizeOfPartMessage += nBuflen;
m_bPartMessage=true;
return true;
}
else
{
m_bPartMessage = false;
char TempBuffer[MAX_EXCH_MSG_SIZE];
memset(TempBuffer, 0, sizeof(TempBuffer));
if ((nMsgLength > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "nMsgLength > buffer size (nMsgLength: %d)", nMsgLength);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(TempBuffer, m_cMessageBuffer, nMsgLength);
++m_nMsgIndex;
if (m_bGenerateBinaryMsgFile)
{
CString strMsgIndex;
strMsgIndex.Format("FULL_MSG");//%d: ", m_nMsgIndex);
_writeMsgToBinaryFile(TempBuffer, nMsgLength, strMsgIndex);
}
bOK = _procMsg(TempBuffer[0], nMsgLength, TempBuffer);
pStrMsg = pStrMsg + (nMsgLength - m_nSizeOfPartMessage);
bufferRead = nMsgLength - m_nSizeOfPartMessage;
m_nSizeOfPartMessage= 0;
}
}
else
{
m_nSizeOfPartMessage += nBuflen;
m_bPartMessage = true;
return true;
}
}
while (bufferRead < nBuflen)
{
if (nBuflen-bufferRead < S_MSG_HEADER_SIZE)
{
m_nSizeOfPartMessage = nBuflen - bufferRead;
if ((m_nSizeOfPartMessage > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg)-1, "part message size > buffer size (SizeOfPrtMsg: %d)", m_nSizeOfPartMessage);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(m_cMessageBuffer, pStrMsg, m_nSizeOfPartMessage);
m_bPartMessage = true;
bufferRead += m_nSizeOfPartMessage;
break;
}
else
nMsgLength = ntohs(*((short*)&pStrMsg[1])) + 3;
if ((nBuflen-bufferRead < nMsgLength) && (nBuflen-bufferRead > 0))
{
m_nSizeOfPartMessage = nBuflen-bufferRead;
if (m_nSizeOfPartMessage > 0)
{
if ((m_nSizeOfPartMessage > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "Part message> buffer size (SizeOfPrMsg: %d)", m_nSizeOfPartMessage);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(m_cMessageBuffer, pStrMsg,m_nSizeOfPartMessage);
m_bPartMessage=true;
}
else
m_bPartMessage = false;
bufferRead += m_nSizeOfPartMessage;
bOK = true;
}
else
{
memcpy(m_cMessageBuffer, pStrMsg,nMsgLength);
pStrMsg += nMsgLength;
bufferRead += nMsgLength;
++m_nMsgIndex;
if (m_bGenerateBinaryMsgFile)
{
CString strMsgIndex;
strMsgIndex.Format("FULL_MSG"); //%d:", m_nMsgIndex);
_writeMsgToBinaryFile(m_cMessageBuffer, nMsgLength, strMsgIndex);
}
if ((nMsgLength > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "Size of full message is greater than buffer size (nMsgLength: %d)", nMsgLength);
mDiagnostics.PrintInformational(InfoMsg);
}
bOK = _procMsg(m_cMessageBuffer[0], nMsgLength, m_cMessageBuffer);
}
}
if (theApp.ExchangeThreadActive() && m_bUseExchangeQueue)
CExchangeThread::pExchangeThread->SetExchMsgQReadyForRead();
return bOK;
}