?? smsprs.cpp
字號:
pbWalk++;
}
break;
default:
break;
}
rcbParsed = 7;
return TRUE;
}
//
// Decode the Validity Period for a message
// see GSM 03.40 section 9.2.3.12
//
static BOOL ParseMsgValidityPeriod(const BYTE* const pbIn, const DWORD dwVPFormat, SYSTEMTIME& rstVP, UINT& rcbParsed)
{
FUNCTION_TRACE(ParseMsgValidityPeriod);
DEBUGCHK(NULL != pbIn);
BOOL fRet = FALSE;
rcbParsed = 0;
switch (dwVPFormat)
{
case RIL_MSGVP_NONE:
// Do nothing
rcbParsed = 0;
break;
case RIL_MSGVP_RELATIVE:
fRet = ParseRelativeValidityPeriod(pbIn, rstVP, rcbParsed);
goto Error;
case RIL_MSGVP_ENHANCED:
fRet = ParseEnhancedValidityPeriod(pbIn, rstVP, rcbParsed);
goto Error;
case RIL_MSGVP_ABSOLUTE:
// An absolute VP is the same as a normal TimeStamp, so call the appropriate function
fRet = ParseMsgTimeStamp(pbIn, rstVP, rcbParsed);
goto Error;
default:
goto Error;
}
fRet = TRUE;
Error:
return fRet;
}
//
// Helper function to parse a Deliver SMS message
//
static BOOL ParseDeliverMsg(const BYTE* const pbIn, const UINT cbIn, RILMESSAGE& rrmMsg)
{
FUNCTION_TRACE(ParseDeliverMsg);
DEBUGCHK(NULL != pbIn);
DEBUGCHK(0 < cbIn);
UINT cbParsed;
const BYTE* pbWalk;
const BYTE* pbEnd;
BOOL fRet = FALSE;
pbWalk = pbIn;
pbEnd = pbIn + cbIn;
// Set Type. See GSM 03.40 section 9.2.3.1
rrmMsg.dwType = RIL_MSGTYPE_IN_DELIVER;
rrmMsg.dwParams |= RIL_PARAM_M_TYPE;
// Set dwFlags
rrmMsg.dwFlags = RIL_MSGFLAG_NONE;
rrmMsg.dwParams |= RIL_PARAM_M_FLAGS;
// GSM 03.40 section 9.2.3.2
if (!(*pbWalk & 0x04)) {
rrmMsg.dwFlags |= RIL_MSGFLAG_MORETOSEND;
}
// GSM 03.40 section 9.2.3.4
if (*pbWalk & 0x20) {
rrmMsg.dwFlags |= RIL_MSGFLAG_STATUSREPORTRETURNED;
}
// GSM 03.40 section 9.2.3.23
if (*pbWalk & 0x40) {
rrmMsg.dwFlags |= RIL_MSGFLAG_HEADER;
}
// GSM 03.40 section 9.2.3.17
if (*pbWalk & 0x80) {
rrmMsg.dwFlags |= RIL_MSGFLAG_REPLYPATH;
}
pbWalk++;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse address
if (!ParseMsgAddress(pbWalk, FALSE, rrmMsg.msgInDeliver.raOrigAddress, cbParsed, TRUE)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_ORIGADDRESS;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse protocol ID
if (!ParseMsgProtocolID(pbWalk, rrmMsg.msgInDeliver.dwProtocolID, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_PROTOCOLID;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse DCS
if (!ParseMsgDCS(pbWalk, rrmMsg.msgInDeliver.rmdDataCoding, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_DATACODING;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse time stamp
if (!ParseMsgTimeStamp(pbWalk, rrmMsg.msgInDeliver.stSCReceiveTime, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_SCRECEIVETIME;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse message header and body
if(!ParseMsgHeaderAndBody(pbWalk, pbEnd, rrmMsg.dwFlags, rrmMsg.msgInDeliver.rmdDataCoding, rrmMsg.dwParams,
rrmMsg.msgInDeliver.rgbHdr, sizeof(rrmMsg.msgInDeliver.rgbHdr),
rrmMsg.msgInDeliver.rgbMsg, sizeof(rrmMsg.msgInDeliver.rgbMsg),
rrmMsg.msgInDeliver.cbHdrLength, rrmMsg.msgInDeliver.cchMsgLength, cbParsed)) {
goto Error;
}
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
fRet = TRUE;
Error:
return fRet;
}
//
// Helper function to parse a Status Report SMS message
//
static BOOL ParseStatusMsg(const BYTE* const pbIn, const UINT cbIn, RILMESSAGE& rrmMsg)
{
FUNCTION_TRACE(ParseStatusMsg);
DEBUGCHK(NULL != pbIn);
DEBUGCHK(0 < cbIn);
UINT cbParsed;
BYTE bParamInd;
const BYTE* pbWalk;
const BYTE* pbEnd;
BOOL fRet = FALSE;
pbWalk = pbIn;
pbEnd = pbIn + cbIn;
// Set message Type. see GSM 03.40 section 9.2.3.1
rrmMsg.dwType = RIL_MSGTYPE_IN_STATUS;
rrmMsg.dwParams |= RIL_PARAM_M_TYPE;
// Set flags
rrmMsg.dwParams |= RIL_PARAM_M_FLAGS;
rrmMsg.dwFlags = RIL_MSGFLAG_NONE;
if (!(*pbWalk & 0x04)) {
// GSM 03.40 section 9.2.3.2
rrmMsg.dwFlags |= RIL_MSGFLAG_MORETOSEND;
}
if (*pbWalk & 0x20) {
// GSM 03.40 section 9.2.3.26, TP-Status-Report-Qualifier
rrmMsg.dwFlags |= RIL_MSGFLAG_CAUSEDBYCOMMAND;
}
if (*pbWalk & 0x40) {
// GSM 03.40 section 9.2.3.23
rrmMsg.dwFlags |= RIL_MSGFLAG_HEADER;
}
pbWalk++;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse message reference
rrmMsg.msgInStatus.dwTgtMsgReference = *pbWalk++;
rrmMsg.dwParams |= RIL_PARAM_M_TGTMSGREFERENCE;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse address
if (!ParseMsgAddress(pbWalk, FALSE, rrmMsg.msgInStatus.raTgtRecipAddress, cbParsed, TRUE)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_TGTRECIPADDRESS;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse receive time
if (!ParseMsgTimeStamp(pbWalk, rrmMsg.msgInStatus.stTgtSCReceiveTime, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_TGTSCRECEIVETIME;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse discharge time
if (!ParseMsgTimeStamp(pbWalk, rrmMsg.msgInStatus.stTgtDischargeTime, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_TGTDISCHARGETIME;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse message status value
if (!ParseMsgStatus(pbWalk, rrmMsg.msgInStatus.dwTgtDlvStatus, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_TGTDLVSTATUS;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Check Parameter indicator, GSM 03.40 section 9.2.3.27
if (pbWalk < pbEnd) {
bParamInd = *pbWalk++;
if (pbWalk > pbEnd) {
goto Error;
}
// Check for ProtocolID
if (bParamInd & 0x01) {
if (!ParseMsgProtocolID(pbWalk, rrmMsg.msgInStatus.dwProtocolID, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_PROTOCOLID;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
}
// Check for DCS
if (bParamInd & 0x02) {
if (!ParseMsgDCS(pbWalk, rrmMsg.msgInStatus.rmdDataCoding, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_DATACODING;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
}
// Check for UDL
if (bParamInd & 0x04) {
// Parse message header and body
if(!ParseMsgHeaderAndBody(pbWalk, pbEnd, rrmMsg.dwFlags, rrmMsg.msgInStatus.rmdDataCoding, rrmMsg.dwParams,
rrmMsg.msgInStatus.rgbHdr, sizeof(rrmMsg.msgInStatus.rgbHdr),
rrmMsg.msgInStatus.rgbMsg, sizeof(rrmMsg.msgInStatus.rgbMsg),
rrmMsg.msgInStatus.cbHdrLength, rrmMsg.msgInStatus.cchMsgLength, cbParsed)) {
goto Error;
}
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
}
}
fRet = TRUE;
Error:
return fRet;
}
//
// Parse a Submit message
//
static BOOL ParseSubmitMsg(const BYTE* const pbIn, const UINT cbIn, RILMESSAGE& rrmMsg)
{
FUNCTION_TRACE(ParseSubmitMsg);
DEBUGCHK(NULL != pbIn);
DEBUGCHK(0 < cbIn);
UINT cbParsed;
const BYTE* pbWalk;
const BYTE* pbEnd;
BOOL fRet = FALSE;
pbWalk = pbIn;
pbEnd = pbIn + cbIn;
// Set Type. see GSM 03.40 section 9.2.3.1
rrmMsg.dwParams |= RIL_PARAM_M_TYPE;
rrmMsg.dwType = RIL_MSGTYPE_OUT_SUBMIT;
// Set dwFlags
rrmMsg.dwParams |= RIL_PARAM_M_FLAGS;
rrmMsg.dwFlags = RIL_MSGFLAG_NONE;
if (*pbWalk & 0x04) {
// GSM 03.40 section 9.2.3.25
rrmMsg.dwFlags |= RIL_MSGFLAG_REJECTDUPS;
}
if (*pbWalk & 0x20) {
// GSM 03.40 section 9.2.3.5
rrmMsg.dwFlags |= RIL_MSGFLAG_STATUSREPORTREQUESTED;
}
if (*pbWalk & 0x40) {
// GSM 03.40 section 9.2.3.23
rrmMsg.dwFlags |= RIL_MSGFLAG_HEADER;
}
if (*pbWalk & 0x80) {
// GSM 03.40 sectoin 9.2.3.17
rrmMsg.dwFlags |= RIL_MSGFLAG_REPLYPATH;
}
// Parse Validity Period Format. see GSM 03.40 section 9.2.3.3
switch((*pbWalk & 0x18) >> 3)
{
case 0x00:
rrmMsg.msgOutSubmit.dwVPFormat = RIL_MSGVP_NONE;
break;
case 0x01:
rrmMsg.msgOutSubmit.dwVPFormat = RIL_MSGVP_ENHANCED;
break;
case 0x02:
rrmMsg.msgOutSubmit.dwVPFormat = RIL_MSGVP_RELATIVE;
break;
case 0x03:
rrmMsg.msgOutSubmit.dwVPFormat = RIL_MSGVP_ABSOLUTE;
break;
default:
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_VPFORMAT;
pbWalk++;
if (pbWalk > pbEnd) {
goto Error;
}
// Skip the message reference
pbWalk++;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse address
if (!ParseMsgAddress(pbWalk, FALSE, rrmMsg.msgOutSubmit.raDestAddress, cbParsed, TRUE)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_DESTADDRESS;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse protocol ID
if (!ParseMsgProtocolID(pbWalk, rrmMsg.msgOutSubmit.dwProtocolID, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_PROTOCOLID;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse DCS
if (!ParseMsgDCS(pbWalk, rrmMsg.msgOutSubmit.rmdDataCoding, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_DATACODING;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse validity period
if (!ParseMsgValidityPeriod(pbWalk, rrmMsg.msgOutSubmit.dwVPFormat, rrmMsg.msgOutSubmit.stVP, cbParsed)) {
goto Error;
}
rrmMsg.dwParams |= RIL_PARAM_M_VP;
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
// Parse message header and body
if(!ParseMsgHeaderAndBody(pbWalk, pbEnd, rrmMsg.dwFlags, rrmMsg.msgOutSubmit.rmdDataCoding, rrmMsg.dwParams,
rrmMsg.msgOutSubmit.rgbHdr, sizeof(rrmMsg.msgOutSubmit.rgbHdr),
rrmMsg.msgOutSubmit.rgbMsg, sizeof(rrmMsg.msgOutSubmit.rgbMsg),
rrmMsg.msgOutSubmit.cbHdrLength, rrmMsg.msgOutSubmit.cchMsgLength, cbParsed)) {
goto Error;
}
pbWalk += cbParsed;
if (pbWalk > pbEnd) {
goto Error;
}
fRet = TRUE;
Error:
return fRet;
}
//
// Parse an SMS-COMMAND message
//
static BOOL ParseCommandMsg(const BYTE* const pbIn, const UINT cbIn, RILMESSAGE& rrmMsg)
{
FUNCTION_TRACE(ParseCommandMsg);
DEBUGCHK(NULL != pbIn);
DEBUGCHK(0 < cbIn);
UINT cbParsed;
const BYTE* pbWalk;
const BYTE* pbEnd;
BOOL fRet = FALSE;
pbWalk = pbIn;
pbEnd = pbIn + cbIn;
// Set Type. see GSM 03.40 section 9.2.3.1
rrmMsg.dwParams |= RIL_PARAM_M_TYPE;
rrmMsg.dwType = RIL_MSGTYPE_OUT_COMMAND;
// Set dwFlags
rrmMsg.dwParams |= RIL_PARAM_M_FLAGS;
rrmMsg.dwFlags = RIL_MSGFLAG_NONE;
if (*pbWalk & 0x20) {
// GSM 03.40 section 9.2.3.5
rrmMsg.dwFlags |= RIL_MSGFLAG_STATUSREPORTREQUESTED;
}
if (*pbWalk & 0x40) {
// GSM 03.40 section 9.2.3.23
rrmMsg.dwFlags |= RIL_MSGFLAG_HEADER;
}
// Skip the message reference
pbWalk++;
if (pbWalk > pbEnd) {
goto Error;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -