⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callinfo.cpp

📁 TAPI编程应用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// callinfo.cpp : implementation file for callinfo class
// (c) Dialogic corp 1995, 1996

#include "stdafx.h"
#include <tapi.h>
#include "tapiapp.h"
#include "tapiline.h"
#include "tapicall.h"
#include "talker32.h"
#include "talkdlg.h"
#include "callinfo.h"
#include "lineinfo.h"
#include "helpid.h"
#include "tonedlg.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

#define CALLINFO_TIMER_ID	1
#define WAVE_TIMER_ID		2

UINT uiMsg;
/////////////////////////////////////////////////////////////////////////////
// CCallInfo property page

IMPLEMENT_DYNCREATE(CCallInfo, CPropertyPage)

CCallInfo::CCallInfo() : CPropertyPage(CCallInfo::IDD)
{
	//{{AFX_DATA_INIT(CCallInfo)
	m_csCallInfo = _T("");
	m_csCallState = _T("");
	m_csCallAction = _T("");
	m_csGathered = _T("");
	m_csLastDigit = _T("");
	m_csGatherRes = _T("");
	//}}AFX_DATA_INIT
	m_pWaveName = NULL;
	m_nRecTime = 0;
	m_uiMsg = RegisterWindowMessage("TALKER32 callinfo alert");
	uiMsg = m_uiMsg;
	SetHelpID(HIDD_TALKER32_DialogCallInfo);
}

CCallInfo::~CCallInfo()
{
}

void CCallInfo::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCallInfo)
	DDX_Control(pDX, IDC_CALLALERT, m_btnCallAlert);
	DDX_Control(pDX, IDC_VOLUME, m_ctlVolume);
	DDX_Control(pDX, IDC_STOP, m_btnStop);
	DDX_Control(pDX, IDC_PAUSE, m_btnPause);
	DDX_Control(pDX, IDC_GATHER, m_btnGather);
	DDX_Control(pDX, IDC_MONITOR, m_btnMonitor);
	DDX_Control(pDX, IDC_RECORD, m_btnRecord);
	DDX_Control(pDX, IDC_PLAY, m_btnPlay);
	DDX_Text(pDX, IDC_CALLINFO, m_csCallInfo);
	DDX_Text(pDX, IDC_STATE, m_csCallState);
	DDX_Text(pDX, IDC_ACTIVITY, m_csCallAction);
	DDX_Text(pDX, IDC_GATHERED, m_csGathered);
	DDX_Text(pDX, IDC_LASTDIGIT, m_csLastDigit);
	DDX_Text(pDX, IDC_GATHERRES, m_csGatherRes);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCallInfo, CPropertyPage)
	//{{AFX_MSG_MAP(CCallInfo)
	ON_BN_CLICKED(IDC_PLAY, OnPlay)
	ON_BN_CLICKED(IDC_RECORD, OnRecord)
	ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
	ON_WM_CLOSE()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_INFOBTN, OnInfobtn)
	ON_BN_CLICKED(IDC_MONITOR, OnMonitor)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_CALLALERT, OnCallalert)
	ON_BN_CLICKED(IDC_GATHER, OnGather)
	ON_BN_CLICKED(IDC_PAUSE, OnPause)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	ON_WM_HSCROLL()
	ON_REGISTERED_MESSAGE(uiMsg, OnDynamicAlert)
	ON_BN_CLICKED(IDC_GENTONE, OnGentone)
	ON_WM_SETFOCUS()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CCallInfo::DisplayCallInfo(BOOL bUpdateCallInfo)
{
	if(m_pCall == NULL) return;
	if(NULL == m_pLine->ctlGetActiveCall()) 	// call no longer active
	{
		if(m_pCall) {
			m_pCall->m_hStatusWnd = NULL;	
			m_pCall->m_hCallAlertWnd = NULL;	
			m_pCall->m_uiAlertMsg = NULL;	
		   }
		m_pCall = NULL;
		::PostMessage(::GetParent(m_hWnd), WM_CLOSE, 0, NULL);
		KillTimer(CALLINFO_TIMER_ID);
		return;
	}
		// display status
	WORD wState = m_pCall->GetCallState();
	WORD wDir = m_pCall->GetCallDirection();
	CString csTemp;

	m_csCallState = "State =";
	switch(wState)
	{
	case IDLE:
		csTemp = "idle";
		break;
	case MAKING:
		csTemp = "making";			
		break;
	case STOP_MAKING:
		csTemp = "stop making";
		break;	
	case PROGRESS:		
		csTemp = "progress";
		break;	
	case DIALING:			
		csTemp = "dialing";
		break;	
 	case OFFERING:		
		csTemp = "offering";
		break;	
 	case ANSWERING:		
		csTemp = "answering";
		break;	
 	case CONNECTED:		
		csTemp = "connected";
		break;	
	case HOLD:			
		csTemp = "hold";
		break;	
 	case DROPPING:		
		csTemp = "dropping";
		break;	
 	case DISCONNECTED: 	
		csTemp = "disconnected";
		break;	
	default:
		csTemp = "undefined";
		break;	
	}
	m_csCallState += csTemp;
	DWORD dwWaveStatus = m_pCall->GetWaveStatus();
	DWORD dwPRStatus;
	switch(dwWaveStatus)
	{
		case WAVE_IDLE:
			csTemp = "Idle";
			m_btnPause.SetWindowText("Pause");
			m_btnStop.EnableWindow(FALSE);
			KillTimer(WAVE_TIMER_ID);
			m_nRecTime = 0;
			break;
		case PREPARING_TO_PLAY:
		case PLAYING:
		case FINISHING_PLAY:
			csTemp = "Playing";
			m_btnPause.SetWindowText("Pause");
			m_btnStop.EnableWindow();
			break;
		case PAUSED:
			csTemp = "Paused";
			m_btnPause.SetWindowText("Resume");
			break;
		case PREPARING_TO_RECORD:	
		case RECORDING:		 	
		case FINISHING_RECORD:
			csTemp.Format("Recording, %d seconds left", m_nRecTime);
			m_btnStop.EnableWindow();
			break;
		case WAVE_DISFUNCTIONAL:
			csTemp = "Wave disabled";
			m_btnStop.EnableWindow(FALSE);
		//	m_nRecTime = 0;
		// check the dev specific play/record status
			dwPRStatus = m_pCall->GetRecPlayStatus();
			switch(dwPRStatus)	// all possible cases for dev specific play/record
			{
				case WAVE_IDLE:
					KillTimer(WAVE_TIMER_ID);
					m_nRecTime = 0;
				break;
				case PREPARING_TO_RECORD:
				case RECORDING:
					csTemp.Format("Recording, %d seconds left", m_nRecTime);
					m_btnStop.EnableWindow();
				break;
				case PREPARING_TO_PLAY:
				case PLAYING:
				case FINISHING_PLAY:
					csTemp = "Playing";
					m_btnStop.EnableWindow();
				break;
				case FAILED_START:
					csTemp = "Wave disabled";
					m_pLine->ctlUpdateDevSpecStatus(DEVSPEC_IDLE);
					MessageBox("WAVE function failed to start", NULL, MB_ICONSTOP);
					m_btnStop.EnableWindow(FALSE);
				break;
				case WAVE_FAILED:
					csTemp = "Wave disabled";
					m_pLine->ctlUpdateDevSpecStatus(DEVSPEC_IDLE);
					MessageBox("WAVE function failed to complete", NULL, MB_ICONSTOP);
					m_btnStop.EnableWindow(FALSE);
				break;	
			}
			break;
		default:
			csTemp = "Not available";
			m_btnStop.EnableWindow(FALSE);
			m_nRecTime = 0;
			break;
	} 	//end-switch

	m_csCallAction = "Action:";
	m_csCallAction += csTemp;
	if(wState != CONNECTED)
		m_btnStop.EnableWindow(FALSE);
	// Determine if WAVE play/record are available thru TAPI extensions
	// Make it available if: local system, wave driver not installed OR remote system
	if(dwWaveStatus == WAVE_DISFUNCTIONAL && m_bRunningOnNT)
	{
		m_btnPlay.SetWindowText("PlayX");
		m_btnRecord.SetWindowText("RecordX");
		m_btnPlay.EnableWindow(wState == CONNECTED);
		m_btnRecord.EnableWindow(wState == CONNECTED);
	}
	else
	{
		m_btnPlay.EnableWindow(wState == CONNECTED && dwWaveStatus == WAVE_IDLE);
		m_btnRecord.EnableWindow(wState == CONNECTED && dwWaveStatus == WAVE_IDLE);
	}
	m_btnPause.EnableWindow(dwWaveStatus==PREPARING_TO_PLAY || dwWaveStatus==PLAYING ||	// dwWaveStatus==WAVE_IDLE ||
						dwWaveStatus== PAUSED); //PREPARING_TO_RECORD || dwWaveStatus==RECORDING);

	UpdateData(FALSE);
	if(!bUpdateCallInfo) return;

	//UpdateDigitsMonitorStatus();	// do not read gathered
	m_csCallInfo.Empty();
	LPLINECALLSTATUS lpLCI = ((CTalkApp *)AfxGetApp())->GetCallStatus(m_pCall->m_hCall);
	if(lpLCI == NULL) return;	// failed for some reason

	char szState[48];
	if(!((CTalkApp *)AfxGetApp())->Code2CallState(lpLCI->dwCallState, szState, 46))
	csTemp.Format("state = %lx\r\nstatemode = %lx\r\nprivilege = %lx\r\nfeatures = %lx\r\n",
			lpLCI->dwCallState, lpLCI->dwCallStateMode, lpLCI->dwCallPrivilege,lpLCI->dwCallFeatures);
	else
	csTemp.Format("state = %s\r\nstatemode = %lx\r\nprivilege = %lx\r\nfeatures = %lx\r\n",
			szState, lpLCI->dwCallStateMode, lpLCI->dwCallPrivilege,lpLCI->dwCallFeatures);
	m_csCallInfo += csTemp;
	m_btnMonitor.EnableWindow(lpLCI->dwCallState == LINECALLSTATE_CONNECTED || lpLCI->dwCallState == LINECALLSTATE_DIALTONE);
	m_btnGather.EnableWindow(lpLCI->dwCallState == LINECALLSTATE_CONNECTED);
	UpdateData(FALSE);
	delete (PBYTE) lpLCI; 	
}

void CCallInfo::UpdateDigitsMonitorStatus(BOOL bReadGathered, UINT wParam, LONG lParam)
{
	MONITORSTATE msMonState ={0, 0, 0L, 0L, 0};
	BOOL bUpdateMon = FALSE;

	// Check/update monitor & gather state here
	if(lParam)		// this is always != 0 for the parametrized alert
	{
		if(wParam)	// Monitor result
		{
			msMonState.wState |= MONITOR_DIGITS;
			msMonState.wLastDigit = (WORD) wParam;
			bUpdateMon = TRUE;
		}	 	 	
		else 		// gather result
		{
			msMonState.dwGatherResult = lParam;
			msMonState.wState &= ~START_GATHER;
		}
	}
	else if(!wParam) 	// non-parametrized alert
	{
		m_pCall->GetMonitorState(&msMonState);
		bUpdateMon = TRUE;
	}
	if(bUpdateMon)
	{
		if(msMonState.wState & MONITOR_DIGITS)		
		{
			m_btnMonitor.SetWindowText("Stop Monitor");	
			m_csLastDigit.Format("%c", LOBYTE(msMonState.wLastDigit));
		}
		else 
			m_btnMonitor.SetWindowText("Monitor Digits");	
	}
	if(msMonState.wState & START_GATHER)  	// gathering in progress
		m_btnGather.SetWindowText("Stop Gather");	
	else if(bReadGathered && msMonState.dwGatherResult)	// read result if available
	{
		if(msMonState.dwGatherResult != LINEGATHERTERM_CANCEL)
		{
			m_pCall->m_szDigits[20] = 0;	
			m_csGathered = m_pCall->m_szDigits;
			int i;
			for(i=0; i<lstrlen(m_pCall->m_szDigits); i++)
			{
				if(m_pCall->m_szDigits[i] != '*' && m_pCall->m_szDigits[i] != '#'
				 && !isdigit(m_pCall->m_szDigits[i]))
				 {
				 	m_csGathered.Empty();
					break;
				 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -