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(); 
}