📄 caps.cpp
字号:
prstnc->dwSendSMS = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
prstnc->dwPlayTone = RIL_SIMTKN_MEIMPLEMENTS;
prstnc->dwDisplayText = RIL_SIMTKN_MEIMPLEMENTS;
prstnc->dwGetInkey = RIL_SIMTKN_MEIMPLEMENTS;
prstnc->dwGetInput = RIL_SIMTKN_MEIMPLEMENTS;
prstnc->dwSelectItem = RIL_SIMTKN_MEIMPLEMENTS;
prstnc->dwSetupMenu = RIL_SIMTKN_MEIMPLEMENTS;
prstnc->dwSetupIdleModeText = RIL_SIMTKN_MEIMPLEMENTS;
prstnc->dwLocalInfo = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
prstnc->dwSetupEventList = RIL_SIMTKN_MEIMPLEMENTS;
#ifdef OEM2_SIMTOOLKIT
prstnc->dwSendDTMF = RIL_SIMTKN_RADIOIMPLEMENTS_REQUESTMEINPUT;
#else
prstnc->dwSendDTMF = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
#endif
prstnc->dwSendDTMF = RIL_SIMTKN_RADIOIMPLEMENTS_REQUESTMEINPUT;
prstnc->dwLaunchBrowser = RIL_SIMTKN_MEIMPLEMENTS;
prstnc->dwOpenChannel = RIL_SIMTKN_RADIOIMPLEMENTS_REQUESTMEINPUT;
prstnc->dwCloseChannel = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
prstnc->dwReceiveData = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
prstnc->dwSendData = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
prstnc->dwTimerManagement = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
prstnc->dwRunAtCmd = RIL_SIMTKN_RADIOIMPLEMENTS_NOTIFICATION;
prstnc->dwNotifyFlags = (RIL_CAPS_NOTIFY_SIMTOOLKITCMD |
RIL_CAPS_NOTIFY_SIMTOOLKITCALLSETUP |
RIL_CAPS_NOTIFY_SIMTOOLKITEVENT);
prstec = &(prstnc->rstecEvents);
prstec->cbSize = sizeof(RILSIMTOOLKITEVENTCAPS);
prstec->dwParams = RIL_PARAM_SIMTKE_ALL;
prstec->dwMTCall = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
prstec->dwCallConnected = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
prstec->dwCallDisconnected = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
prstec->dwLocationStatus = RIL_SIMTKN_RADIOIMPLEMENTS_NONOTIFICATION;
prstec->dwUserActivity = RIL_SIMTKN_MEIMPLEMENTS;
prstec->dwIdleScreen = RIL_SIMTKN_MEIMPLEMENTS;
prstec->dwLanguageSelection = RIL_SIMTKN_MEIMPLEMENTS;
prstec->dwBrowserTermination = RIL_SIMTKN_NOSUPPORT;
prstec->dwDataAvailable = RIL_SIMTKN_NOSUPPORT;
prstec->dwChannelStatus = RIL_SIMTKN_NOSUPPORT;
prstec->dwDisplayChange = RIL_SIMTKN_NOSUPPORT;
pBlob = (void*)prstnc;
cbBlob = sizeof(RILSIMTOOLKITNOTIFYCAPS);
Error:
if (FAILED(hr)) {
FreeBlob(prstnc);
}
#else // defined(OEM1_DRIVER) || defined(OEM2_SIMTOOLKIT)
HRESULT hr = E_NOTIMPL;
#endif // defined(OEM1_DRIVER) || defined(OEM2_SIMTOOLKIT)
return hr;
}
//
//
//
static HRESULT ParseGetSignalQualityImplemenation(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseGetSignalQualityImplemenation);
HRESULT hr = S_OK;
DWORD * pdwSignalQualityImplCaps = NULL;
pBlob = NULL;
cbBlob = 0;
pdwSignalQualityImplCaps = (DWORD *)AllocBlob(sizeof(DWORD));
if (!pdwSignalQualityImplCaps) {
hr = E_OUTOFMEMORY;
goto Error;
}
#if defined(OEM1_CSQ_NOTIFICATION) || defined(OEM2_DRIVER)
// OEM2 supports signal quality notifications.
*pdwSignalQualityImplCaps = RIL_CAPS_SIGNALQUALITY_NOTIFICATION;
#else
// Currently, all other radios support polling only.
*pdwSignalQualityImplCaps = RIL_CAPS_SIGNALQUALITY_POLLING;
#endif
pBlob = (void*)pdwSignalQualityImplCaps;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdwSignalQualityImplCaps);
}
return hr;
}
//
//
//
static HRESULT ParseGetDevCapsSIMSupport(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseGetDevCapsSIMSupport);
HRESULT hr = S_OK;
DWORD * pdwSimSupportCaps = NULL;
pBlob = NULL;
cbBlob = 0;
pdwSimSupportCaps = (DWORD *)AllocBlob(sizeof(DWORD));
if (!pdwSimSupportCaps) {
hr = E_OUTOFMEMORY;
goto Error;
}
// GSM devices have SIM support.
*pdwSimSupportCaps = RIL_CAPS_SIM_BASIC;
pBlob = (void*)pdwSimSupportCaps;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdwSimSupportCaps);
}
return hr;
}
//
//
//
static HRESULT ParseGetCallProgressNotification(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
TBD_FUNCTION(ParseGetCallProgressNotification);
HRESULT hr = S_OK;
DWORD * pdwCallProgressNotification = NULL;
pBlob = NULL;
cbBlob = 0;
pdwCallProgressNotification = (DWORD *)AllocBlob(sizeof(DWORD));
if (!pdwCallProgressNotification) {
hr = E_OUTOFMEMORY;
goto Error;
}
#if defined(OEM1_DRIVER) || defined(OEM2_DRIVER)
// OEM1 supports call progress notifications, adding OEM2
*pdwCallProgressNotification = true;
#else
*pdwCallProgressNotification = false;
#endif
pBlob = (void*)pdwCallProgressNotification;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdwCallProgressNotification);
}
return hr;
}
#if defined(OEM1_DRIVER)
static HRESULT ParseGetNITZSupported(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseGetNITZSupported);
UINT nValue;
HRESULT hr = E_FAIL;
DWORD * pdwNITZNotificationSetting = NULL;
pBlob = NULL;
cbBlob = 0;
pdwNITZNotificationSetting = (DWORD *)AllocBlob(sizeof(DWORD));
if (!pdwNITZNotificationSetting) {
hr = E_OUTOFMEMORY;
goto Error;
}
// Parse "<prefix>"
if (!ParseRspPrefix(szRsp, szRsp)) {
goto Error;
}
// Parse "%CTZV: "
if (MatchStringBeginning(szRsp, "%CTZV: ", szRsp))
{
if (ParseUInt(szRsp, FALSE, nValue, szRsp))
{
hr = S_OK;
if ( 0 == nValue )
{
*pdwNITZNotificationSetting = RIL_CAPS_NITZ_DISABLED;
}
else
{
*pdwNITZNotificationSetting = RIL_CAPS_NITZ_ENABLED;
}
pBlob = (void*)pdwNITZNotificationSetting;
cbBlob = sizeof(DWORD);
}
}
Error:
if (FAILED(hr)) {
FreeBlob(pdwNITZNotificationSetting);
}
return hr;
}
#endif
//
//
//
HRESULT RILDrv_GetDevCaps(DWORD dwParam, DWORD dwCapsType)
{
FUNCTION_TRACE(RILDrv_GetDevCaps);
HRESULT hr = S_OK;
LPCSTR szCmd = NULL;
DWORD dwOptions = CMDOPT_NONE;
PFN_CMD_PARSE pfnParse = NULL;
BOOL fSpoofed = FALSE;
CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
if (!pHandle) {
hr = E_FAIL;
goto Error;
}
switch (dwCapsType)
{
case RIL_CAPSTYPE_DIAL:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetDevCapsDial;
break;
case RIL_CAPSTYPE_DTMFDURATIONRANGE:
szCmd = "AT+VTD=?\r";
pfnParse = ParseGetDevCapsDTMFDurationRange;
break;
case RIL_CAPSTYPE_CALLMGTCMDS:
szCmd = "AT+CHLD=?\r";
pfnParse = ParseGetDevCapsCallMgtCmds;
break;
case RIL_CAPSTYPE_BEARERSERVICE:
szCmd = "AT+CBST=?\r";
pfnParse = ParseGetDevCapsBearerSvc;
break;
case RIL_CAPSTYPE_RLP:
szCmd = "AT+CRLP=?\r";
pfnParse = ParseGetDevCapsRLP;
break;
case RIL_CAPSTYPE_EQUIPMENTSTATES:
szCmd = "AT+CFUN=?\r";
pfnParse = ParseGetDevCapsEquipmentStates;
break;
case RIL_CAPSTYPE_PBSTORELOCATIONS:
szCmd = "AT+CPBS=?\r";
pfnParse = ParseGetDevCapsPBStoreLocs;
break;
case RIL_CAPSTYPE_PBINDEXRANGE:
szCmd = "AT+CPBR=?\r";
pfnParse = ParseGetDevCapsPBIndexRange;
break;
case RIL_CAPSTYPE_PBENTRYLENGTH:
szCmd = "AT+CPBF=?\r";
pfnParse = ParseGetDevCapsPBEntryLength;
break;
case RIL_CAPSTYPE_MSGSERVICETYPES:
szCmd = "AT+CSMS=?\r";
pfnParse = ParseGetDevCapsMsgSvcTypes;
break;
case RIL_CAPSTYPE_MSGMEMORYLOCATIONS:
szCmd = "AT+CPMS=?\r";
pfnParse = ParseGetDevCapsMsgMemoryLocs;
break;
case RIL_CAPSTYPE_BROADCASTMSGLANGS:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetDevCapsBroadcastMsgLangs;
break;
case RIL_CAPSTYPE_MSGCONFIGINDEXRANGE:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetDevCapsMsgConfigIndexRange;
break;
case RIL_CAPSTYPE_MSGSTATUSVALUES:
szCmd = "AT+CMGL=?\r";
pfnParse = ParseGetDevCapsMsgStatusValues;
break;
case RIL_CAPSTYPE_PREFOPINDEXRANGE:
szCmd = "AT+CPOL=?\r";
pfnParse = ParseGetDevCapsPrefOpIndexRange;
break;
case RIL_CAPSTYPE_LOCKFACILITIES:
#ifdef RIL_RADIO_RESILIENCE
if (ShouldSpoofCommand() && g_cbLastLockCapsSize)
{
fSpoofed = TRUE;
void *pLockCaps = AllocBlob(g_cbLastLockCapsSize);
if (!pLockCaps) {
hr = E_OUTOFMEMORY;
goto Error;
}
hr = pHandle->GetDevice()->GetNextCmdID();
memcpy(pLockCaps, g_pLastLockCaps, g_cbLastLockCapsSize);
pHandle->Notify(RIL_RESULT_OK, hr, pLockCaps, g_cbLastLockCapsSize);
}
else
#endif
{
szCmd = "AT+CLCK=?\r";
pfnParse = ParseGetDevCapsLockFacilities;
}
break;
case RIL_CAPSTYPE_LOCKINGPWDLENGTHS:
szCmd = "AT+CPWD=?\r";
pfnParse = ParseGetDevCapsLockPwdLengths;
break;
case RIL_CAPSTYPE_BARRTYPES:
szCmd = "AT+CLCK=?\r";
pfnParse = ParseGetDevCapsBarrTypes;
break;
case RIL_CAPSTYPE_BARRINGPWDLENGTHS:
szCmd = "AT+CPWD=?\r";
pfnParse = ParseGetDevCapsBarrPwdLengths;
break;
case RIL_CAPSTYPE_FORWARDINGREASONS:
szCmd = "AT+CCFC=?\r";
pfnParse = ParseGetDevCapsFwdReasons;
break;
case RIL_CAPSTYPE_INFOCLASSES:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetDevCapsInfoClasses;
break;
case RIL_CAPSTYPE_HSCSD:
#ifdef WAVECOM_DRIVER
// HW-SPECIFIC: WaveCom hardware doesn't support AT+CHSD and AT+CHSN
hr = E_NOTIMPL;
goto Error;
#else // WAVECOM_DRIVER
szCmd = "AT+CHSD;+CHSN=?\r";
pfnParse = ParseGetDevCapsHSCSD;
break;
#endif // WAVECOM_DRIVER
case RIL_CAPSTYPE_SIMTOOLKITNOTIFICATIONS:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetDevCapsSimToolkitNotifications;
break;
case RIL_CAPSTYPE_GPRSCLASS:
szCmd = "AT+CGCLASS=?\r";
pfnParse = ParseGetGprsCapsClass;
break;
case RIL_CAPSTYPE_GPRSCONTEXT:
szCmd = "AT+CGDCONT=?\r";
pfnParse = ParseGetGprsCapsContext;
break;
case RIL_CAPSTYPE_GPRSQOS:
szCmd = "AT+CGQREQ=?\r";
pfnParse = ParseGetGprsCapsQOS;
break;
case RIL_CAPSTYPE_GPRSQOSMIN:
szCmd = "AT+CGQMIN=?\r";
pfnParse = ParseGetGprsCapsQOSMin;
break;
case RIL_CAPSTYPE_GPRSMOSMS:
szCmd = "AT+CGSMS=?\r";
pfnParse = ParseGetGprsCapsSMOSMS;
break;
case RIL_CAPSTYPE_DATACOMPRESSION:
szCmd = "AT+DS=?\r";
pfnParse = ParseGetDevCapsDataCompression;
break;
case RIL_CAPSTYPE_ERRORCORRECTION:
szCmd = "AT+ES=?\r";
pfnParse = ParseGetDevCapsErrorCorrection;
break;
case RIL_CAPSTYPE_SIGNALQUALITYIMPLEMENTATION:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetSignalQualityImplemenation;
break;
case RIL_CAPSTYPE_SIMSUPPORT:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetDevCapsSIMSupport;
break;
case RIL_CAPSTYPE_CALLPROGRESSNOTIFICATION:
//#ifdef OEM1_DRIVER // may want to actually ask in the future - for now assume all OEM1 radios support this
// szCmd = "AT+CPI?\r";
//#else
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
//#endif
pfnParse = ParseGetCallProgressNotification;
break;
case RIL_CAPSTYPE_NITZNOTIFICATION:
#ifdef OEM1_DRIVER // may want to actually ask in the future - for now assume all OEM1 radios support this
szCmd = "AT%CTZV?\r";
pfnParse = ParseGetNITZSupported;
#else
hr = E_NOTIMPL;
goto Error;
#endif
break;
default:
hr = E_INVALIDARG;
goto Error;
}
if (!fSpoofed)
if (!QueueCmd(pHandle, szCmd, dwOptions, APIID_GETDEVCAPS, pfnParse, NULL, hr)) {
hr = E_FAIL;
goto Error;
}
Error:
return hr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -