Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
		}
	}
}
Esempio n. 7
0
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);
}
Esempio n. 8
0
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);
}
Esempio n. 9
0
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);
}
Esempio n. 10
0
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);
}