📄 callinfo.cpp
字号:
// 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 + -