📄 network.cpp
字号:
#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 + -