www.pudn.com > MirServer.rar > MirMsgQueue.cpp
#include ".\mirmsgqueue.h"
CMirMsgQueue::CMirMsgQueue(void)
{
m_MSGENDFLAG = DEFMSGENDFLAG;
m_MSGSTARTFLAG = DEFMSGSTARTFLAG;
Clean();
}
CMirMsgQueue::~CMirMsgQueue(void)
{
}
VOID CMirMsgQueue::SaveMsg(CHAR* pszMsg, int iSize)
{
int left = 0;
CHAR * pdata = pszMsg;
if( m_MsgQueuePutPtr >= m_MsgQueueGetPtr )
{
left = MSGQUEUEBUFFERLEN - m_MsgQueuePutPtr;
if( iSize > left )
{
if( m_MsgQueueGetPtr + left-1 < iSize )
return;
memcpy( (void*)(m_MsgQueueBuffer + m_MsgQueuePutPtr), (void*)pszMsg, left );
pdata += left;
m_MsgQueuePutPtr = 0;
SaveMsg(pdata, iSize-left );
}
else
{
memcpy( (void*)(m_MsgQueueBuffer + m_MsgQueuePutPtr), (void*)pszMsg, iSize );
m_MsgQueuePutPtr = (m_MsgQueuePutPtr + iSize) % MSGQUEUEBUFFERLEN;
*(m_MsgQueueBuffer + m_MsgQueuePutPtr) = 0;
return;
}
}
else
{
left = m_MsgQueueGetPtr - m_MsgQueuePutPtr;
if( iSize > left )
{
//printf( "剩余空间 %d 无法容纳 %d 大小的数据!\n", left, iSize);
return;
}
memcpy( (void*)(m_MsgQueueBuffer + m_MsgQueuePutPtr), (void*)pszMsg, iSize );
m_MsgQueuePutPtr = (m_MsgQueuePutPtr + iSize) % MSGQUEUEBUFFERLEN;
*(m_MsgQueueBuffer + m_MsgQueuePutPtr) = 0;
return;
}
return VOID();
}
BOOL CMirMsgQueue::GetMsg(CHAR* pszMsg)
{
CHAR * pStart = m_MsgQueueBuffer + m_MsgQueueGetPtr;
CHAR * pEnd = NULL;
if( m_MsgQueuePutPtr == m_MsgQueueGetPtr )
return FALSE;
if( (*pStart) != m_MSGSTARTFLAG )
{
//printf("无法取得消息,消息头错位");
}
pEnd = strchr(pStart, m_MSGENDFLAG);
if( pEnd == NULL && (m_MsgQueuePutPtr < m_MsgQueueGetPtr) )
{
pEnd = strchr( m_MsgQueueBuffer, m_MSGENDFLAG);
}
if( pEnd != NULL )
{
*pEnd = 0;
if( pEnd < pStart)
{
memcpy( (void*)pszMsg, (void*)( pStart + 1), MSGQUEUEBUFFERLEN - m_MsgQueueGetPtr -1);
memcpy( (void*)(pszMsg+(MSGQUEUEBUFFERLEN-m_MsgQueueGetPtr-1)), (void*)m_MsgQueueBuffer, pEnd - m_MsgQueueBuffer );
// printf( m_MsgQueueBuffer );
// printf( "\n");
}
else
{
memcpy( (void*)pszMsg, (void*)(pStart+1), pEnd - pStart );
}
m_MsgQueueGetPtr = ((pEnd + 1) - m_MsgQueueBuffer) % MSGQUEUEBUFFERLEN;
//printf(pszMsg);
return TRUE;
}
return FALSE;
}
VOID CMirMsgQueue::Clean(void)
{
m_MsgQueueGetPtr = 0;
m_MsgQueuePutPtr = 0;
m_MsgQueueBuffer[MSGQUEUEBUFFERLEN] = '\0';
return VOID();
}
VOID CMirMsgQueue::SetMsgFlag(char cStartFlag, char cEndFlag)
{
m_MSGSTARTFLAG = cStartFlag;
m_MSGENDFLAG = cEndFlag;
return VOID();
}