📄 connection.cpp
字号:
class ATCMDDEACT : public ATCmd
{
public:
ATCMDDEACT( )
{
}
virtual ~ATCMDDEACT()
{
}
HRESULT DeactivateContext( DWORD dwContextID)
{
char szCmd[128];
(void)_snprintfz(szCmd, 128, "AT+CGACT=0,%u\r", dwContextID);
DWORD dwCommandOption = CMDOPT_DEACT | CMDOPT_IGNORERADIOOFF;
HRESULT hr = Execute( szCmd, dwCommandOption, 60L * 1000L);
return hr;
}
protected:
virtual HRESULT Parse( LPCSTR szRsp )
{
return S_OK;
}
private:
};
class ATCMDCOPS : public ATCmd
{
public:
ATCMDCOPS( )
{
}
virtual ~ATCMDCOPS()
{
}
HRESULT Set( void)
{
char szCmd[128];
(void)strncpyz(szCmd, "AT+COPS=2\r", 128);
DWORD dwCommandOption = CMDOPT_IGNORERADIOOFF;
HRESULT hr = Execute( szCmd, dwCommandOption);
return hr;
}
protected:
virtual HRESULT Parse( LPCSTR szRsp )
{
return S_OK;
}
private:
};
CloseVoiceAndDataConnections:: CloseVoiceAndDataConnections( )
{
m_prci = NULL;
m_dwNumCallsInList = 0;
m_pCRilInstanceHandle = NULL;
m_dwNumContextsInList = 0;
m_pgContextList = NULL;
}
CloseVoiceAndDataConnections:: ~CloseVoiceAndDataConnections()
{
if ( m_prci )
{
delete [] m_prci;
}
if ( m_pgContextList )
{
delete [] m_pgContextList;
}
}
void
CloseVoiceAndDataConnections:: CloseAllConnections ( CRilInstanceHandle* pHandle )
{
m_pCRilInstanceHandle = pHandle;
GetDataConnections();
GetVoiceCalls();
CloseVoiceConnections();
CloseDataConnections();
}
void
CloseVoiceAndDataConnections::CloseVoiceConnections(void)
{
BOOL fActiveDataCalls = FALSE;
// Disconnect Voice first.
if ( m_prci && m_dwNumCallsInList)
{
// Check for any data connections.
if ( m_pgContextList && m_dwNumContextsInList)
{
for(DWORD dwNumContexts = 0; dwNumContexts < m_dwNumContextsInList; dwNumContexts++)
{
if ( TRUE == m_pgContextList[dwNumContexts].fActivated )
{
fActiveDataCalls = TRUE;
break;
}
}
}
ATCMDHANGUP *pCmdHangup = new ATCMDHANGUP;
if ( pCmdHangup )
{
for(DWORD dwNumCalls = 0; dwNumCalls < m_dwNumCallsInList; dwNumCalls++)
{
switch (m_prci[dwNumCalls].dwStatus)
{
//case RIL_CALLSTAT_ALERTING:
case RIL_CALLSTAT_DIALING:
pCmdHangup->HangupDialingCall();
break;
//case RIL_CALLSTAT_INCOMING:
//case RIL_CALLSTAT_WAITING:
// break;
case RIL_CALLSTAT_ACTIVE:
if ( FALSE == fActiveDataCalls )
{
pCmdHangup->HangupActiveCall();
}
else
{
pCmdHangup->ReleaseCall(m_prci[dwNumCalls].dwID);
}
break;
case RIL_CALLSTAT_ONHOLD:
pCmdHangup->ReleaseHeldCall();
break;
default:
break;
}
m_prci[dwNumCalls].dwStatus = RIL_CPISTAT_DISCONNECTED;
m_prci[dwNumCalls].dwParams |= RIL_PARAM_CI_CPISTATUS;
if ( 0 == (m_prci[dwNumCalls].dwParams & RIL_PARAM_CI_DIRECTION) )
{
m_prci[dwNumCalls].dwDirection = RIL_CALLDIR_OUTGOING; // fill this in for completeness sake
m_prci[dwNumCalls].dwParams |= RIL_PARAM_CI_DIRECTION;
}
m_prci[dwNumCalls].dwDisconnectCode = RIL_RESULT_RADIOOFF;
m_prci[dwNumCalls].dwParams |= RIL_PARAM_CI_DISCONNECTCODE;
SendRilCPIMessage ( m_prci + dwNumCalls );
}
delete pCmdHangup;
}
}
}
void
CloseVoiceAndDataConnections:: CloseDataConnections ( void )
{
BOOL fPacket = GetRegistryPacketSupport();
CRilHandle *pCRilHandle = NULL;
if ( m_pCRilInstanceHandle)
{
pCRilHandle = m_pCRilInstanceHandle->GetDevice();
}
if ( TRUE == fPacket)
{
if ( pCRilHandle && pCRilHandle->m_pCRilNdis)
{
pCRilHandle->m_pCRilNdis->NdisCloseAllConnections();
}
}
else
{
if ( m_pgContextList && m_dwNumContextsInList)
{
ATCMDDEACT *pCmdDeact = new ATCMDDEACT;
if ( pCmdDeact )
{
for(DWORD dwNumContexts = 0; dwNumContexts < m_dwNumContextsInList; dwNumContexts++)
{
if ( TRUE == m_pgContextList[dwNumContexts].fActivated )
{
pCmdDeact->DeactivateContext(m_pgContextList[dwNumContexts].dwContextID);
if ( pCRilHandle )
{
RILGPRSCONTEXTACTIVATED RilGprsContexActivated;
RilGprsContexActivated.cbSize = sizeof(RILGPRSCONTEXTACTIVATED);
RilGprsContexActivated.fActivated = FALSE;
RilGprsContexActivated.dwEvent = RIL_RILGPRSCONTEXTACTIVATED_RADIOOFF;
RilGprsContexActivated.dwContextID = m_pgContextList[dwNumContexts].dwContextID;
pCRilHandle->BroadcastRealBlobNotification(RIL_NOTIFY_GPRSCONNECTIONSTATUS, &RilGprsContexActivated, sizeof(RILGPRSCONTEXTACTIVATED));
}
}
}
delete pCmdDeact;
}
}
}
}
void
CloseVoiceAndDataConnections::GetDataConnections(void)
{
if ( m_pgContextList )
{
delete [] m_pgContextList;
m_pgContextList = NULL;
m_dwNumContextsInList = 0;
}
if ( NULL == m_pgContextList )
{
ATCMDCGACT *pCGACT = new ATCMDCGACT;
if ( pCGACT )
{
if ( SUCCEEDED ( pCGACT->Read()))
{
m_dwNumContextsInList = pCGACT->GetActiveContextListSize();
if ( m_dwNumContextsInList )
{
m_pgContextList = new RILGPRSCONTEXTACTIVATED[m_dwNumContextsInList];
if ( m_pgContextList )
{
if ( m_dwNumContextsInList != pCGACT->GetActiveContextList( m_pgContextList, m_dwNumContextsInList))
{
m_dwNumContextsInList = 0;
delete [] m_pgContextList;
m_pgContextList = NULL;
}
}
}
}
delete pCGACT;
}
}
}
void
CloseVoiceAndDataConnections::GetVoiceCalls(void)
{
if ( m_prci )
{
delete [] m_prci;
m_prci = NULL;
m_dwNumCallsInList = 0;
}
if ( NULL == m_prci )
{
ATCMDCLCC *pCLCC = new ATCMDCLCC;
if ( pCLCC )
{
if ( SUCCEEDED ( pCLCC->Read()))
{
m_dwNumCallsInList = pCLCC->GetCallListSize();
if ( m_dwNumCallsInList )
{
m_prci = new RILCALLINFO[m_dwNumCallsInList];
if ( m_prci )
{
if ( m_dwNumCallsInList != pCLCC->GetCallList( m_prci, m_dwNumCallsInList))
{
m_dwNumCallsInList = 0;
delete [] m_prci;
m_prci = NULL;
}
}
}
}
delete pCLCC;
}
}
}
void
CloseVoiceAndDataConnections::DegisterFromNetwork(void)
{
ATCMDCOPS *pCOPS = new ATCMDCOPS;
if ( pCOPS )
{
pCOPS->Set();
delete (pCOPS);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -