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

📄 rilsimtkittext.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

HRESULT CRilSimToolkitCommand::ParseReceiveData(void)
{
    BYTE* pbParse;
    LPWSTR wszText = NULL;
    size_t cbTextBufSize = 0;
    DWORD dwIconID = SIMTKIT_INVALID_VALUE;
    DWORD dwDispMode = SIMTKIT_INVALID_VALUE;
    DWORD dwChannelDataLength;
    DWORD dwLength;
    HRESULT hr = S_OK;

    
    DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: +CRilSimToolkitCommand::ParseReceiveData\r\n")));

    pbParse = m_lpbParse;
    dwLength = 0;

    // At this point the Receive Data notification should be in the form of:
    //
    // ,<length>[,<alphaId>[,<iconId>,<dispMode>]]


    // ,<length>
    if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse) ||
        !ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwChannelDataLength, (LPCSTR&)pbParse)) 
    {
        hr = E_FAIL;
        goto Exit;
    }

    // Optional: ,<alphaId> 
    if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
    {
        if (!ParseEncodedText(pbParse, SIMTKIT_TEXT_ENCODING_ALPHAID, wszText, cbTextBufSize, pbParse)) 
        {
            hr = E_FAIL;
            goto Exit;
        }
    }

    // Optional: ,<iconId>,<dispMode>
    if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
    {
        if (!ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwIconID, (LPCSTR&)pbParse))
        { 
            hr = E_FAIL;
            goto Exit;
        }

        // ,<dispMode>
        if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse) ||
            !ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwDispMode, (LPCSTR&)pbParse)) 
        {
            hr = E_FAIL;
            goto Exit;
        }
    }

    // <CR><LF>
    if (!ParseRspPostfix((LPCSTR)pbParse, (LPCSTR&)pbParse) )
    {
        hr = E_FAIL;
        goto Exit;
    }

    // Parsing successful, set proper values for build command functions
    m_dwChannelDataLength = dwChannelDataLength;

    if (wszText)
    {
        m_pwszAlphaId  = wszText;
        m_dwAlphaIdLen = cbTextBufSize;
    }

    if (SIMTKIT_INVALID_VALUE != dwIconID)
    {
        m_dwIconIdentifier = dwIconID;
    }

    if (SIMTKIT_INVALID_VALUE != dwDispMode)
    {
        m_dwIconQualifier = dwDispMode;
    }

Exit:
    if (FAILED(hr))
    {
        delete[] wszText;
    }
    dwLength = pbParse - m_lpbParse;
    m_lpbParse = pbParse;
    m_dwParseLen -= dwLength;

    DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: -CRilSimToolkitCommand::ParseReceiveData\r\n")));
    return hr;
}

HRESULT CRilSimToolkitCommand::ParseSendData(void)
{
    BYTE* pbParse;
    LPWSTR wszText = NULL;
    size_t cbTextBufSize = 0;
    DWORD dwIconID = SIMTKIT_INVALID_VALUE;
    DWORD dwDispMode = SIMTKIT_INVALID_VALUE;
    DWORD dwDataLength;
    BYTE* pbData = NULL;
    size_t cbDataSize;
    DWORD dwLength;
    HRESULT hr = S_OK;

    
    DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: +CRilSimToolkitCommand::ParseSendData\r\n")));

    pbParse = m_lpbParse;
    dwLength = 0;

    // At this point the Receive Data notification should be in the form of:
    //
    // ,<length>,<data>[,<alphaId>[,<iconId>,<dispMode>]]


    // ,<length>
    if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse) ||
        !ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwDataLength, (LPCSTR&)pbParse)) 
    {
        hr = E_FAIL;
        goto Exit;
    }

    // ,
    if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
    {
        hr = E_FAIL;
        goto Exit;
    }
    
    // <data>
    if (!ParseBytes(pbParse, pbData, cbDataSize, pbParse)) 
    {
        hr = E_FAIL;
        goto Exit;
    }

    // Optional: ,<alphaId> 
    if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
    {
        if (!ParseEncodedText(pbParse, SIMTKIT_TEXT_ENCODING_ALPHAID, wszText, cbTextBufSize, pbParse)) 
        {
            hr = E_FAIL;
            goto Exit;
        }
    }

    // Optional: ,<iconId>,<dispMode>
    if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
    {
        if (!ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwIconID, (LPCSTR&)pbParse))
        { 
            hr = E_FAIL;
            goto Exit;
        }

        // ,<dispMode>
        if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse) ||
            !ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwDispMode, (LPCSTR&)pbParse)) 
        {
            hr = E_FAIL;
            goto Exit;
        }
    }

    // <CR><LF>
    if (!ParseRspPostfix((LPCSTR)pbParse, (LPCSTR&)pbParse) )
    {
        hr = E_FAIL;
        goto Exit;
    }

    // Parsing successful, set proper values for build command functions
    ASSERT(dwDataLength == cbDataSize);
    
    m_dwChannelDataLen = dwDataLength;
    m_lpbChannelData = pbData;
    
    if (wszText)
    {
        m_pwszAlphaId  = wszText;
        m_dwAlphaIdLen = cbTextBufSize;
    }

    if (SIMTKIT_INVALID_VALUE != dwIconID)
    {
        m_dwIconIdentifier = dwIconID;
    }

    if (SIMTKIT_INVALID_VALUE != dwDispMode)
    {
        m_dwIconQualifier = dwDispMode;
    }

Exit:
    if (FAILED(hr))
    {
        delete[] wszText;
        delete[] pbData;
    }
    dwLength = pbParse - m_lpbParse;
    m_lpbParse = pbParse;
    m_dwParseLen -= dwLength;

    DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: -CRilSimToolkitCommand::ParseSendData\r\n")));
    return hr;
}

HRESULT CRilSimToolkitCommand::ParseLanguageNotification(void)
{
    BYTE* pbParse;
    DWORD dwLength;
    LPSTR szLanguage = NULL;    
    size_t cbLanguageSize = 0;
    int iWideLength;
    HRESULT hr = S_OK;


    DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: +CRilSimToolkitCommand::ParseLanguageNotification\r\n")));

    pbParse = m_lpbParse;
    dwLength = 0;

    // At this point the Language notification should be in the form of:
    //
    // [,<language>]
    // where language is a pair of alpha numeric characters.

    if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
    {
        if (!ParseUnlimitedUnquotedString((LPCSTR)pbParse, '\r', szLanguage, cbLanguageSize, (LPCSTR&)pbParse)) 
        {
            hr = E_FAIL;
            goto Exit;
        }
    }

    // <CR><LF>
    if (!ParseRspPostfix((LPCSTR)pbParse, (LPCSTR&)pbParse) )
    {
        hr = E_FAIL;
        goto Exit;
    }

    // If we received a language, copy it to 
    if ((NULL != szLanguage) && (0 < cbLanguageSize))
    {
        // Size of the receiving language buffer must be the same size
        // as the max number of TCHAR's the SIMLANGUAGE structure can hold.
        if (cbLanguageSize != MAXLEN_LANGUAGE)
        {
            ASSERT(FALSE);
            hr = E_FAIL;
            goto Exit;
        }

        m_pwszLanguage = new TCHAR[MAXLEN_LANGUAGE];
        if (NULL == m_pwszLanguage)
        {
            ASSERT(FALSE);
            hr = E_OUTOFMEMORY;
            goto Exit;
        }

        iWideLength = MultiByteToWideChar(CP_ACP, 0, szLanguage, cbLanguageSize, m_pwszLanguage, MAXLEN_LANGUAGE);
        m_pwszLanguage[MAXLEN_LANGUAGE-1] = TEXT('\0');
        // Set the output size to the size of the buffer, not the character count.
        m_dwLanguageLen = (iWideLength) * sizeof(TCHAR);
    }
    else
    {
        m_pwszLanguage = NULL;
        m_dwLanguageLen = 0;
    }

    DEBUGMSG(ZONE_INFO, (TEXT("RilDrv : SIMTKit: ParseLanguageNotification: %s\r\n"), szLanguage));

Exit:
    if (FAILED(hr))
    {
        delete[] szLanguage;
    }
    dwLength = pbParse - m_lpbParse;
    m_lpbParse = pbParse;
    m_dwParseLen -= dwLength;
    
    DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: -CRilSimToolkitCommand::ParseLanguageNotification\r\n")));

    return hr;
}

HRESULT CRilSimToolkitResponse::TextFormatResponse(const RILSIMTOOLKITRSP* pRsp, const LPBYTE pDetails, const DWORD dwDetailSize, LPBYTE pbDataRsp, DWORD *pdwDataRspSize)
{
    DWORD dwOriginalSize = *pdwDataRspSize;
    HRESULT hr = S_OK;

    // Assert parameters
    DEBUGCHK(NULL != pRsp);
    DEBUGCHK(NULL != pbDataRsp);
    DEBUGCHK(0 < *pdwDataRspSize);
    
    // Check parameters
    if (NULL == pRsp ||
        NULL == pbDataRsp ||
        0 >= *pdwDataRspSize)
    {
        hr = E_INVALIDARG;
        goto Exit;
    }

    // Check dwParams to make sure the necessary fields are supported
    DEBUGCHK(pRsp->dwParams & RIL_PARAM_SIMTKIT_RSP_TYPE);
    DEBUGCHK(pRsp->dwParams & RIL_PARAM_SIMTKIT_RSP_RESPONSE);

    if (!(pRsp->dwParams & RIL_PARAM_SIMTKIT_RSP_TYPE) ||
        !(pRsp->dwParams & RIL_PARAM_SIMTKIT_RSP_RESPONSE))
    {
        hr = E_INVALIDARG;
        goto Exit;        
    }
        
    // Check the command and build up the appropriate response.
    switch (pRsp->dwType)
    {
        case SIM_NOTIFY_SETUPMENU_REPLY:
            hr = SetupMenuReply(pRsp->dwResponse, pDetails, dwDetailSize, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_SETUPMENU:
            hr = SetupMenuResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_SELECTITEM:
            hr = SelectItemResponse(pRsp->dwResponse, pDetails, dwDetailSize, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_PLAYTONE:
            hr = PlayToneResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_DISPLAYTEXT:
            hr = DisplayTextResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_GETINPUT:
        case SIM_NOTIFY_GETINKEY:
            hr = GetInputResponse(pRsp, pDetails, dwDetailSize, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_SETUPIDLEMODETEXT:
            hr = SetupIdleModeTextResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_SETUPCALL:
            hr = SetupCallResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_EVENTLIST:
            hr = EventListResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_LAUNCHBROWSER:
            hr = LaunchBrowserResponse(pRsp, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_OPENCHANNEL:
            hr = OpenChannelResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_SENDDTMF:
            hr = SendDTMFResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
            break;
        case SIM_NOTIFY_SENDSS:
        case SIM_NOTIFY_SENDUSSD:
        case SIM_NOTIFY_SENDSMS:
        case SIM_NOTIFY_REFRESH:
        case SIM_NOTIFY_CLOSECHANNEL:
        case SIM_NOTIFY_RECEIVEDATA:
        case SIM_NOTIFY_SENDDATA:
        case SIM_NOTIFY_LANGUAGENOTIFICATION:
            // There is no need to send a response for these commands
            // when the radio is pre-parsing and sending text formatted
            // notifications.
            *pdwDataRspSize = 0;
            goto Exit;
        case SIM_NOTIFY_CALLSETUP:
        case SIM_NOTIFY_MORETIME:
        case SIM_NOTIFY_POLLINTERVAL:
        case SIM_NOTIFY_POLLINGOFF:
        case SIM_NOTIFY_LOCALINFO:
        default:
            // Radios that pre-parse the SIM toolkit commands and send
            // text formatted notifications do not issue these commands.
            *pdwDataRspSize = 0;
            goto Exit;

    }


Exit:
    if (FAILED(hr))
    {
        *pdwDataRspSize = 0;
        DEBUGMSG(ZONE_ERROR, (TEXT("RilDrv : SIMTKit: Creation of command response failed.\r\n")));
    }
    else 
    {
        // Assert that we did not fill up the buffer.
        DEBUGCHK(dwOriginalSize > *pdwDataRspSize);
    }

    return hr;
}

HRESULT CRilSimToolkitResponse::TextEventDownload(const DWORD dwEvent, const LPBYTE pData, const DWORD dwDataSize, LPSTR szDataRsp, DWORD *pdwDataRspSize)
{
    DWORD dwOriginalSize = *pdwDataRspSize;
    HRESULT hr = S_OK;

    // Assert parameters
    DEBUGCHK(NULL != szDataRsp);
    DEBUGCHK(0 < *pdwDataRspSize);
    
    // Check parameters
    if (NULL == szDataRsp ||
        0 >= *pdwDataRspSize)
    {
        hr = E_INVALIDARG;
        goto Exit;
    }

    // Check the command and build up the appropriate response.
    switch (dwEvent)
    {
        case SIMTKIT_EVENT_USERACTIVITY:
        case SIMTKIT_EVENT_IDLESCREEN:
        case SIMTKIT_EVENT_BROWSERTERMINATION:
        case SIMTKIT_EVENT_DISPLAYPARAMETERS:
            _snprintf(szDataRsp, *pdwDataRspSize, "%.2x", dwEvent);
            szData

⌨️ 快捷键说明

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