#include "ChanTrunk.h" #include "FsProxy.h" #include "Operation.h" ChanTrunk::ChanTrunk(CFsProxy* pParent, uint32_t ChanNo) : VirtualChan(pParent, ChanNo) { } ChanTrunk::~ChanTrunk() { } bool ChanTrunk::isFree(void) const { if (m_State == CHAN_LOGIC_STATE_FREE && m_pOperation != nullptr) { LOG_WARN(("{ChanTrunk}: 通道[%lu]空闲,操作非空"), m_No); } return m_State == CHAN_LOGIC_STATE_FREE && m_pOperation == nullptr; } void ChanTrunk::regist(void) const { m_pParent->onChanRegist(DEV_RES_TYPE_TRUNK, m_No, m_State); } void ChanTrunk::onChanEvent(PCHAN_EVENT_NOTIFY pNotify) { if (pNotify == nullptr) return; switch (pNotify->EventId) { case CHANNEL_EVENT_CREATE: { _setSession(pNotify->CallId, pNotify->ChanId); m_CallerNum = pNotify->Caller; m_CalleeNum = pNotify->Callee; if (pNotify->Direction == CALL_DIRECTION_INBOUND) // 呼入FS m_State = CHAN_LOGIC_STATE_ALERTING; else m_State = CHAN_LOGIC_STATE_DIALING; } break; case CHANNEL_EVENT_PROGRESS: case CHANNEL_EVENT_PROGRESS_MEDIA: { if (pNotify->Direction == CALL_DIRECTION_OUTBOUND) // FS呼出 m_State = CHAN_LOGIC_STATE_RING_BACK; else return; } break; case CHANNEL_EVENT_ANSWER: { m_State = CHAN_LOGIC_STATE_TALKING; } break; case CHANNEL_EVENT_HANGUP_COMPLETE: { m_State = CHAN_LOGIC_STATE_FREE; _setSession("", ""); _reset(); } break; default: return; } if (m_pOperation != nullptr) m_pOperation->onHostChanStateUpdated(this); m_pParent->onChanStateUpdate(pNotify->ChanOpInstance, this); } void ChanTrunk::onSessionChanEvent(VirtualChan * pChanSession, PCHAN_EVENT_NOTIFY pNotify) { if (pChanSession == nullptr) return; if (m_pOperation != nullptr) m_pOperation->onSessionChanStateUpdated(pChanSession); }