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

📄 smsprs.cpp

📁 windows mobile RIL软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//
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, 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, 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, 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;
    }

    // Parse protocol ID
    if (!ParseMsgProtocolID(pbWalk, rrmMsg.msgOutCommand.dwProtocolID, cbParsed)) {
        goto Error;
    }
    rrmMsg.dwParams |= RIL_PARAM_M_PROTOCOLID;
    pbWalk += cbParsed;
    if (pbWalk > pbEnd) {

⌨️ 快捷键说明

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