⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmsgframeparser.cpp

📁 手机发送短信的Activex控件
💻 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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -