📄 response.cpp
字号:
cchUsed);
}
else
{
// Coding scheme is not GSM unpacked or UCS2
goto Exit;
}
if (fConvertSucceeded)
{
if (cchUsed > dwSize)
{
// Overflow on text buffer! Truncating text.
cchUsed = dwSize;
}
// null terminate
wszText[cchUsed] = L'\0';
// RIL driver only supports PSTR's for Operator Names.
// Convert the Unicode text to an ANSI string as best possible.
StringCchCopyA(szOut, dwSize, AnsiString(wszText));
fRet = TRUE;
}
Exit:
if (NULL != wszText)
{
delete[] wszText;
}
return fRet;
}
void StartPlmnNameRead()
{
RETAILMSG(1, (TEXT("########################## start of PLMN READ\r\n")));
DWORD dwPlmnNameFileId;
BOOL fReadCphsFile = TRUE;
BOOL fReadPnnFile = TRUE;
DWORD dwUseCphsPlmnName = 0;
char *cptr = NULL;
HRESULT hr = E_FAIL;
DWORD dwSize = 0,cbSName =0;
#ifdef DISPLAY_SPN
#define SPNNAMEMAXLENTH 34
byte displaycondition;
dwPlmnNameFileId = 0x6f46; // CPHS Operator Name String
SPNStatus k( dwPlmnNameFileId );
hr = k.Read();
k.Dump();
if ( SUCCEEDED( hr ) )
{
RILSIMRECORDSTATUS rsrs = k.GetStatus();
if ( rsrs.dwParams & RIL_PARAM_SRS_SIZE )
{
SPNRecord kk( dwPlmnNameFileId, rsrs.dwSize );
hr = kk.Read();
kk.Dump();
if ( SUCCEEDED( hr ) )
{
byte *m_ptr = new byte[ rsrs.dwSize+1 ];
if ( m_ptr != NULL )
{
dwSize = rsrs.dwSize;
BOOL fOk = kk.GetRecord((byte*)m_ptr, dwSize );
if ( fOk )
{
WCHAR SPNName[SPNNAMEMAXLENTH+1];
byte pchOut[SPNNAMEMAXLENTH+1];
DWORD i=0,j=0;
for(i=0;i<dwSize;i++)
{
if(m_ptr[i]!=0xff)
{
pchOut[j++]= m_ptr[i];
RETAILMSG(1,(TEXT("************SPNName[%d]:%c***********\r\n"),(j-1),pchOut[j-1]));
}
}
pchOut[j] = '\0';
cbSName =j;
displaycondition = pchOut[0];
memset(SPNName,0,sizeof(SPNName));
if(pchOut[1]<0x80) //default gsm
{
MultiByteToWideChar(CP_ACP, 0, (char*)&pchOut[1], SPNNAMEMAXLENTH, SPNName, SPNNAMEMAXLENTH);
}
if(pchOut[1] ==0x80) // uncode
{
WCHAR chHigh=0,chLow = 0;
j=0;
for(DWORD i =0;i<cbSName-2; i = i+2)
{
chHigh =pchOut[2+i];
chHigh =chHigh << 8;
chHigh =chHigh & 0xFF00;
chLow =pchOut[2+i+1];
chLow = chLow & 0x00FF;
SPNName[j++] = (WCHAR)( chHigh | chLow );
}
SPNName[j] = L'\0';
}
// Now don't deal with the case when (codec == 0x81 or 0x82)
else
{
displaycondition = 0;
}
/*
refer to 3gpp 1111-8a0.doc
b1=0: display of registered PLMN not required
b1=1: display of registered PLMN required
*/
if(displaycondition!=0)
{
if( !SetRegistrySZ(HKEY_LOCAL_MACHINE, TEXT("System\\CardInfo\\Card2"), TEXT("SPNNAME"), SPNName) )
{
RETAILMSG(1, (TEXT("[TI]ParseGetCurrentSPNname SET SpnName failed!\r\n")));
}
else
{
RETAILMSG(1, (TEXT("[TI]ParseGetCurrentspnname SET SpnName succeeded!value is %s \r\n"),SPNName));
}
}
}
if ( m_ptr != NULL )
{
delete[] m_ptr;
m_ptr = NULL;
}
}
}
}
}
#endif
dwPlmnNameFileId = 0x6FC5;
if (GetRegistryDWORD(
HKEY_LOCAL_MACHINE,
g_tszRegKeyRIL,
TEXT("UseCphsPlmnName"),
&dwUseCphsPlmnName))
{
if (0 == dwUseCphsPlmnName)
{
fReadCphsFile = FALSE;
}
else
{
fReadPnnFile = FALSE;
}
}
if ( g_pcszCPHS != NULL )
{
delete[] g_pcszCPHS;
g_pcszCPHS = NULL;
}
if (fReadPnnFile)
{
CPHSStatus statusPnnFile(dwPlmnNameFileId);
hr = statusPnnFile.Read();
statusPnnFile.Dump();
if (SUCCEEDED(hr))
{
RILSIMRECORDSTATUS rsrsPnn = statusPnnFile.GetStatus();
if (RIL_PARAM_SRS_ALL == (RIL_PARAM_SRS_ALL & rsrsPnn.dwParams) &&
RIL_SIMRECORDTYPE_LINEAR == rsrsPnn.dwRecordType &&
0 < rsrsPnn.dwItemCount)
{
CPHSRecord recPnnFile(
dwPlmnNameFileId,
rsrsPnn.dwSize,
CPHSRecord::READ_RECORD,
1);
hr = recPnnFile.Read();
recPnnFile.Dump();
if (SUCCEEDED(hr))
{
dwSize = rsrsPnn.dwSize;
cptr = new char[dwSize+1];
if (ParsePnnNameRecord(recPnnFile, cptr, dwSize))
{
if (NULL != g_pcszCPHS)
{
delete[] g_pcszCPHS;
}
g_pcszCPHS = cptr;
g_cphschange = TRUE;
cptr = NULL;
}
else
{
hr = E_FAIL;
}
if ( cptr != NULL )
{
delete[] cptr;
cptr = NULL;
}
}
}
}
}
if (fReadCphsFile && FAILED(hr))
{
dwPlmnNameFileId = 0x6f14; // CPHS Operator Name String
CPHSStatus k( dwPlmnNameFileId );
hr = k.Read();
k.Dump();
if ( SUCCEEDED( hr ) )
{
RILSIMRECORDSTATUS rsrs = k.GetStatus();
if ( rsrs.dwParams & RIL_PARAM_SRS_SIZE )
{
CPHSRecord kk( dwPlmnNameFileId, rsrs.dwSize );
hr = kk.Read();
kk.Dump();
if ( SUCCEEDED( hr ) )
{
cptr = new char[ rsrs.dwSize+1 ];
if ( cptr != NULL )
{
dwSize = rsrs.dwSize;
BOOL fOk = kk.GetRecord( (BYTE*)cptr, dwSize );
if ( fOk )
{
cptr[dwSize] = NULL;
/* mark end-of-record */
char *x = strchr( cptr, (char)0xFF );
if ( x != NULL )
{
*x = NULL;
}
x = NULL;
#ifdef RIL_FIX_CMCC_NETWORK_ISSUE
memset(cptr,0x00,rsrs.dwSize+1);
#endif
if (NULL != g_pcszCPHS)
{
delete[] g_pcszCPHS;
}
g_pcszCPHS = cptr;
g_cphschange = TRUE;
cptr = NULL;
}
if ( cptr != NULL )
{
delete[] cptr;
cptr = NULL;
}
}
}
}
}
}
RETAILMSG(1, (TEXT("[TI]############################ end of CPHS READ\r\n")));
}
#ifdef RIL_ENABLE_EONS
void StartEONSRead()
{
RETAILMSG(1, (TEXT("[TI]########################## start of EONS READ\r\n")));
g_eons.Read();
while( !g_eons.Ready() )
{
Sleep( 100 );
}
RETAILMSG(1, (TEXT("[TI]############################ end of EONS READ\r\n")));
g_eons.Dump();
/* we need to trigger an update */
g_eonschange = TRUE;
/* update cache */
EONSCache cache( g_eons );
cache.Write();
/* sync the global cache object */
g_eonscache.Invalidate();
g_eonscache.Read();
}
#endif
#ifdef OEM1_DRIVER
static DWORD WINAPI StartSIMRecordReadThreadCB( LPVOID lpThreadData )
{
StartPlmnNameRead();
#ifdef RIL_ENABLE_EONS
StartEONSRead();
#endif
return 0;
}
static void StartSIMRecordReadThread()
{
/* do not block current thread -- do the SIM record read in another thread */
HANDLE hThread = CreateThread(NULL, 0, &StartSIMRecordReadThreadCB, 0, 0, NULL);
if ( hThread != NULL )
{
CloseHandle( hThread );
hThread = NULL;
}
}
#endif
//
// CME error mapping table must be in left hand sorted order
//
static const ERRORMAP g_rgemCMEErrors[] =
{
{ RIL_E_PHONEFAILURE, 0},
{ RIL_E_NOCONNECTION, 1},
{ RIL_E_LINKRESERVED, 2},
{ RIL_E_OPNOTALLOWED, 3},
{ RIL_E_OPNOTSUPPORTED, 4},
{ RIL_E_PHSIMPINREQUIRED, 5},
{ RIL_E_PHFSIMPINREQUIRED, 6},
{ RIL_E_PHFSIMPUKREQUIRED, 7},
{ RIL_E_SIMNOTINSERTED, 10},
{ RIL_E_SIMPINREQUIRED, 11},
{ RIL_E_SIMPUKREQUIRED, 12},
{ RIL_E_SIMFAILURE, 13},
{ RIL_E_SIMBUSY, 14},
{ RIL_E_SIMWRONG, 15},
{ RIL_E_INCORRECTPASSWORD, 16},
{ RIL_E_SIMPIN2REQUIRED, 17},
{ RIL_E_SIMPUK2REQUIRED, 18},
{ RIL_E_MEMORYFULL, 20},
{ RIL_E_INVALIDINDEX, 21},
{ RIL_E_NOTFOUND, 22},
{ RIL_E_MEMORYFAILURE, 23},
{ RIL_E_TEXTSTRINGTOOLONG, 24},
{ RIL_E_INVALIDTEXTSTRING, 25},
{ RIL_E_DIALSTRINGTOOLONG, 26},
{ RIL_E_INVALIDDIALSTRING, 27},
{ RIL_E_NONETWORKSVC, 30},
{ RIL_E_NETWORKTIMEOUT, 31},
{ RIL_E_EMERGENCYONLY, 32},
{ RIL_E_NETWKPINREQUIRED, 40},
{ RIL_E_NETWKPUKREQUIRED, 41},
{ RIL_E_SUBSETPINREQUIRED, 42},
{ RIL_E_SUBSETPUKREQUIRED, 43},
{ RIL_E_SVCPINREQUIRED, 44},
{ RIL_E_SVCPUKREQUIRED, 45},
{ RIL_E_CORPPINREQUIRED, 46},
{ RIL_E_CORPPUKREQUIRED, 47},
#if defined(OEM1_DRIVER) || defined(OEM2_DRIVER)
{ RIL_E_PHONEFAILURE, 100},
#endif
#if defined(OEM1_DRIVER)
{ RIL_E_TIMEDOUT, 512},
#endif
{ RIL_E_NOTREADY, 515},
};
#define NUM_CMEERRORS (sizeof(g_rgemCMEErrors) / sizeof(ERRORMAP))
#ifdef RIL_RADIO_RESILIENCE
//
// CME GPRS error mapping table must be in left hand sorted order
//
static const ERRORMAP g_rgemGPRSCMEErrors[] =
{
{ RIL_E_ILLEGALMS, 103},
{ RIL_E_ILLEGALME, 106},
{ RIL_E_GPRSSERVICENOTALLOWED, 107},
{ RIL_E_PLMNNOTALLOWED, 111},
{ RIL_E_LOCATIONAREANOTALLOWED, 112},
{ RIL_E_ROAMINGNOTALLOWEDINTHISLOCATIONAREA, 113},
{ RIL_E_SERVICEOPTIONNOTSUPPORTED, 132},
{ RIL_E_REQUESTEDSERVICEOPTIONNOTSUBSCRIBED, 133},
{ RIL_E_SERVICEOPTIONTEMPORARILYOUTOFORDER, 134},
{ RIL_E_UNSPECIFIEDGPRSERROR, 148},
{ RIL_E_PDPAUTHENTICATIONFAILURE, 149},
{ RIL_E_INVALIDMOBILECLASS, 150},
};
#define NUM_GPRSCMEERRORS (sizeof(g_rgemGPRSCMEErrors) / sizeof(ERRORMAP))
#endif // RIL_RADIO_RESILIENCE
//
// CMS error mapping table must be in left hand sorted order
//
static const ERRORMAP g_rgemCMSErrors[] =
{
{ RIL_E_UNASSIGNEDNUMBER, 1},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -