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

📄 data.cpp

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

    // Add ","
    (void)strncpyz(szWalk, ",", MAX_PATH - (szWalk - szCmd));
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    // Add "<top_rx_timeslots>"
    if (lpHscsdInfo->dwParams & RIL_PARAM_HSCSDI_RXTIMESLOTSLIMIT)
    {
        if (RIL_HSCSDTIMESLOTSLIMIT_NONE == lpHscsdInfo->dwRxTimeslotsLimit)
        {
            nValue = 0;
        }
        else
        {
            nValue = lpHscsdInfo->dwRxTimeslotsLimit;
        }

        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "%u", nValue);
        szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
        DEBUGCHK(NULL != szWalk);
    }

    // Add ","
    (void)strncpyz(szWalk, ",", MAX_PATH - (szWalk - szCmd));
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    // Add "<codings>"
    if (lpHscsdInfo->dwParams & RIL_PARAM_HSCSDI_NONTRANSPCHANNELCODINGS)
    {
        nValue = 0;
        if (RIL_HSCSDCODING_ALL != lpHscsdInfo->dwNonTranspChannelCodings)
        {
            for (i = 0 ; i < NUM_HSCSDCODINGS; i++)
            {
                if (lpHscsdInfo->dwNonTranspChannelCodings & g_rgdwHSCSDCodings[i])
                {
                    nValue += (0x01 << i);
                }
            }
            if (!nValue)
            {
                hr = E_INVALIDARG;
                goto Error;
            }
        }

        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "%u", nValue);
        szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
        DEBUGCHK(NULL != szWalk);
    }

    if (lpHscsdInfo->dwParams & RIL_PARAM_HSCSDI_AUTOSVCLEVELUPGRADING)
    {
        // Add ";+CHSU=<mode>"
        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), ";+CHSU=%u",
                         (lpHscsdInfo->fAutoSvcLevelUpgrading ? 1 : 0));
        szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
        DEBUGCHK(NULL != szWalk);
    }

    // Add "<CR>"
    (void)strncpyz(szWalk, "\r", MAX_PATH - (szWalk - szCmd));
    if (!QueueCmd(pHandle, szCmd, CMDOPT_NONE, APIID_SETHSCSDOPTIONS, NULL, NULL, hr))
    {
        hr = E_FAIL;
        goto Error;
    }

    Error:
#else  // WAVECOM_DRIVER

    HRESULT hr = E_NOTIMPL;
#endif // WAVECOM_DRIVER

    return hr;
}
//
//
//
static HRESULT ParseGetHSCSDCallSettings(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetHSCSDCallSettings);
    UINT nValue;
    UINT i;
    RILCALLHSCSDINFO* prchscsdi = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    prchscsdi = (RILCALLHSCSDINFO*)AllocBlob(sizeof(RILCALLHSCSDINFO));
    if (!prchscsdi)
    {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(prchscsdi, 0x00, sizeof(RILCALLHSCSDINFO));
    prchscsdi->cbSize = sizeof(RILCALLHSCSDINFO);

    // Parse "<prefix>+CHSC: <rx_timeslots>"
    if (!ParseRspPrefix(szRsp, szRsp)                  ||
        !MatchStringBeginning(szRsp, "+CHSC: ", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    prchscsdi->dwRxTimeslots = nValue;
    prchscsdi->dwParams |= RIL_PARAM_CHSCSDI_RXTIMESLOTS;

    // Parse ",<tx_timeslots>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    prchscsdi->dwTxTimeslots = nValue;
    prchscsdi->dwParams |= RIL_PARAM_CHSCSDI_TXTIMESLOTS;

    // Parse ",<aiur>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    for (i = 0; i < NUM_HSCSDAIRRATES; i++)
    {
        if (nValue == g_rgdwHSCSDAirRates[i])
        {
            prchscsdi->dwAirInterfaceUserRate = i;
            break;
        }
    }
    if (NUM_HSCSDAIRRATES == i)
    {
        // We couldn't match the response with anything
        prchscsdi->dwAirInterfaceUserRate = RIL_HSCSDAIURATE_UNKNOWN;
    }
    prchscsdi->dwParams |= RIL_PARAM_CHSCSDI_AIRINTERFACEUSERRATE;

    // Parse ",<coding><postfix>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp)   ||
        !ParseRspPostfix(szRsp, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    for (i = 0 ; i < NUM_HSCSDCODINGS; i++)
    {
        if ((0x01 << i) == (int)nValue)
        {
            prchscsdi->dwChannelCoding = g_rgdwHSCSDCodings[i];
        }
    }
    if (NUM_HSCSDCODINGS == i)
    {
        prchscsdi->dwChannelCoding = RIL_HSCSDCODING_UNKNOWN;
    }
    prchscsdi->dwParams |= RIL_PARAM_CHSCSDI_CHANNELCODING;

    pBlob = (void*)prchscsdi;
    cbBlob = sizeof(RILCALLHSCSDINFO);

    Error:
    if (FAILED(hr))
    {
        FreeBlob(prchscsdi);
    }
    return hr;
}


//
//
//
HRESULT RILDrv_GetHSCSDCallSettings(DWORD dwParam)
{
    FUNCTION_TRACE(RILDrv_GetHSCSDCallSettings);
#if !defined(WAVECOM_DRIVER) || defined(GSM_ATTEST)
    // HW-SPECIFIC: WaveCom hardware doesn't support AT+CHSC

    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle)
    {
        hr = E_FAIL;
        goto Error;
    }

    if (!QueueCmd(pHandle, "AT+CHSC\r", CMDOPT_NONE, APIID_GETHSCSDCALLSETTINGS, ParseGetHSCSDCallSettings, NULL, hr))
    {
        hr = E_FAIL;
        goto Error;
    }

    Error:
#else  // WAVECOM_DRIVER

    HRESULT hr = E_NOTIMPL;
#endif // WAVECOM_DRIVER

    return hr;
}


//
//
//
static HRESULT ParseGetBearerServiceOptions(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetBearerServiceOptions);
    UINT nValue;
    UINT i;
    RILBEARERSVCINFO* prbsi = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    prbsi = (RILBEARERSVCINFO*)AllocBlob(sizeof(RILBEARERSVCINFO));
    if (!prbsi)
    {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(prbsi, 0x00, sizeof(RILBEARERSVCINFO));
    prbsi->cbSize = sizeof(RILBEARERSVCINFO);

    // Parse "<prefix>+CBST: <speed>"
    if (!ParseRspPrefix(szRsp, szRsp)                  ||
        !MatchStringBeginning(szRsp, "+CBST: ", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    for (i = 0; i < NUM_CONNSPEEDS; i++)
    {
        if (nValue == g_rgdwConnSpeeds[i])
        {
            prbsi->dwSpeed = i;
            break;
        }
    }
    if (NUM_CONNSPEEDS == i)
    {
        // We couldn't match the response with anything
        prbsi->dwSpeed = RIL_SPEED_UNKNOWN;
    }
    prbsi->dwParams |= RIL_PARAM_BSI_SPEED;

    // Parse ",<svc_name>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    for (i = 0; i < NUM_BEARERSVCNAMES; i++)
    {
        if (nValue == g_rgdwBearerSvcNames[i])
        {
            prbsi->dwServiceName = i;
            break;
        }
    }
    if (NUM_BEARERSVCNAMES == i)
    {
        // We couldn't match the response with anything
        prbsi->dwServiceName = RIL_BSVCNAME_UNKNOWN;
    }
    prbsi->dwParams |= RIL_PARAM_BSI_SERVICENAME;

    // Parse ",<conn_element><postfix>"
    if (!MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp)   ||
        !ParseRspPostfix(szRsp, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }
    for (i = 0; i < NUM_BEARERSVCCONNELEMS; i++)
    {
        if (nValue == g_rgdwBearerSvcConnElems[i])
        {
            prbsi->dwConnectionElement = i;
            break;
        }
    }
    if (NUM_BEARERSVCCONNELEMS == i)
    {
        // We couldn't match the response with anything
        prbsi->dwConnectionElement = RIL_BSVCCE_UNKNOWN;
    }
    prbsi->dwParams |= RIL_PARAM_BSI_CONNECTIONELEMENT;

    pBlob = (void*)prbsi;
    cbBlob = sizeof(RILBEARERSVCINFO);

    Error:
    if (FAILED(hr))
    {
        FreeBlob(prbsi);
    }
    return hr;
}


//
//
//
HRESULT RILDrv_GetBearerServiceOptions(DWORD dwParam)
{
    FUNCTION_TRACE(RILDrv_GetBearerServiceOptions);
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle)
    {
        hr = E_FAIL;
        goto Error;
    }

    if (!QueueCmd(pHandle, "AT+CBST?\r", CMDOPT_NONE, APIID_GETBEARERSERVICEOPTIONS, ParseGetBearerServiceOptions,
                  NULL, hr))
    {
        hr = E_FAIL;
        goto Error;
    }

    Error:
    return hr;
}


//
//
//
HRESULT RILDrv_SetBearerServiceOptions(DWORD dwParam, const RILBEARERSVCINFO* lpBearerServiceInfo)
{
    FUNCTION_TRACE(RILDrv_SetBearerServiceOptions);
    char szCmd[MAX_PATH];
    LPSTR szWalk = szCmd;
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle || !lpBearerServiceInfo)
    {
        hr = E_FAIL;
        goto Error;
    }

    //zhaozipeng 20070718, disconnect GPRS before CSD connection.
#if 0
    if(0 != g_dwActiveGPRSContextID)
    {
        RETAILMSG(1, (TEXT("[GSM] find active GPRS connection.\r\n")));
        CRilHandle *pDevice = pHandle->GetDevice();
        RILGPRSCONTEXTACTIVATED rGPRSca;
        memset(&rGPRSca, 0x00, sizeof(RILGPRSCONTEXTACTIVATED));
        rGPRSca.cbSize = sizeof(rGPRSca);
        rGPRSca.fActivated = FALSE;
        if(0 == g_dwActiveGPRSContextID)
            rGPRSca.dwContextID = 1;
        else
            rGPRSca.dwContextID = g_dwActiveGPRSContextID;
        RETAILMSG(1, (TEXT("[GSM] g_dwActiveGPRSContextID=[%d]\r\n"), g_dwActiveGPRSContextID));
        rGPRSca.dwEvent = RIL_RILGPRSCONTEXTACTIVATED_MEDEACT;
        if( pDevice->BroadcastRealBlobNotification(RIL_NOTIFY_GPRS_DISCONNECT, &rGPRSca, sizeof(rGPRSca)) )
        {
            RETAILMSG(1, (TEXT("[GSM] Broadcast ME DEACT first, OK\r\n")));
        }
        else
        {
            RETAILMSG(1, (TEXT("[GSM] Broadcast ME DEACT first, Failed\r\n")));
            goto Error;
        }
    }
        //Sleep(1000*3);

        //disconnect first CSD before new CSD come
    {
        UINT8 nFirstCSDCallID = 0;
        if( RILDrv_CC_GetCallIDFromType(CALL_TYPE_CSD, nFirstCSDCallID) )
        {
            RETAILMSG(1, (TEXT("[GSM] RILDrv_SetBearerServiceOptions:find CSD Call exsit and CallID=[%d]\r\n"),nFirstCSDCallID));
            char szCmd_ath[MAX_PATH];
            (void)_snprintfz(szCmd_ath, MAX_PATH, "AT%%CHLD=7%u\r", nFirstCSDCallID);	
            QueueCmdIgnoreRsp(APIID_NONE, szCmd_ath, CMDOPT_NONE, g_TimeoutAPIDefault, NULL, NULL, 0, 0, 0);
            Sleep( 500 );
        }
    }
#endif
    //end zhaozipeng 20070718
    // Add "AT+CBST="
    (void)strncpyz(szWalk, "AT+CBST=", MAX_PATH - (szWalk - szCmd));
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    // Add "<speed>"
    if (lpBearerServiceInfo->dwParams & RIL_PARAM_BSI_SPEED)
    {
        DEBUGCHK(RIL_SPEED_64000_TRANSP >= lpBearerServiceInfo->dwSpeed);

        if (RIL_SPEED_UNKNOWN == lpBearerServiceInfo->dwSpeed)
        {
            hr = E_INVALIDARG;
            goto Error;
        }

        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "%u", g_rgdwConnSpeeds[lpBearerServiceInfo->dwSpeed]);
        szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
        DEBUGCHK(NULL != szWalk);
    }

    // Add ","
    (void)strncpyz(szWalk, ",", MAX_PATH - (szWalk - szCmd));
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    // Add "<svc_name>"
    if (lpBearerServiceInfo->dwParams & RIL_PARAM_BSI_SERVICENAME)
    {
        DEBUGCHK(RIL_BSVCNAME_PACKETACCESS_SYNC_RDI >= lpBearerServiceInfo->dwServiceName);

        if (RIL_BSVCNAME_UNKNOWN == lpBearerServiceInfo->dwServiceName)
        {
            hr = E_INVALIDARG;
            goto Error;
        }

        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "%u", g_rgdwBearerSvcNames[lpBearerServiceInfo->dwServiceName]);
        szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27

⌨️ 快捷键说明

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