📄 caps.cpp
字号:
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;
prstnc->dwSendDTMF = g_rppPDDParams->dwDevCapsSIMTKN_SendDTMF;
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);
}
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;
}
*pdwSignalQualityImplCaps = RIL_CAPS_SIGNALQUALITY_NOTIFICATION;
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;
}
*pdwCallProgressNotification = true;
pBlob = (void*)pdwCallProgressNotification;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdwCallProgressNotification);
}
return hr;
}
//
//
//
static HRESULT ParseGetNotificationImplemenation(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseGetNotificationImplemenation);
HRESULT hr = S_OK;
DWORD * pdwNotificationImplCaps = 0;
pBlob = NULL;
cbBlob = 0;
pdwNotificationImplCaps = (DWORD *)AllocBlob(sizeof(DWORD));
if (!pdwNotificationImplCaps) {
hr = E_OUTOFMEMORY;
goto Error;
}
*pdwNotificationImplCaps = 0;
if (!GetRegistryDWORD(HKEY_LOCAL_MACHINE, RIL_CAPS_NOTIFICATION_KEY, RIL_CAPS_NOTIFICATION_IMPL_PARAMS, pdwNotificationImplCaps)) {
DEBUGMSG(ZONE_ERROR, (TEXT("RIL : E : ParseGetNotificationImplemenation - Failed to read NotificationImplCaps from registry. \r\n")));
}
pBlob = (void*)pdwNotificationImplCaps;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdwNotificationImplCaps);
}
return hr;
}
//
//
//
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;
char szCmdBuf[ MAX_PATH ];
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:
szCmd = "AT+CHSD;+CHSN=?\r";
pfnParse = ParseGetDevCapsHSCSD;
break;
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:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetCallProgressNotification;
break;
case RIL_CAPSTYPE_NOTIFICATIONIMPLEMENTATION:
szCmd = NULL;
dwOptions = CMDOPT_NOOP;
pfnParse = ParseGetNotificationImplemenation;
break;
case RIL_CAPSTYPE_NITZNOTIFICATION:
if ( !(g_rppPDDParams->pfnParseGetNITZSupported) )
{
hr = E_NOTIMPL;
goto Error;
}
SAFE_PDD_CREATECOMMAND( szCmdBuf, ARRAYSIZE(szCmdBuf), hr, PDD_CreateCommand_GetNITZSupported( szCmdBuf, ARRAYSIZE(szCmdBuf) ) );
if ( FAILED( hr ) )
{
goto Error;
}
szCmd = szCmdBuf;
pfnParse = g_rppPDDParams->pfnParseGetNITZSupported;
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 + -