#include "ChanExten.h" #include "FsProxy.h" #include "Operation.h" ChanExten::ChanExten(CFsProxy* pParent, uint32_t ChanNo) : VirtualChan(pParent, ChanNo), m_VoidFlag(false) { } ChanExten::~ChanExten() { m_pParent->onExtenDestroy(m_No); } bool ChanExten::isFree(void) const { return m_State == CHAN_LOGIC_STATE_FREE && m_pOperation == nullptr; } void ChanExten::regist(void) const { m_pParent->onChanRegist(DEV_RES_TYPE_EXT, m_No, m_State); } void ChanExten::onChanHold(EVENT_HOLD_TYPE HoldType) { uint32_t NewState = m_State; if (HoldType == EVENT_HOLD) NewState |= CHAN_LOGIC_STATE_HELD; else NewState &= HELD_STATE_FILTER_MASK; m_State = (CHAN_LOGIC_STATE)NewState; m_pParent->onChanStateUpdate(m_OpInstance, this); } void ChanExten::onChanEvent(PCHAN_EVENT_NOTIFY pNotify) { if (pNotify == nullptr) return; switch (pNotify->EventId) { case CHANNEL_EVENT_CREATE: { if(pNotify->CcId.empty()) _setSession(pNotify->CallId, pNotify->ChanId); else _setSession(pNotify->CcId, pNotify->ChanId); m_CallerNum = pNotify->Caller; m_CalleeNum = pNotify->Callee; m_OpInstance = pNotify->ChanOpInstance; if (pNotify->Direction == CALL_DIRECTION_INBOUND) // 呼入FS { m_State = CHAN_LOGIC_STATE_DIALING; if (m_pOperation == NULL) // 如果通道未附加任何操作且变为呼出状态,则通知座席话机直呼操作 m_pParent->onExtenDirectOp(DEV_OP_CALL_OUT, this, pNotify); } else // FS呼出 { __setCallNumber(); // 分机被呼叫过程中,通道无需更新状态,直到来电振铃 return; } } break; case CHANNEL_EVENT_PROGRESS: case CHANNEL_EVENT_PROGRESS_MEDIA: { if (pNotify->Direction == CALL_DIRECTION_INBOUND) // 呼入FS { m_State = CHAN_LOGIC_STATE_RING_BACK; } else // FS呼出 { if (pNotify->Caller == pNotify->Callee) // 自振分机 { if ((m_pOperation != NULL && m_pOperation->type() == LINE_OP_MAKE_CALL) || pNotify->CallType == AGENT_CALL) // OCX外呼 m_State = CHAN_LOGIC_STATE_INIT; else m_State = CHAN_LOGIC_STATE_ALERTING; } else { m_State = CHAN_LOGIC_STATE_ALERTING; } } } break; case CHANNEL_EVENT_ANSWER: { // 通过OCX外呼 命令外呼或自动外呼 if ((m_pOperation != NULL && m_pOperation->type() == LINE_OP_MAKE_CALL && pNotify->Direction == CALL_DIRECTION_OUTBOUND) || (pNotify->Caller == pNotify->Callee && pNotify->CallType == AGENT_CALL)) m_State = CHAN_LOGIC_STATE_DIALING; else m_State = CHAN_LOGIC_STATE_TALKING; } break; case CHANNEL_EVENT_HANGUP_COMPLETE: { m_State = CHAN_LOGIC_STATE_FREE; m_OpInstance = FS_LINK_INSTANCE_INVALID; _setSession("", ""); _reset(); } break; default: return; } if (m_pOperation != nullptr) m_pOperation->onHostChanStateUpdated(this); m_pParent->onChanStateUpdate(pNotify->ChanOpInstance, this); } void ChanExten::onSessionChanEvent(VirtualChan * pChanSession, PCHAN_EVENT_NOTIFY pNotify) { if (m_pOperation != nullptr) { if (m_pOperation->type() == LINE_OP_MAKE_CALL || pNotify->CallType == AGENT_CALL) { switch ((int)pNotify->EventId) { case CHANNEL_EVENT_PROGRESS: case CHANNEL_EVENT_PROGRESS_MEDIA: { if (m_State == CHAN_LOGIC_STATE_DIALING) { if (pNotify->Direction == CALL_DIRECTION_OUTBOUND) { m_State = CHAN_LOGIC_STATE_RING_BACK; m_pOperation->onHostChanStateUpdated(this); m_pParent->onChanStateUpdate(m_OpInstance, this); } } } break; case CHANNEL_EVENT_ANSWER: { if (m_State == CHAN_LOGIC_STATE_RING_BACK) { m_State = CHAN_LOGIC_STATE_TALKING; m_pOperation->onHostChanStateUpdated(this); m_pParent->onChanStateUpdate(m_OpInstance, this); } } break; } } m_pOperation->onSessionChanStateUpdated(pChanSession); } } void ChanExten::forceState(CHAN_LOGIC_STATE NewState) { /*if (m_State == NewState) return;*/ m_State = NewState; if (m_pOperation != nullptr) m_pOperation->onHostChanStateUpdated(this); m_pParent->onChanStateUpdate(m_OpInstance, this); } /***************************************************************** **【函数名称】 __setCallNumber **【函数功能】 设置呼叫号码 **【参数】 **【返回值】 ****************************************************************/ void ChanExten::__setCallNumber(void) { if (m_pOperation == NULL) return; switch ((int)m_pOperation->type()) { case LINE_OP_MAKE_CALL: { if (!m_OpNumber.empty()) m_CalleeNum = m_OpNumber; } break; case LINE_OP_LISTEN: case LINE_OP_INSERT: case LINE_OP_INSTEAD: case LINE_OP_GRAB: { if (!m_OpNumber.empty()) m_CallerNum = m_OpNumber; } break; } }