struct state* CXenoChannel::FeeLogin_cmplt(EVTBLK *evtblk) { int nChan = evtblk->nReference; if ( evtblk->wEventCode == E_FEE_Login && (evtblk->dwParam & 0xFFFF) == S_FEE_Connected ) { if ( SsmGetChState(nChan) == S_CALL_PICKUPED ) { return &WaitDial; } if ( SsmGetChState(nChan) == S_CALL_TALKING ) { SsmPutUserEvent( E_CHG_ChState, nChan, S_CALL_RINGING ); } #ifdef NPICKUP if ( SsmGetChState(nChan) == S_CALL_RINGING ) { theApp.Message( MSG_TEMP, "CXenoChannel::NPICKUP" ); SsmStopPlayFile( nChan ); SsmPutUserEvent( E_CHG_ChState, nChan, S_CALL_RINGING ); } #endif } return CChannel::FeeLogin_cmplt(evtblk); }
struct state* CCallerChannel::FeeLogin_cmplt(EVTBLK *evtblk) { int nChan = evtblk->nReference; if ( evtblk->wEventCode == E_CHG_ChState ) { if ( (evtblk->dwParam & 0xFFFF) == S_CALL_RINGING ) { KillTimer(); Reserved &= 0; return &rcvMFsig; } } if ( evtblk->wEventCode == E_FEE_Login && (evtblk->dwParam & 0xFFFF) == S_FEE_Connected ) { if ( SsmGetChState(nChan) == S_CALL_TALKING || // 其他业务转入 _tcsncmp(CallType, CA_DEBG, 4) == 0 ) // For Debug { SsmPutUserEvent( E_CHG_ChState, nChan, S_CALL_RINGING ); } else if ( SsmGetChState(nChan) == S_CALL_PICKUPED ) // For CallOut { KillTimer(); Reserved &= 0; return &WaitDial; } } return CChannel::FeeLogin_cmplt(evtblk); }
CChannel* CCallerChannel::ReadOperUser(LPCTSTR xLocalId, LPCTSTR xOper) { int nCount = 0; m_pUserWnd->IsWellAlived( &nCount ); for ( CChannel* pChannel = m_pUserWnd->ReadItem( xLocalId ); pChannel && nCount > 0; nCount -- ) { if ( _tcsicmp( xOper, pChannel->m_xFeeCode ) ) continue; if ( SsmGetChState( pChannel->m_nChan ) == S_CALL_STANDBY && pChannel->m_nTaskId == -1 ) { SsmPutUserEvent( E_CHG_ChState, pChannel->m_nChan, MAKEVENT(m_nChan & 0xFFFF, S_CALL_RINGING) ); } else { pChannel->SendPacket( new CRingPacket( RemoteId, LocalId, m_nChan ) ); // pChannel->SendPacket( new CByePacket ); SetTimer( 5 * 1000 ); } return pChannel; } return NULL; }
BOOL CALLBACK CCircuitry::OnPlayMemBlockDone(int ch, int nEndReason, PUCHAR pucBuf, DWORD dwStopOffset, PVOID pV) { enum { PlayBy_Done = 1, PlayBy_RcvDtmf = 2, PlayBy_RcvBargein=3, PlayBy_Hangup = 4, PlayBy_BlockApp = 5, }; if ( SsmGetChState(ch) == S_CALL_STANDBY ) nEndReason = PlayBy_Hangup; OVERLAPPED* pPlayIoOver = (OVERLAPPED*)pV; //TRACE("%i-> OnPlayMemBlockDone[%i] in [%i]\n", GetTickCount(), nEndReason,pPlayIoOver->Offset); CSingleLock pLock( &Neighbour.m_pSection ); for ( ; HasOverlappedIoCompleted(pPlayIoOver) && ! pLock.Lock(50); ); if ( ! --pPlayIoOver->Offset ) SetEvent( pPlayIoOver->hEvent ); CCircuitry* pChannel = (CCircuitry*) pPlayIoOver->InternalHigh; if ( nEndReason == PlayBy_Done && pLock.IsLocked() ) { pChannel->ReplayWith( ch, pChannel->m_pChain ); } else if ( nEndReason != PlayBy_Done ) { pPlayIoOver->OffsetHigh = -1; if ( nEndReason == PlayBy_Hangup ) pChannel->m_nTaskId = -1; } return TRUE; }
BOOL CALLBACK CCircuitry::OnRecMemBlockDone(int ch, int nEndReason, PUCHAR pucBuf, DWORD dwStopOffset, PVOID pV) { enum { RecordBy_BlockApp = 1, RecordBy_RcvDtmf = 2, RecordBy_Hangup = 3, RecordBy_Done = 4, }; if ( SsmGetChState(ch) == S_CALL_STANDBY ) nEndReason = RecordBy_Hangup; OVERLAPPED* pRecIoOver = (OVERLAPPED*)pV; //TRACE("%i-> OnRecMemBlockDone in [%i]\n", GetTickCount(), pRecIoOver->Offset); CSingleLock pLock( &Neighbour.m_pSection ); for ( ; HasOverlappedIoCompleted(pRecIoOver) && ! pLock.Lock(50); ); if ( ! --pRecIoOver->Offset ) SetEvent( pRecIoOver->hEvent ); CCircuitry* pChannel = (CCircuitry*) pRecIoOver->InternalHigh; if ( nEndReason == RecordBy_Done && pLock.IsLocked() ) { pChannel->RecordWith( ch, pucBuf, min(dwStopOffset,TEMP_BUFFER) ); } else if ( nEndReason != RecordBy_Done ) { pRecIoOver->OffsetHigh = -1; if ( nEndReason == RecordBy_Hangup ) pChannel->m_nTaskId = -1; } return TRUE; }
void voice_card_control::cti_callout(boost::shared_ptr<cti_call_out_param> cti_call_out_param_) { std::size_t chID; ciaMessage& msg_ = cti_call_out_param_->m_ch_msg->m_procbuffer_msg; try { chID = m_channel_queue.take(); } catch (std::out_of_range) { //BOOST_LOG_SEV(cia_g_logger, RuntimeInfo) << "业务流水:" << msg_.transid() << " 获取通道失败, 通道全部繁忙"; //继续下一次呼叫 cti_callout_again(cti_call_out_param_); return; } int ch_state = SsmGetChState(chID); if (ch_state != 0 && ch_state != 123) //空闲或本地闭塞 { BOOST_LOG_SEV(cia_g_logger, RuntimeInfo) << "业务流水:" << msg_.transid() << " , 获取到得通道状态为:" << ch_state << ", 不可用,将此通道重新放回。通道号码:" << chID; m_channel_queue.put(chID); cti_callout_again(cti_call_out_param_); return; } //BOOST_LOG_SEV(cia_g_logger, RuntimeInfo) << "业务流水:" << msg_.transid() << ", 获取到的通道号码:" << chID; SsmSetTxCallerId(chID, msg_.authcode().c_str()); boost::shared_ptr<trunk> t = m_trunk_vector.at(chID); boost::unique_lock<boost::mutex> unique_lock_(t->m_trunk_mutex); if (SsmAutoDial(chID, msg_.pn().c_str()) == 0){ BOOST_LOG_SEV(cia_g_logger, RuntimeInfo) << "业务流水:" << msg_.transid() << " 已发送请求, 已将此通道对应状态清空, 通道号码:" << chID; t->reset_trunk(cti_call_out_param_); } else { show_error(); unique_lock_.unlock(); m_channel_queue.put(chID); //上一次呼叫失败,继续呼叫 if (cti_call_out_param_->m_repeat_call_out) { cti_call_out_param_->m_repeat_call_out = false; BOOST_LOG_SEV(cia_g_logger, RuntimeInfo) << "业务流水:" << msg_.transid() << "上一次呼叫失败,继续呼叫, 失败原因向上查询SsmGetLastErrMsg"; cti_callout_again(cti_call_out_param_); } //已经连续两次呼叫失败, 直接返回失败 else { BOOST_LOG_SEV(cia_g_logger, RuntimeInfo) << "业务流水:" << msg_.transid() << "已经连续两次呼叫失败, 直接返回失败, 失败原因向上查询SsmGetLastErrMsg"; std::string transid_ = msg_.transid(); msg_.Clear(); msg_.set_type(CIA_CALL_RESPONSE); msg_.set_transid(transid_); msg_.set_status(CIA_CALL_FAIL); cti_call_out_param_->m_base_client->do_write(cti_call_out_param_->m_ch_msg); return; } } }
int CMailChannel::RcvTalk_init(EVTBLK *evtblk) { int nChan = evtblk->nReference; CChannel::RcvTalk_init(evtblk); if ( SsmGetChState(nChan) != S_CALL_TALKING ) SsmSetPlayDest( nChan, 1 ); // 上总线,用于内线测试 fcnp = &FwdPlay; Reserved = 0; return (this->*fcnp->initiate)(evtblk); }
int CInfoChannel::rcvMFsig_init(EVTBLK *evtblk) { int nChan = evtblk->nReference; if ( ! IsOnlyUserId(RemoteId) ) return ShExitCode_init(evtblk, EXIT_NOTUSER); if ( SsmGetChState(nChan) == S_CALL_TALKING || // 其他业务转入 _tcsncmp(CallType, CA_DEBG, 4) == 0 ) // For Debug { return SsmPutUserEvent( E_CHG_ChState, nChan, S_CALL_TALKING ); } return CChannel::rcvMFsig_init(evtblk); }
int CXenoChannel::rcvMFsig_init(EVTBLK *evtblk) { int nChan = evtblk->nReference; if ( SsmGetChState(nChan) == S_CALL_TALKING ) return SsmPutUserEvent( E_CHG_ChState, nChan, S_CALL_TALKING ); #ifdef NPICKUP theApp.Message( MSG_TEMP, "CXenoChannel::NPICKUP" ); return SsmPutUserEvent( E_CHG_ChState, nChan, S_CALL_TALKING ); #endif return CChannel::rcvMFsig_init(evtblk); }
struct state* CPagerChannel::FeeLogin_cmplt(EVTBLK *evtblk) { int nChan = evtblk->nReference; if ( evtblk->wEventCode == E_CHG_ChState ) { if ( (evtblk->dwParam & 0xFFFF) == S_CALL_TALKING ) { KillTimer(); Reserved &= 0; return &RcvTalk; } } if ( evtblk->wEventCode == E_FEE_Login && (evtblk->dwParam & 0xFFFF) == S_FEE_Connected ) { if ( SsmGetChState(nChan) == S_CALL_PICKUPED ) // For CallOut { KillTimer(); Reserved &= 0; return &WaitDial; } } return CChannel::FeeLogin_cmplt(evtblk); }