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

📄 network.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#if 0
    if ( pronNames->dwParams & RIL_PARAM_ON_LONGNAME )
    {
        _tprintf(TEXT("-------------- LONG NAME [%hs] ---------------"), pronNames->szLongName);
    }
    if ( pronNames->dwParams & RIL_PARAM_ON_SHORTNAME )
    {
        _tprintf(TEXT("------------- SHORT NAME [%hs] ---------------"), pronNames->szShortName);
    }
    if ( pronNames->dwParams & RIL_PARAM_ON_NUMNAME )
    {
        _tprintf(TEXT("--------------- NUM NAME [%hs] ---------------"), pronNames->szNumName);
    }
    if ( pronNames->dwParams & RIL_PARAM_ON_COUNTRY_CODE )
    {
        _tprintf(TEXT("----------- COUNTRY CODE [%hs] ---------------"), pronNames->szCountryCode);
    }
#endif
}
void GetLongOperatorName(RILOPERATORNAMES* pronNames)
{
    GetLongOperatorNameEx( pronNames, 0xFFFFFFFF );
}


//
//
//
static HRESULT ParseGetSubscriberNumbers(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetSubscriberNumbers);
    UINT i;
    UINT nValue;
    UINT nUsed = 0;
    UINT nAllocated = 0;
    DWORD dwCurrentAddressId = 0;
    char szAddress[MAXLENGTH_ADDRESS];
    RILSUBSCRIBERINFO* rgrsi = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

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

    // Parse "+CNUM: "
    while (MatchStringBeginning(szRsp, "+CNUM: ", szRsp)) {
        if (nUsed == nAllocated) {
            if (!AllocateOrReallocateStorage((BYTE**)&rgrsi, sizeof(RILSUBSCRIBERINFO), nUsed, &nAllocated, NETWK_ALLOC_NUMBER)) {
                hr = E_OUTOFMEMORY;
                goto Error;
            }
        }

        memset(&rgrsi[nUsed], 0x00, sizeof(RILSUBSCRIBERINFO));
        rgrsi[nUsed].cbSize = sizeof(RILSUBSCRIBERINFO);

        // Parse "<alpha>"
        if (ParseQuotedEncodedString(ENCODING_TECHARSET, szRsp, rgrsi[nUsed].wszDescription, rgrsi[nUsed].wszDescription + MAXLENGTH_DESCRIPTION)) {
            rgrsi[nUsed].dwParams |= RIL_PARAM_SI_DESCRIPTION;
        }

        // Parse ",<number>,<type>"
        if (!MatchStringBeginning(szRsp, ",", szRsp)                     ||
            !ParseString(szRsp, szAddress, MAXLENGTH_ADDRESS, szRsp)     ||
            !MatchStringBeginning(szRsp, ",", szRsp)                     ||
            !ParseUIntAndVerifyAbove(szRsp, FALSE, 0x100, nValue, szRsp) ||
            !StringToRILAddress(szAddress, (BYTE)nValue, rgrsi[nUsed].raAddress)) {
            goto Continue;
        }
        rgrsi[nUsed].dwParams |= RIL_PARAM_SI_ADDRESS;

        // Some radios are giving us empty +CNUM responses.
        // Don't return these (and don't include in multiline count).
        if (('\0' == szAddress[0]) &&
            (0 == (rgrsi[nUsed].dwParams & RIL_PARAM_SI_DESCRIPTION)))
        {
            goto Continue;
        }

        // This assignment is a heuristic that seems correct.
        rgrsi[nUsed].dwAddressId = dwCurrentAddressId++;
        rgrsi[nUsed].dwParams |= RIL_PARAM_SI_ADDRESSID;

        // Parse ","
        if (MatchStringBeginning(szRsp, ",", szRsp)) {
            // Parse "<speed>"
            if (!ParseUInt(szRsp, TRUE, nValue, szRsp)) {
                goto Continue;
            }
            for (i = 0; i < NUM_CONNSPEEDS; i++) {
                if (nValue == g_rgdwConnSpeeds[i]) {
                    rgrsi[nUsed].dwSpeed = i;
                    break;
                }
            }
            if (NUM_CONNSPEEDS == i) {
                // We couldn't match the response with anything
                rgrsi[nUsed].dwSpeed = RIL_SPEED_UNKNOWN;
            }
            rgrsi[nUsed].dwParams |= RIL_PARAM_SI_SPEED;

            // Parse ",<service>
            if (!MatchStringBeginning(szRsp, ",", szRsp) ||
                !ParseUInt(szRsp, TRUE, nValue, szRsp)) {
                goto Continue;
            }
            if (NUM_SERVICES > nValue) {
                rgrsi[nUsed].dwService = g_rgdwServices[nValue];
            } else {
                rgrsi[nUsed].dwService = RIL_SERVICE_UNKNOWN;
            }
            rgrsi[nUsed].dwParams |= RIL_PARAM_SI_SERVICE;

            // Parse ","
            if (MatchStringBeginning(szRsp, ",", szRsp)) {
                // Parse "<itc>"
                if (!ParseUIntAndVerifyAbove(szRsp, TRUE, 2, nValue, szRsp)) {
                    goto Continue;
                }
                rgrsi[nUsed].dwITC = (nValue ? RIL_ITC_UDI : RIL_ITC_31KHZ);
                rgrsi[nUsed].dwParams |= RIL_PARAM_SI_ITC;
            }
        }

        // Increment the array index
        nUsed++;

Continue:
        // Find "<postfix>"
        if (!FindRspPostfix(szRsp, szRsp)) {
            hr = E_FAIL;
            goto Error;
        }
    }

#ifdef DEBUG
    // For multi-line testing purposes, we can pretend that
    // we have an arbitrary number of lines.
    DWORD dwTotalSpoofedLines;
    if (GetRegistryDWORD(HKEY_LOCAL_MACHINE, g_tszRegKeyRIL, TEXT("SpoofMultipleLines"), &dwTotalSpoofedLines))
    {
        for ( ; dwCurrentAddressId < dwTotalSpoofedLines; dwCurrentAddressId++)
        {
            if (nUsed == nAllocated) {
                if (!AllocateOrReallocateStorage((BYTE**)&rgrsi, sizeof(RILSUBSCRIBERINFO), nUsed, &nAllocated, NETWK_ALLOC_NUMBER)) {
                    hr = E_OUTOFMEMORY;
                    goto Error;
                }
            }

            memset(&rgrsi[nUsed], 0x00, sizeof(RILSUBSCRIBERINFO));
            rgrsi[nUsed].cbSize = sizeof(RILSUBSCRIBERINFO);

            // This assignment is a heuristic that seems correct.
            rgrsi[nUsed].dwAddressId = dwCurrentAddressId++;
            rgrsi[nUsed].dwParams |= RIL_PARAM_SI_ADDRESSID;

            // Increment the array index
            nUsed++;
        }
    }
#endif

    pBlob = (void*)rgrsi;
    cbBlob = nUsed * sizeof(RILSUBSCRIBERINFO);

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


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

    if (!QueueCmd(pHandle, "AT+CNUM\r", CMDOPT_NONE, APIID_GETSUBSCRIBERNUMBERS, ParseGetSubscriberNumbers, NULL, hr)) {
        hr = E_FAIL;
        goto Error;
    }

//add by fengguisen for Simultaneous voice and data call
{
       DWORD CallType = RIL_SYSTEMCAPS_VOICEDATA ;
	CRilHandle * pRILHandle = pHandle->GetDevice();
       if(pRILHandle && pRILHandle->BroadcastRealBlobNotification(RIL_NOTIFY_SYSTEMCAPSCHANGED, &CallType, sizeof(CallType)))
       {
              RETAILMSG(1, (TEXT("[TI] OK:broadcast simultaneous data and voice connections\r\n")));
       }
       else
       {
              RETAILMSG(1, (TEXT("[TI] ERROR:broadcast simultaneous data and voice connections\r\n")));
       }
}
//end add
Error:
    return hr;
}


//
//
//
static HRESULT ParseGetOperatorList(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetOperatorList);
    UINT nValue;
    UINT nAccessType;
    UINT nUsed = 0;
    UINT nAllocated = 0;
    RILOPERATORINFO* rgroi = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    // Parse "<prefix>+COPS: "
    if (!ParseRspPrefix(szRsp, szRsp) ||
        !MatchStringBeginning(szRsp, "+COPS: ", szRsp)) {
// If we don't get anything back, just return S_OK with pBlob=NULL and cbBlob=0.
//        hr = E_FAIL;
        goto Error;
    }

    // Parse "("
    while (MatchStringBeginning(szRsp, "(", szRsp)) {
        if (nUsed == nAllocated) {
            if (!AllocateOrReallocateStorage((BYTE**)&rgroi, sizeof(RILOPERATORINFO), nUsed, &nAllocated, NETWK_ALLOC_NUMBER)) {
                hr = E_OUTOFMEMORY;
                goto Error;
            }
        }

        memset(&rgroi[nUsed], 0x00, sizeof(RILOPERATORINFO));
        rgroi[nUsed].cbSize = sizeof(RILOPERATORINFO);
        rgroi[nUsed].ronNames.cbSize = sizeof(RILOPERATORNAMES);

        // Parse "<stat>"
        if (!ParseUInt(szRsp, TRUE, nValue, szRsp)) {
            goto Continue;
        }
        if (NUM_OPERSTATS > nValue) {
            rgroi[nUsed].dwStatus = g_rgdwOperStats[nValue];
        } else {
            rgroi[nUsed].dwStatus = RIL_OPSTATUS_UNKNOWN;
        }
        rgroi[nUsed].dwParams |= RIL_PARAM_OI_STATUS;

        // Parse ",<long_name>"
        if (!MatchStringBeginning(szRsp, ",", szRsp)  ||
            !ParseString(szRsp, rgroi[nUsed].ronNames.szLongName, MAXLENGTH_OPERATOR_LONG, szRsp)) {
            goto Continue;
        }
        if (*rgroi[nUsed].ronNames.szLongName) {
            rgroi[nUsed].ronNames.dwParams |= RIL_PARAM_ON_LONGNAME;
            rgroi[nUsed].dwParams |= RIL_PARAM_OI_NAMES;
        }

        // Parse ",<short_name>"
        if (!MatchStringBeginning(szRsp, ",", szRsp)  ||
            !ParseString(szRsp, rgroi[nUsed].ronNames.szShortName, MAXLENGTH_OPERATOR_SHORT, szRsp)) {
            goto Continue;
        }
        if (*rgroi[nUsed].ronNames.szShortName) {
            rgroi[nUsed].ronNames.dwParams |= RIL_PARAM_ON_SHORTNAME;
            rgroi[nUsed].dwParams |= RIL_PARAM_OI_NAMES;
        }

        // Parse ",<num_name>"
        if (!MatchStringBeginning(szRsp, ",", szRsp)               ||
            !ParseString(szRsp, rgroi[nUsed].ronNames.szNumName, MAXLENGTH_OPERATOR_NUMERIC, szRsp)) {
            goto Continue;
        }

        if (*rgroi[nUsed].ronNames.szNumName) {
            rgroi[nUsed].ronNam

⌨️ 快捷键说明

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