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

📄 connection.cpp

📁 ril source code for Windows CE
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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 + -