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

📄 caps.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    prstnc->dwSendSMS           = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
    prstnc->dwPlayTone          = RIL_SIMTKN_MEIMPLEMENTS;
    prstnc->dwDisplayText       = RIL_SIMTKN_MEIMPLEMENTS;
    prstnc->dwGetInkey          = RIL_SIMTKN_MEIMPLEMENTS;
    prstnc->dwGetInput          = RIL_SIMTKN_MEIMPLEMENTS;
    prstnc->dwSelectItem        = RIL_SIMTKN_MEIMPLEMENTS;
    prstnc->dwSetupMenu         = RIL_SIMTKN_MEIMPLEMENTS;
    prstnc->dwSetupIdleModeText = RIL_SIMTKN_MEIMPLEMENTS;
    prstnc->dwLocalInfo         = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
    prstnc->dwSetupEventList    = RIL_SIMTKN_MEIMPLEMENTS;
#ifdef OEM2_SIMTOOLKIT
    prstnc->dwSendDTMF          = RIL_SIMTKN_RADIOIMPLEMENTS_REQUESTMEINPUT;
#else
    prstnc->dwSendDTMF          = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
#endif
    prstnc->dwSendDTMF          = RIL_SIMTKN_RADIOIMPLEMENTS_REQUESTMEINPUT;
    prstnc->dwLaunchBrowser     = RIL_SIMTKN_MEIMPLEMENTS;
    prstnc->dwOpenChannel       = RIL_SIMTKN_RADIOIMPLEMENTS_REQUESTMEINPUT;
    prstnc->dwCloseChannel      = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
    prstnc->dwReceiveData       = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
    prstnc->dwSendData          = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
    prstnc->dwTimerManagement   = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
    prstnc->dwRunAtCmd          = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;

    prstnc->dwNotifyFlags       = (RIL_CAPS_NOTIFY_SIMTOOLKITCMD       |
                                   RIL_CAPS_NOTIFY_SIMTOOLKITCALLSETUP |
                                   RIL_CAPS_NOTIFY_SIMTOOLKITEVENT);

    prstec = &(prstnc->rstecEvents);
    prstec->cbSize               = sizeof(RILSIMTOOLKITEVENTCAPS);
    prstec->dwParams             = RIL_PARAM_SIMTKE_ALL;
    prstec->dwMTCall             = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
    prstec->dwCallConnected      = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
    prstec->dwCallDisconnected   = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
    prstec->dwLocationStatus     = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
    prstec->dwUserActivity       = RIL_SIMTKN_MEIMPLEMENTS;
    prstec->dwIdleScreen         = RIL_SIMTKN_MEIMPLEMENTS;
    prstec->dwLanguageSelection  = RIL_SIMTKN_MEIMPLEMENTS;
    prstec->dwBrowserTermination = RIL_SIMTKN_NOSUPPORT;
    prstec->dwDataAvailable      = RIL_SIMTKN_NOSUPPORT;
    prstec->dwChannelStatus      = RIL_SIMTKN_NOSUPPORT;
    prstec->dwDisplayChange      = RIL_SIMTKN_NOSUPPORT;

    pBlob = (void*)prstnc;
    cbBlob = sizeof(RILSIMTOOLKITNOTIFYCAPS);

Error:
    if (FAILED(hr)) {
        FreeBlob(prstnc);
    }

#else  // defined(OEM1_DRIVER) || defined(OEM2_SIMTOOLKIT)

    HRESULT hr = E_NOTIMPL;
#endif // defined(OEM1_DRIVER) || defined(OEM2_SIMTOOLKIT)

    return hr;
}

//
//
//
static HRESULT ParseGetSignalQualityImplemenation(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetSignalQualityImplemenation);
    HRESULT hr = S_OK;
    DWORD * pdwSignalQualityImplCaps = NULL;

    pBlob = NULL;
    cbBlob = 0;

    pdwSignalQualityImplCaps = (DWORD *)AllocBlob(sizeof(DWORD));
    if (!pdwSignalQualityImplCaps) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }

#if defined(OEM1_CSQ_NOTIFICATION) || defined(OEM2_DRIVER)
    // OEM2 supports signal quality notifications.
    *pdwSignalQualityImplCaps = RIL_CAPS_SIGNALQUALITY_NOTIFICATION;
#else
    // Currently, all other radios support polling only.
    *pdwSignalQualityImplCaps = RIL_CAPS_SIGNALQUALITY_POLLING;
#endif
    pBlob = (void*)pdwSignalQualityImplCaps;
    cbBlob = sizeof(DWORD);

Error:
    if (FAILED(hr)) {
        FreeBlob(pdwSignalQualityImplCaps);
    }

    return hr;
}

//
//
//
static HRESULT ParseGetDevCapsSIMSupport(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetDevCapsSIMSupport);
    HRESULT hr = S_OK;
    DWORD * pdwSimSupportCaps = NULL;

    pBlob = NULL;
    cbBlob = 0;

    pdwSimSupportCaps = (DWORD *)AllocBlob(sizeof(DWORD));
    if (!pdwSimSupportCaps) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }

    // GSM devices have SIM support.
    *pdwSimSupportCaps = RIL_CAPS_SIM_BASIC;

    pBlob = (void*)pdwSimSupportCaps;
    cbBlob = sizeof(DWORD);

Error:
    if (FAILED(hr)) {
        FreeBlob(pdwSimSupportCaps);
    }

    return hr;
}



//
//
//
static HRESULT ParseGetCallProgressNotification(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    TBD_FUNCTION(ParseGetCallProgressNotification);
    HRESULT hr = S_OK;
    DWORD * pdwCallProgressNotification = NULL;

    pBlob = NULL;
    cbBlob = 0;

    pdwCallProgressNotification = (DWORD *)AllocBlob(sizeof(DWORD));
    if (!pdwCallProgressNotification) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }

#if defined(OEM1_DRIVER) || defined(OEM2_DRIVER)
    // OEM1 supports call progress notifications, adding OEM2
    *pdwCallProgressNotification = true;
#else
    *pdwCallProgressNotification = false;
#endif

    pBlob = (void*)pdwCallProgressNotification;
    cbBlob = sizeof(DWORD);

Error:
    if (FAILED(hr)) {
        FreeBlob(pdwCallProgressNotification);
    }

    return hr;
}

#if defined(OEM1_DRIVER)
static HRESULT ParseGetNITZSupported(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetNITZSupported);
    UINT nValue;
    HRESULT hr = E_FAIL;
    DWORD * pdwNITZNotificationSetting = NULL;


    pBlob = NULL;
    cbBlob = 0;

    pdwNITZNotificationSetting = (DWORD *)AllocBlob(sizeof(DWORD));
    if (!pdwNITZNotificationSetting) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }

    // Parse "<prefix>"
    if (!ParseRspPrefix(szRsp, szRsp)) {
        goto Error;
    }

    // Parse "%CTZV: "
    if (MatchStringBeginning(szRsp, "%CTZV: ", szRsp)) 
    {
        if (ParseUInt(szRsp, FALSE, nValue, szRsp))
        {
            hr = S_OK;
            if ( 0 == nValue )
            {
                *pdwNITZNotificationSetting = RIL_CAPS_NITZ_DISABLED;
            }
            else
            {
                *pdwNITZNotificationSetting = RIL_CAPS_NITZ_ENABLED;
            }
            pBlob = (void*)pdwNITZNotificationSetting;
            cbBlob = sizeof(DWORD);
        }
    }

Error:
    if (FAILED(hr)) {
        FreeBlob(pdwNITZNotificationSetting);
    }
    return hr;
}
#endif
//
//
//
HRESULT RILDrv_GetDevCaps(DWORD dwParam, DWORD dwCapsType)
{
    FUNCTION_TRACE(RILDrv_GetDevCaps);
    HRESULT hr = S_OK;
    LPCSTR szCmd = NULL;
    DWORD dwOptions = CMDOPT_NONE;
    PFN_CMD_PARSE pfnParse = NULL;
    BOOL fSpoofed = FALSE;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle) {
        hr = E_FAIL;
        goto Error;
    }

    switch (dwCapsType)
    {
        case RIL_CAPSTYPE_DIAL:
            szCmd = NULL;
            dwOptions = CMDOPT_NOOP;
            pfnParse = ParseGetDevCapsDial;
            break;

        case RIL_CAPSTYPE_DTMFDURATIONRANGE:
            szCmd = "AT+VTD=?\r";
            pfnParse = ParseGetDevCapsDTMFDurationRange;
            break;
        case RIL_CAPSTYPE_CALLMGTCMDS:
            szCmd = "AT+CHLD=?\r";
            pfnParse = ParseGetDevCapsCallMgtCmds;
            break;

        case RIL_CAPSTYPE_BEARERSERVICE:
            szCmd = "AT+CBST=?\r";
            pfnParse = ParseGetDevCapsBearerSvc;
            break;

        case RIL_CAPSTYPE_RLP:
            szCmd = "AT+CRLP=?\r";
            pfnParse = ParseGetDevCapsRLP;
            break;

        case RIL_CAPSTYPE_EQUIPMENTSTATES:
            szCmd = "AT+CFUN=?\r";
            pfnParse = ParseGetDevCapsEquipmentStates;
            break;

        case RIL_CAPSTYPE_PBSTORELOCATIONS:
            szCmd = "AT+CPBS=?\r";
            pfnParse = ParseGetDevCapsPBStoreLocs;
            break;

        case RIL_CAPSTYPE_PBINDEXRANGE:
            szCmd = "AT+CPBR=?\r";
            pfnParse = ParseGetDevCapsPBIndexRange;
            break;

        case RIL_CAPSTYPE_PBENTRYLENGTH:
            szCmd = "AT+CPBF=?\r";
            pfnParse = ParseGetDevCapsPBEntryLength;
            break;

        case RIL_CAPSTYPE_MSGSERVICETYPES:
            szCmd = "AT+CSMS=?\r";
            pfnParse = ParseGetDevCapsMsgSvcTypes;
            break;

        case RIL_CAPSTYPE_MSGMEMORYLOCATIONS:
            szCmd = "AT+CPMS=?\r";
            pfnParse = ParseGetDevCapsMsgMemoryLocs;
            break;

        case RIL_CAPSTYPE_BROADCASTMSGLANGS:
            szCmd = NULL;
            dwOptions = CMDOPT_NOOP;
            pfnParse = ParseGetDevCapsBroadcastMsgLangs;
            break;

        case RIL_CAPSTYPE_MSGCONFIGINDEXRANGE:
            szCmd = NULL;
            dwOptions = CMDOPT_NOOP;
            pfnParse = ParseGetDevCapsMsgConfigIndexRange;
            break;

        case RIL_CAPSTYPE_MSGSTATUSVALUES:
            szCmd = "AT+CMGL=?\r";
            pfnParse = ParseGetDevCapsMsgStatusValues;
            break;

        case RIL_CAPSTYPE_PREFOPINDEXRANGE:
            szCmd = "AT+CPOL=?\r";
            pfnParse = ParseGetDevCapsPrefOpIndexRange;
            break;

        case RIL_CAPSTYPE_LOCKFACILITIES:
#ifdef RIL_RADIO_RESILIENCE
            if (ShouldSpoofCommand() && g_cbLastLockCapsSize)
            {
                fSpoofed = TRUE;
                void *pLockCaps = AllocBlob(g_cbLastLockCapsSize);
                if (!pLockCaps) {
                    hr = E_OUTOFMEMORY;
                    goto Error;
                }
                hr = pHandle->GetDevice()->GetNextCmdID();
                memcpy(pLockCaps, g_pLastLockCaps, g_cbLastLockCapsSize);
                pHandle->Notify(RIL_RESULT_OK, hr, pLockCaps, g_cbLastLockCapsSize);
            }
            else
#endif
            {
                szCmd = "AT+CLCK=?\r";
                pfnParse = ParseGetDevCapsLockFacilities;
            }
            break;

        case RIL_CAPSTYPE_LOCKINGPWDLENGTHS:
            szCmd = "AT+CPWD=?\r";
            pfnParse = ParseGetDevCapsLockPwdLengths;
            break;

        case RIL_CAPSTYPE_BARRTYPES:
            szCmd = "AT+CLCK=?\r";
            pfnParse = ParseGetDevCapsBarrTypes;
            break;

        case RIL_CAPSTYPE_BARRINGPWDLENGTHS:
            szCmd = "AT+CPWD=?\r";
            pfnParse = ParseGetDevCapsBarrPwdLengths;
            break;

        case RIL_CAPSTYPE_FORWARDINGREASONS:
            szCmd = "AT+CCFC=?\r";
            pfnParse = ParseGetDevCapsFwdReasons;
            break;

        case RIL_CAPSTYPE_INFOCLASSES:
            szCmd = NULL;
            dwOptions = CMDOPT_NOOP;
            pfnParse = ParseGetDevCapsInfoClasses;
            break;

        case RIL_CAPSTYPE_HSCSD:
#ifdef WAVECOM_DRIVER
            // HW-SPECIFIC: WaveCom hardware doesn't support AT+CHSD and AT+CHSN

            hr = E_NOTIMPL;
            goto Error;
#else  // WAVECOM_DRIVER

            szCmd = "AT+CHSD;+CHSN=?\r";
            pfnParse = ParseGetDevCapsHSCSD;
            break;
#endif // WAVECOM_DRIVER

        case RIL_CAPSTYPE_SIMTOOLKITNOTIFICATIONS:
            szCmd = NULL;
            dwOptions = CMDOPT_NOOP;
            pfnParse = ParseGetDevCapsSimToolkitNotifications;
            break;


        case RIL_CAPSTYPE_GPRSCLASS:
            szCmd = "AT+CGCLASS=?\r";
            pfnParse = ParseGetGprsCapsClass;
		break;
        case RIL_CAPSTYPE_GPRSCONTEXT:
            szCmd = "AT+CGDCONT=?\r";
            pfnParse = ParseGetGprsCapsContext;
            break;
        case RIL_CAPSTYPE_GPRSQOS:
            szCmd = "AT+CGQREQ=?\r";
            pfnParse = ParseGetGprsCapsQOS;
            break;
        case RIL_CAPSTYPE_GPRSQOSMIN:
            szCmd = "AT+CGQMIN=?\r";
            pfnParse = ParseGetGprsCapsQOSMin;
            break;
        case RIL_CAPSTYPE_GPRSMOSMS:
            szCmd = "AT+CGSMS=?\r";
            pfnParse = ParseGetGprsCapsSMOSMS;
            break;

        case RIL_CAPSTYPE_DATACOMPRESSION:
            szCmd = "AT+DS=?\r";
            pfnParse = ParseGetDevCapsDataCompression;
            break;
        case RIL_CAPSTYPE_ERRORCORRECTION:
            szCmd = "AT+ES=?\r";
            pfnParse = ParseGetDevCapsErrorCorrection;
            break;
        case RIL_CAPSTYPE_SIGNALQUALITYIMPLEMENTATION:
            szCmd = NULL;
            dwOptions = CMDOPT_NOOP;
            pfnParse = ParseGetSignalQualityImplemenation;
            break;

        case RIL_CAPSTYPE_SIMSUPPORT:
            szCmd = NULL;
            dwOptions = CMDOPT_NOOP;
            pfnParse = ParseGetDevCapsSIMSupport;
            break;

        case RIL_CAPSTYPE_CALLPROGRESSNOTIFICATION:
//#ifdef OEM1_DRIVER                // may want to actually ask in the future - for now assume all OEM1 radios support this
//            szCmd = "AT+CPI?\r";
//#else
            szCmd = NULL;
            dwOptions = CMDOPT_NOOP;
//#endif
            pfnParse = ParseGetCallProgressNotification;
            break;

        case RIL_CAPSTYPE_NITZNOTIFICATION:
#ifdef OEM1_DRIVER                // may want to actually ask in the future - for now assume all OEM1 radios support this
            szCmd = "AT%CTZV?\r";
            pfnParse = ParseGetNITZSupported;
#else
            hr = E_NOTIMPL;
            goto Error;
#endif
            break;
        default:
            hr = E_INVALIDARG;
            goto Error;
    }

    if (!fSpoofed)
        if (!QueueCmd(pHandle, szCmd, dwOptions, APIID_GETDEVCAPS, pfnParse, NULL, hr)) {
            hr = E_FAIL;
            goto Error;
        }

Error:
    return hr;
}

⌨️ 快捷键说明

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