⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rilhandndisoem1.cpp

📁 windows mobile RIL软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:

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 + -