www.pudn.com > SendMsgOCX.rar > WMsgFrameParser.cpp


// WMsgFrameParser.cpp: implementation of the CWMsgFrameParser class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
//tts #include "WSMModule.h" 
#include "WMsgFrameParser.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
  
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CWMsgFrameParser::CWMsgFrameParser() 
{ 
	Reset(); 
} 
 
CWMsgFrameParser::~CWMsgFrameParser() 
{ 
 
} 
 
//+CMT: "+8613337891193",,"04/04/14,17:51:52+00",145,36,0,0,"+8613800250540",145,9 
// admingrub 
BOOL CWMsgFrameParser::IsValidSMSFollowing(BYTE toCheck) 
{ 
	CString str(",\"/:+ \r\n"); 
	return isdigit(toCheck) || str.Find(toCheck) >= 0; 
} 
 
enum ParseResult CWMsgFrameParser::ParseOneByte(BYTE byData) 
{ 
	enum ParseResult parseResult = FrameNotFinished;		// default 
	switch(m_state) 
	{ 
	default: 
		ASSERT(FALSE); 
	case MSG_FRAME_END: 
	case MSG_SMS_LEADING_BEGIN: 
	case MSG_SMS_LEADING: 
		m_state = ParseSMSLeading(byData); 
		if(m_state == MSG_FRAME_END) parseResult = FrameSegmentDiscarded; 
		break; 
 
	case MSG_SMS_LEADING_END: 
		if(m_frame.SetPhoneNumberBegin(byData)) m_state = MSG_PHONE_NUMBER_BEGIN; 
		else parseResult = FrameSegmentDiscarded; 
		break; 
 
	case MSG_PHONE_NUMBER_BEGIN : 
		if(m_frame.SetPhoneNumberDigit(byData)) m_state = MSG_PHONE_NUMBER; 
		else parseResult = FrameSegmentDiscarded; 
		break; 
	 
	case MSG_PHONE_NUMBER : 
		if(m_frame.SetPhoneNumberDigit(byData)) m_state = MSG_PHONE_NUMBER;		// not changed 
		else if(m_frame.SetPhoneNumberEnd(byData)) m_state = MSG_PHONE_NUMBER_END; 
		else parseResult = FrameSegmentDiscarded; 
		break; 
 
	case MSG_PHONE_NUMBER_END: 
		if (m_frame.SetFrameBegin(byData)) m_state = MSG_FRAME_BEGIN; 
		else if (!IsValidSMSFollowing(byData) ) parseResult = FrameSegmentDiscarded; 
		// else  discard other short message information and wait for FrameBegin 
		break;	 
	 
	case MSG_FRAME_BEGIN: 
		if(m_frame.SetFrameNo(byData)) m_state = MSG_FRAME_NO; 
		else 	parseResult = FrameSegmentDiscarded; 
		break; 
 
	case	MSG_FRAME_NO: 
		if(m_frame.SetPacketNo(byData)) m_state = MSG_PACKET_NO; 
		else if(m_frame.SetLastPacketFlag(byData)) m_state = MSG_LAST_PACKET_FLAG; 
		else parseResult = FrameSegmentDiscarded; 
		break; 
 
	case	MSG_PACKET_NO: 
		if(m_frame.SetMessageType(byData)) m_state = MSG_CONTENT_TYPE; 
		else parseResult = FrameSegmentDiscarded; 
		break; 
 
	case	MSG_LAST_PACKET_FLAG: 
		if(m_frame.SetPacketNo(byData)) m_state = MSG_PACKET_NO; 
		else parseResult = FrameSegmentDiscarded; 
		break; 
 
	case	MSG_CONTENT_TYPE: 
	case	MSG_CONTENT_OR_CHECKSUM: 
		if(m_frame.AppendMsgTextOrCheckSum(byData)) m_state = MSG_CONTENT_OR_CHECKSUM; 
		else if(m_frame.SetFrameEnd(byData)) parseResult = m_frame.CheckCheckSum() ? FrameOK : FrameCheckSumError;		// caller will reset 
		else parseResult = FrameSegmentDiscarded;  
		break; 
 
	} 
	 
	if(parseResult == FrameSegmentDiscarded || parseResult == FrameCheckSumError) 
		Reset(); 
 
	return parseResult; 
} 
 
void CWMsgFrameParser::Reset() 
{ 
	m_frame.Reset(); 
	m_state = MSG_FRAME_END; 
	 
	m_smsLeadingBytesReceived = 0; 
 
} 
 
const CWMsgPacket& CWMsgFrameParser::GetParseResult() const 
{ 
	return m_frame; 
} 
 
enum CWMsgFrameParser::ParseState CWMsgFrameParser::ParseSMSLeading(BYTE toParse) 
{ 
	const static char szLeading[] = "+CMT: "; 
	ASSERT(m_smsLeadingBytesReceived < (int)strlen(szLeading)); 
	 
	BOOL bMatch =  toParse == szLeading[m_smsLeadingBytesReceived]; 
	if(!bMatch)  return MSG_FRAME_END; 
 
	enum CWMsgFrameParser::ParseState toRet; 
	if  (m_smsLeadingBytesReceived == 0) 
		toRet = MSG_SMS_LEADING_BEGIN; 
	else if(m_smsLeadingBytesReceived == (int)strlen(szLeading) -1 ) 
		toRet = MSG_SMS_LEADING_END; 
	else  
		toRet = MSG_SMS_LEADING; 
 
	m_smsLeadingBytesReceived ++;		// for next 
 
	return toRet; 
}