#include "StdAfx.h" #include "ChanExten.h" #include "FsProxy.h" #include "Operation.h" CChanExten::CChanExten(CFsProxy* pParent, UINT ChanNo) : CVirtualChan(pParent, ChanNo), m_VoidFlag(false), m_OpInstance(FS_LINK_INSTANCE_INVALID) { } CChanExten::~CChanExten(void) { m_pParent->onExtenDestroy(m_No); } /***************************************************************** **【函数名称】 __setCallNumber **【函数功能】 设置呼叫号码 **【参数】 **【返回值】 ****************************************************************/ void CChanExten::__setCallNumber( void ) { if(m_pOperation == NULL) return; switch(m_pOperation->type()) { case LINE_OP_MAKE_CALL: { if(m_OpNumber != _T("")) m_CalleeNum = m_OpNumber; } break; case LINE_OP_LISTEN: case LINE_OP_INSERT: case LINE_OP_INSTEAD: case LINE_OP_GRAB: { if(m_OpNumber != _T("")) m_CallerNum = m_OpNumber; } break; } } /***************************************************************** **【函数名称】 isFree **【函数功能】 是否空闲 **【参数】 **【返回值】 *****************************************************************/ bool CChanExten::isFree( void ) const { return m_State == CHAN_LOGIC_STATE_FREE && m_pOperation == NULL; } /***************************************************************** **【函数名称】 regist **【函数功能】 注册线路 **【参数】 **【返回值】 *****************************************************************/ void CChanExten::regist( void ) const { m_pParent->onChanRegist(DEV_RES_TYPE_EXT, m_No, m_State); } /***************************************************************** **【函数名称】 onChanHold **【函数功能】 通道保持事件处理 **【参数】 **【返回值】 ****************************************************************/ void CChanExten::onChanHold( EVENT_HOLD_TYPE HoldType ) { UINT 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); } /***************************************************************** **【函数名称】 onChanEvent **【函数功能】 通道事件处理 **【参数】 **【返回值】 *****************************************************************/ void CChanExten::onChanEvent( PCHAN_EVENT_NOTIFY pNotify ) { ASSERT(pNotify != NULL); if (pNotify == NULL) return; switch(pNotify->EventId) { case CHANNEL_EVENT_CREATE: { _setSession(pNotify->CallId, 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(lstrcmp(pNotify->Caller, pNotify->Callee) == 0) // 自振分机 { if(m_pOperation != NULL && m_pOperation->type() == LINE_OP_MAKE_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) 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; _reset(); _setSession(NULL, NULL); } break; default: return; } if(m_pOperation != NULL) m_pOperation->onHostChanStateUpdated(this); m_pParent->onChanStateUpdate(pNotify->ChanOpInstance, this); } /***************************************************************** **【函数名称】 onSessionChanEvent **【函数功能】 会话关联通道事件处理 **【参数】 **【返回值】 *****************************************************************/ void CChanExten::onSessionChanEvent( CVirtualChan* pChanSession, PCHAN_EVENT_NOTIFY pNotify ) { ASSERT(pChanSession != NULL); if(m_pOperation != NULL) { if(m_pOperation->type() == LINE_OP_MAKE_CALL) { switch(pNotify->EventId) { case CHANNEL_EVENT_PROGRESS: case CHANNEL_EVENT_PROGRESS_MEDIA: { if(m_State == CHAN_LOGIC_STATE_DIALING) { ASSERT(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); } } /***************************************************************** **【函数名称】 forceState **【函数功能】 强制状态转换 **【参数】 **【返回值】 *****************************************************************/ void CChanExten::forceState( CHAN_LOGIC_STATE NewState ) { if(m_State == NewState) return; m_State = NewState; if(m_pOperation != NULL) m_pOperation->onHostChanStateUpdated(this); m_pParent->onChanStateUpdate(m_OpInstance, this); }