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

📄 data.cpp

📁 ril source code for Windows CE
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    // Add ","
    (void)strncpyz(szWalk, ",", MAX_PATH - (szWalk - szCmd));
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    // Add "<neg>"
    if (lpDataCompInfo->dwParams & RIL_PARAM_DCI_NEGOTIATION)
    {
        if (!ValueFromFlag(lpDataCompInfo->dwNegotiation, g_DataCompNegotiation, NUM_DATACOMPNEGOTIATION, 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);
    }

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

    // Add "<P1>"
    if (lpDataCompInfo->dwParams & RIL_PARAM_DCI_MAXDICTENTRIES)
    {
        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "%u", lpDataCompInfo->dwMaxDictEntries);
        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 "<P2>"
    if (lpDataCompInfo->dwParams & RIL_PARAM_DCI_MAXSTRING)
    {
        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "%u", lpDataCompInfo->dwMaxStringLength);
        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_SETDATACOMPRESSION, NULL, NULL, hr))
    {
        hr = E_FAIL;
        goto Error;
    }

    Error:
    return hr;
}

// +ES: <orig_rqst>,<orig_fbk>,<ans_fbk>
HRESULT ParseGetErrorCorrection(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetErrorCorrection);
    UINT nValue;
    RILERRORCORRECTIONINFO* preci = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

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

    // Parse "<prefix>+ES: <orig_rqst>"
    if (!ParseRspPrefix(szRsp, szRsp)                   ||
        !MatchStringBeginning(szRsp, "+ES: ", szRsp)    ||
        !ParseUInt(szRsp, FALSE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }

    FlagFromValue(nValue, g_ErrorCorrectionOrigRqst, NUM_ERRORCORRECTIONORIGRQST, preci->dwOriginalRequest);

    // Parse ",<orig_fbk>"
    if (!MatchStringBeginning(szRsp, ",", szRsp)        ||
        !ParseUInt(szRsp, FALSE, nValue, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }

    FlagFromValue(nValue, g_ErrorCorrectionOrigFbk, NUM_ERRORCORRECTIONORIGFBK, preci->dwOriginalFallback);

    // Parse ",<ans_fbk><postfix>"
    if (!MatchStringBeginning(szRsp, ",", szRsp)        ||
        !ParseUInt(szRsp, FALSE, nValue, szRsp)         ||
        !ParseRspPostfix(szRsp, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }

    FlagFromValue(nValue, g_ErrorCorrectionAnsFbk, NUM_ERRORCORRECTIONANSFBK, preci->dwAnswererFallback);
    preci->dwParams |= RIL_PARAM_ECI_ALL;

    pBlob = (void*)preci;
    cbBlob = sizeof(RILERRORCORRECTIONINFO);

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

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

    if (!QueueCmd(pHandle, "AT+ES?\r", CMDOPT_NONE, APIID_GETERRORCORRECTION, ParseGetErrorCorrection, NULL, hr))
    {
        hr = E_FAIL;
        goto Error;
    }

    Error:
    return hr;
}

// +ES=[<orig_rqst>[,<orig_fbk>[,<ans_fbk>]]]
HRESULT RILDrv_SetErrorCorrection (DWORD dwParam, const RILERRORCORRECTIONINFO* lpErrorCorrectionInfo)
{
    FUNCTION_TRACE(RILDrv_SetErrorCorrection);
    char szCmd[MAX_PATH];
    UINT nValue;
    LPSTR szWalk = szCmd;
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle || !lpErrorCorrectionInfo)
    {
        hr = E_FAIL;
        goto Error;
    }

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

    if (!ValueFromFlag(lpErrorCorrectionInfo->dwOriginalRequest, g_ErrorCorrectionOrigRqst, NUM_ERRORCORRECTIONORIGRQST, nValue))
    {
        hr = E_INVALIDARG;
        goto Error;
    }

    // Add "<orig_rqst>"
    if (lpErrorCorrectionInfo->dwParams & RIL_PARAM_ECI_ORIGINALREQUEST)
    {
        (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);

    if (!ValueFromFlag(lpErrorCorrectionInfo->dwOriginalFallback, g_ErrorCorrectionOrigFbk, NUM_ERRORCORRECTIONORIGFBK, nValue))
    {
        hr = E_INVALIDARG;
        goto Error;
    }

    // Add "<orig_fbk>"
    if (lpErrorCorrectionInfo->dwParams & RIL_PARAM_ECI_ORIGINALFALLBACK)
    {
        (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);

    if (!ValueFromFlag(lpErrorCorrectionInfo->dwAnswererFallback, g_ErrorCorrectionAnsFbk, NUM_ERRORCORRECTIONANSFBK, nValue))
    {
        hr = E_INVALIDARG;
        goto Error;
    }

    // Add "<ans_fbk>"
    if (lpErrorCorrectionInfo->dwParams & RIL_PARAM_ECI_ANSWERERFALLBACK)
    {
        (void)_snprintfz(szWalk, MAX_PATH - (szWalk - szCmd), "%u", nValue);
        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_SETERRORCORRECTION, NULL, NULL, hr))
    {
        hr = E_FAIL;
        goto Error;
    }

Error:
    return hr;
}

//
//
//
HRESULT ParseGetDevCapsDataCompression(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetDevCapsDataCompression);

    RILCAPSDATACOMPRESSION *prcdc = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

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

    if (!ParseRspPrefix(szRsp, szRsp) ||
        !MatchStringBeginning(szRsp, "+DS: ", szRsp) ||
        !ParseRangeList(szRsp, g_DataCompDirection, NUM_DATACOMPDIRECTION, prcdc->dwDirection, szRsp) ||
        !MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseRangeList(szRsp, g_DataCompNegotiation, NUM_DATACOMPNEGOTIATION, prcdc->dwNegotiation, szRsp) ||
        !MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseRange(szRsp, prcdc->rrMaxDict, szRsp) ||
        !MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseRange(szRsp, prcdc->rrMaxString, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }

    prcdc->dwParams = RIL_PARAM_CDC_ALL;

    pBlob = (void*)prcdc;
    cbBlob = sizeof(RILCAPSDATACOMPRESSION);

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

    return hr;
}

//
//
//
HRESULT ParseGetDevCapsErrorCorrection(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetDevCapsErrorCorrection);

    RILCAPSERRORCORRECTION *prcec = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

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

    if (!ParseRspPrefix(szRsp, szRsp) ||
        !MatchStringBeginning(szRsp, "+ES: ", szRsp) ||
        !ParseRangeList(szRsp, g_ErrorCorrectionOrigRqst, NUM_ERRORCORRECTIONORIGRQST, prcec->dwOriginalRequest, szRsp) ||
        !MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseRangeList(szRsp, g_ErrorCorrectionOrigFbk, NUM_ERRORCORRECTIONORIGFBK, prcec->dwOriginalFallback, szRsp) ||
        !MatchStringBeginning(szRsp, ",", szRsp) ||
        !ParseRangeList(szRsp, g_ErrorCorrectionAnsFbk, NUM_ERRORCORRECTIONANSFBK, prcec->dwAnswererFallback, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp))
    {
        hr = E_FAIL;
        goto Error;
    }

    prcec->dwParams = RIL_PARAM_CDC_ALL;

    pBlob = (void*)prcec;
    cbBlob = sizeof(RILCAPSERRORCORRECTION);

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

    return hr;
}

HRESULT RILDrv_SetATLogging(DWORD dwParam, BOOL fEnable)
{
   FUNCTION_TRACE(RILDrv_SetATLogging);
   HRESULT hr = S_OK;
   CRilHandle* pRilDevice = NULL;
  
   CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
   if (!pHandle)
   {
     hr = E_FAIL;
     goto Error;
   }
    
   pRilDevice = pHandle->GetDevice();
   if ( pRilDevice ) 
   {
     if ( fEnable )
       pRilDevice->SetAtLogOwner( pHandle );
     else
       pRilDevice->SetAtLogOwner(0);
   }

   // Build command
   if (!QueueCmd(pHandle,
                  NULL,
                  CMDOPT_NOOP,
                  APIID_REGISTERATCOMMANDLOGGING,
                  NULL,  // Parse fn
                  NULL,     // Ptr to notification data
                  hr))
        hr=E_FAIL;

   Error:
    return hr;
}


// For Microsoft Test only. This does not need to be fully implemented.
// A return response of E_NOTIMPL is appropriate. 
HRESULT RILDrv_ATLogFile(DWORD dwParam, const TCHAR *pszFilename)
{
    FUNCTION_TRACE(RILDrv_ATLogFile);
    HRESULT hr = S_OK;

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

// If Watson support is not enabled return not implemented.
#ifndef RIL_WATSON_REPORT
    hr = E_NOTIMPL;
    goto Error;
    
#else
    // Move the read point in the at log buffer to the beginning
    // of the first command. (This removes partial log entries.)
    g_RilATCmdLogBuffer.AdvanceReadPastDelimiter((BYTE)'\n');
    
    // Create the log file.
    if ( !(g_RilATCmdLogBuffer.DumpToFile(pszFilename)) )
    {
         hr = E_FAIL;
         goto Error;        
    }
    
    // Build command
    if (!QueueCmd(pHandle,
                  NULL,
                  CMDOPT_NOOP,
                  APIID_ATCOMMANDLOGFILE,
                  NULL,     // Parse fn
                  NULL,     // Ptr to notification data
                  hr))
    {
        hr=E_FAIL;
    }
#endif // RIL_WATSON_REPORT

    
Error:
    return hr;
}

HRESULT RILDrv_GetSerialPortHandleFromContextID(DWORD dwContextID, __out_bcount( dwSize ) TCHAR *tszDataPortName, DWORD dwSize, DWORD *pdwSizeOut)
{
    HRESULT hr = E_FAIL;

    if ( tszDataPortName && pdwSizeOut )
    {
        // At the time of this implementation, we do not have any vendors that support multiple PPP-based APNs. In this case,
        // we will simply do what the proxy currently does. This allows for basic testing.
        const TCHAR DefaultDataVspName[] = _T("COM9:");
        *pdwSizeOut = 0;
        if ( dwSize > sizeof(DefaultDataVspName) )
        {
            // Get the COM port name
            if (!GetRegistrySZ( HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\RIL"), TEXT("DataPort"), tszDataPortName, (dwSize / sizeof(*tszDataPortName)) ))
            {
                _tcsncpyz( tszDataPortName, DefaultDataVspName, (sizeof(DefaultDataVspName) / sizeof(*DefaultDataVspName)) );
            }
            *pdwSizeOut = (_tcslen ( tszDataPortName ) + 1) * sizeof(*tszDataPortName);
            hr = S_OK;
        }
    }
    return hr;
}


HRESULT RILDrv_GetVTSerialPortHandle(TCHAR *tszVTPortName, DWORD dwSize, DWORD *pdwSizeOut)
{
    return E_NOTIMPL;
}

⌨️ 快捷键说明

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