?? 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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -