📄 rilhandndisoem1.cpp
字号:
HRESULT
CPdpContext::GetGPRSContextActivatedList(void)
{
HRESULT Result;
Result = S_OK;//AsyncRequestIssue((RIL_FUNCTION)RIL_GetGPRSContextActivatedList, NULL, NULL, CRilRequestTypeGetGPRSContextActivatedList, Arg);
return Result;
}
HRESULT
CPdpContext::GetGPRSAddress(
IN DWORD ContextID)
{
FUNCTION_TRACE(RILDrv_GetGPRSAddress);
HRESULT Result = S_OK;
// Build command
char Cmd[MAX_PATH];
(void)_snprintfz(Cmd, MAX_PATH, "AT+CGPADDR=%u\r", ContextID);
if (!QueueCmdIgnoreRspWithData(APIID_GETGPRSADDRESS, // appiid
Cmd, // szCmd
CMDOPT_FORCEPARSE, // dwOptions
20000, // dwTimeout
NULL, // Parse fn
NULL, // Ptr to notification data
0, // dwRetries
0, // dwRetriesOnError
0, // dwRetryOnErrorDelay
CRilParseGetGPRSAddress,//parse fn with data
this )) // Data )) // dwRetryOnErrorDelay
{
Result = E_FAIL;
}
return Result;
}
//
//
//
HRESULT
CPdpContext::DevSpecific(
IN BYTE* pParams, // @parm parameters for the operation to be performed
IN DWORD Size, // @parm size of the data pointed to by <p lpParams> in bytes
IN BOOL IgnoreResponse
)
{
PFN_CMD_PARSE_DATA pFnCmdParseData = NULL;
HRESULT Result = S_OK;
char Cmd[MAX_PATH];
if (!pParams)
{
Result = E_FAIL;
goto Error;
}
DEBUGCHK(NULL != pParams);
DEBUGCHK(Size > 0);
if ( Size != sizeof(RILATCOMMAND))
{
Result = E_NOTIMPL;
goto Error;
}
if ( Size == sizeof(RILATCOMMAND) )
{
LPRILATCOMMAND pRilATCommand = (LPRILATCOMMAND)pParams;
if ( pRilATCommand && pRilATCommand->Size == sizeof(*pRilATCommand))
{
switch ( pRilATCommand->Operation)
{
case CRilATCommandTypeCGPCO:
{
LPRILATCGPCO pRilCGPCO = (LPRILATCGPCO)pRilATCommand->pData;
if (!pRilCGPCO)
{
Result = E_FAIL;
goto Error;
}
if ( pRilCGPCO->Size == sizeof(*pRilCGPCO) )
{
// Build command
char ATCommand[] = "AT%CGPCO=";
if ( 0 == pRilCGPCO->Mode)// Set
{
pFnCmdParseData = IgnoreResponse ? NULL : CRilParseSetCGPCO;
(void)_snprintfz(Cmd, MAX_PATH, "%s%u,1,\"%s\",%u\r",ATCommand,pRilCGPCO->Mode,pRilCGPCO->ProtocolOptions, pRilCGPCO->ContextID);
if (!QueueCmdIgnoreRspWithData(APIID_GETGPRSADDRESS, // appiid
Cmd, // szCmd
CMDOPT_FORCEPARSE, // dwOptions
20000, // dwTimeout
NULL, // Parse fn
NULL, // Ptr to notification data
0, // dwRetries
0, // dwRetriesOnError
0, // dwRetryOnErrorDelay
pFnCmdParseData,//parse fn with data
this )) // Data )) // dwRetryOnErrorDelay
{
Result = E_FAIL;
goto Error;
}
}
else // Query
{
pFnCmdParseData = IgnoreResponse ? NULL : CRilParseGetCGPCO;
(void)_snprintfz(Cmd, MAX_PATH, "%s%u,1,,%u\r",ATCommand,pRilCGPCO->Mode,pRilCGPCO->ContextID);
if (!QueueCmdIgnoreRspWithData(APIID_GETGPRSADDRESS, // appiid
Cmd, // szCmd
CMDOPT_FORCEPARSE, // dwOptions
20000, // dwTimeout
NULL, // Parse fn
NULL, // Ptr to notification data
0, // dwRetries
0, // dwRetriesOnError
0, // dwRetryOnErrorDelay
pFnCmdParseData,//parse fn with data
this )) // Data )) // dwRetryOnErrorDelay
{
Result = E_FAIL;
goto Error;
}
}
}
else
{
Result = E_FAIL;
}
}
break;
case CRilATCommandTypeDATA:
{
LPRILATDATA pRilData = (LPRILATDATA)pRilATCommand->pData;
if (!pRilData)
{
Result = E_FAIL;
goto Error;
}
if ( pRilData->Size == sizeof(*pRilData) )
{
pFnCmdParseData = IgnoreResponse ? NULL : CRilParseDATA;
// Build command
char ATCommand[] = "AT%DATA=";
(void)_snprintfz(Cmd, MAX_PATH, "%s%u,\"%s\",%u,%u,\"%s\",\"%s\",%u,%u,%u\r",
ATCommand,
pRilData->Mode,
pRilData->DestDeviceName,
pRilData->DestDeviceNum,
pRilData->DestSubNum,
pRilData->Capability,
pRilData->SrcDevName,
pRilData->SrcDevNum,
pRilData->SrcSubNum,
pRilData->ContextID);
if (!QueueCmdIgnoreRspWithData( APIID_GETGPRSADDRESS, // appiid
Cmd, // szCmd
CMDOPT_FORCEPARSE, // dwOptions
20000, // dwTimeout
NULL, // Parse fn
NULL, // Ptr to notification data
0, // dwRetries
0, // dwRetriesOnError
0, // dwRetryOnErrorDelay
pFnCmdParseData,//parse fn with data
this )) // Data )) // dwRetryOnErrorDelay
{
Result = E_FAIL;
goto Error;
}
}
else
{
Result = E_FAIL;
}
}
break;
case CRilATCommandTypeCGDATA:
{
LPRILATCGDATA pRilCGData = (LPRILATCGDATA)pRilATCommand->pData;
if (!pRilCGData)
{
Result = E_FAIL;
goto Error;
}
if ( pRilCGData->Size == sizeof(*pRilCGData) )
{
pFnCmdParseData = IgnoreResponse ? NULL : CRilParseCGDATA;
// Build command
char ATCommand[] = "AT+CGDATA=";
(void)_snprintfz(Cmd, MAX_PATH, "%s\"%s\",%u\r",ATCommand,pRilCGData->L2P,pRilCGData->ContextID);
if (!QueueCmdIgnoreRspWithData( APIID_GETGPRSADDRESS, // appiid
Cmd, // szCmd
CMDOPT_FORCEPARSE, // dwOptions
20000, // dwTimeout
NULL, // Parse fn
NULL, // Ptr to notification data
0, // dwRetries
0, // dwRetriesOnError
0, // dwRetryOnErrorDelay
pFnCmdParseData,//parse fn with data
this )) // Data )) // dwRetryOnErrorDelay
{
Result = E_FAIL;
goto Error;
}
}
else
{
Result = E_FAIL;
}
}
break;
case CRilATCommandTypeCGACT:
{
LPRILATCGACT pRilCGAct = (LPRILATCGACT)pRilATCommand->pData;
if (!pRilCGAct)
{
Result = E_FAIL;
goto Error;
}
if ( pRilCGAct->Size == sizeof(*pRilCGAct) )
{
DWORD dwOptions = CMDOPT_FORCEPARSE;
DWORD dwTimeout = pRilCGAct->ContextActivation ? 180000 : 30000;
if(FALSE == IncomingCallInProgress())
{
dwOptions |= (pRilCGAct->ContextActivation ? 0 : CMDOPT_DEACT);
}
pFnCmdParseData = IgnoreResponse ? NULL : CRilParseCGACT;
// Build command
(void)_snprintfz(Cmd, MAX_PATH, "AT+CGACT=%u,%u\r", pRilCGAct->ContextActivation ? 1 : 0, pRilCGAct->ContextID);
if (!QueueCmdIgnoreRspWithData( APIID_SETGPRSCONTEXTACTIVATED, // appiid
Cmd, // szCmd
dwOptions, // dwOptions
dwTimeout, // dwTimeout
NULL, // Parse fn
NULL, // Ptr to notification data
0, // dwRetries
0, // dwRetriesOnError
0, // dwRetryOnErrorDelay
pFnCmdParseData,//parse fn with data
this )) // Data
{
Result = E_FAIL;
goto Error;
}
}
else
{
Result = E_FAIL;
}
}
break;
default:
{
Result = E_NOTIMPL;
goto Error;
}
}
}
}
Error:
return Result;
}
void
CPdpContext::SetOpenComplete ( DWORD RilResultCode )
{
OEMNDISEVENT OemNdisEvent;
BOOL Result;
Lock();
memset(&OemNdisEvent, 0, sizeof(OEMNDISEVENT));
CeSafeCopyMemory (&OemNdisEvent.IpConfig, &m_OemNdisIpConfig, sizeof(m_OemNdisIpConfig));
OemNdisEvent.Type = OEM_NDIS_OPEN_COMPLETE;
OemNdisEvent.Status = RilResultCode;
OemNdisEvent.ContextID = m_ContextID;
Result = WriteMsgQueue(m_AppMsgQueue, &OemNdisEvent, sizeof(OemNdisEvent),INFINITE, 0 );
ASSERT ( Result );
Unlock();
}
void
CPdpContext::SetNetworkDisconnect ( BOOL GsmRegistered, BOOL GprsAttached )
{
OEMNDISEVENT OemNdisEvent;
BOOL Result;
Lock();
memset(&OemNdisEvent, 0, sizeof(OEMNDISEVENT));
OemNdisEvent.ContextID = m_ContextID;
// pOemNdisEvent->Type = OEM_NDIS_REGISTRATION_STATUS;
// pOemNdisEvent->event.regStatus.fGsmRegistered = GsmRegistered;
// pOemNdisEvent->event.regStatus.fGprsAttached = GprsAttached;
Result = WriteMsgQueue(m_AppMsgQueue, &OemNdisEvent, sizeof(OemNdisEvent),INFINITE, 0 );
ASSERT ( Result );
Unlock();
}
void
CPdpContext::SetCloseComplete ( void )
{
OEMNDISEVENT OemNdisEvent;
BOOL Result;
Lock();
memset(&OemNdisEvent, 0, sizeof(OEMNDISEVENT));
OemNdisEvent.Type = OEM_NDIS_CLOSE_COMPLETE;
OemNdisEvent.ContextID = m_ContextID;
Result = WriteMsgQueue(m_AppMsgQueue, &OemNdisEvent, sizeof(OemNdisEvent),INFINITE, 0 );
ASSERT ( Result );
Unlock();
}
void
CPdpContext::InternalIPV4GPRSAddress ( DWORD GPRSIPAddress )
{
CeSafeCopyMemory (&m_OemNdisIpConfig.ipAddress.address, &GPRSIPAddress, sizeof(GPRSIPAddress));
m_OemNdisIpConfig.ipAddress.length = 4; // bytes
}
void
CPdpContext::InternalIPV4DNS( DWORD DNS1, DWORD DNS2, DWORD Gateway )
{
CeSafeCopyMemory (&m_OemNdisIpConfig.primaryDnsAddress.address, &DNS1, sizeof(DNS1));
m_OemNdisIpConfig.primaryDnsAddress.length = 4; // bytes
CeSafeCopyMemory (&m_OemNdisIpConfig.secondaryDnsAddress.address, &DNS2, sizeof(DNS2));
m_OemNdisIpConfig.secondaryDnsAddress.length = 4; // bytes
CeSafeCopyMemory (&m_OemNdisIpConfig.gateway.address, &Gateway, sizeof(Gateway));
m_OemNdisIpConfig.gateway.length = 4; // bytes
}
DWORD
CPdpContext::ProcessObjectsThread ( void )
{
HANDLE MultipleObjects[2] = {NULL,NULL};
RILATCGACT RilCgAct;
RILATCOMMAND RilATCommand;
RILATCGDATA RilCgData;
RILATCGPCO RilCgpco;
HRESULT Result;
int NumEvents=0;
MultipleObjects[0] = m_CrilAsyncCommandDone = CreateEvent(NULL,FALSE,FALSE,NULL);
NumEvents++;
MultipleObjects[1] = m_CrilCancelEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
NumEvents++;
if ( m_AppMsgQueue && MultipleObjects[0] && MultipleObjects[1] )
{
DWORD WaitStatus;
DEBUGMSG( ZONE_NDIS, (L"RILNDIS CPdpContext: ProcessObjectsThread Running \r\n"));
while ( 1 )
{
WaitStatus = WaitForMultipleObjects(NumEvents, MultipleObjects, FALSE, INFINITE);
DEBUGMSG( ZONE_NDIS, (L"RILNDIS CPdpContext: ProcessObjectsThread Process Object Index = %x \r\n",WaitStatus - WAIT_OBJECT_0));
if ( 0 == (WaitStatus - WAIT_OBJECT_0))// Command Response
{
switch ( m_ActivationState)
{
case ACTIVATION_STATE_CGPCO_SET:
DEBUGMSG( ZONE_NDIS, (L"RILNDIS CPdpContext: ProcessObjectsThread ACTIVATION_STATE_CGPCO_SET dwRilResultCode = %x\r\n", m_RilResultCode ));
if ( RIL_RESULT_OK == m_RilResultCode )
{
m_ActivationState = ACTIVATION_STATE_ACT;
RilCgAct.Size = sizeof(RilCgAct);
RilCgAct.ContextID = m_ContextID;
RilCgAct.ContextActivation = TRUE;
RilATCommand.Size = sizeof(RilATCommand);
RilATCommand.Operation = CRilATCommandTypeCGACT;
RilATCommand.pData = &RilCgAct;
Result = DevSpecific((BYTE*)&RilATCommand, sizeof(RilATCommand),FALSE);
if ( FAILED( Result ))
{
m_RilResultCode = Result;
}
}
if ( RIL_RESULT_OK != m_RilResultCode )
{
m_ActivationState = ACTIVATION_STATE_OPEN_FAILED;
SetEvent( m_CrilAsyncCommandDone );
}
break;
case ACTIVATION_STATE_ACT:
DEBUGMSG( ZONE_NDIS, (L"RILNDIS CPdpContext: ProcessObjectsThread ACTIVATION_STATE_ACT dwRilResultCode = %x\r\n", m_RilResultCode));
if ( RIL_RESULT_OK == m_RilResultCode )
{
m_ActivationState = ACTIVATION_STATE_CGPADDR;
Result = GetGPRSAddress(m_ContextID);
if ( FAILED( Result ))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -