📄 calldlg.cpp
字号:
// 软件授权协议
//1、 杭州三汇信息工程有限公司(以下简称本公司)拥有"本软件及所有附属产品、文件和相关文档"(以下简称本产品)的完全版权。任何单位和个人在使用前须获得本公司的授权。
//2、 本公司授权符合以下全部条件的单位和个人免费使用本产品:
//A、 本产品与通过合法销售渠道购买的本公司硬件产品配合使用时;
//B、 不私自向第三方传播本产品和本产品的任何一部分。
//3、 除符合第2条以外的其他单位和个人需要使用本产品时,必须获得本公司的书面授权。
//4、 获得授权的单位和个人不得转让其获得的授权。
//5、 使用本产品,即表明完全理解本协议的所有条款并全部接受。
// CallDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Call.h"
#include "CallDlg.h"
#include "shpa3api.h"
#include "Big5EditionLab.h"
#include "EnglishEditionLab.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
DWORD g_dwLanguageConversion = 0;
DWORD g_dwCHINESE_SIMPLIFIED = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);
DWORD g_dwCHINESE_TRADITIONAL = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
DWORD g_dwCHINESE_HONGKONG = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG);
void SetEngWinLab(CDialog *pDlg, int item, CString str)
{
CWnd *pWnd = NULL;
pWnd = pDlg->GetDlgItem(item);
pWnd->SetWindowText(str);
}
/////////////////////////////////////////////////////////////////////////////
// CCallDlg dialog
CCallDlg::CCallDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCallDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCallDlg)
m_strErrMsg = _T("");
m_bInited = FALSE;
m_nIPProtocol = -1;
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCallDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCallDlg)
DDX_Control(pDX, IDC_LIST_IPCH, m_IpChList);
DDX_Control(pDX, IDC_LIST_ANALOGCH, m_AnalogChList);
DDX_Control(pDX, IDC_LIST_STATIONCH, m_StationChList);
DDX_Text(pDX, IDC_ERRMSG, m_strErrMsg);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCallDlg, CDialog)
//{{AFX_MSG_MAP(CCallDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_WM_DESTROY()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCallDlg message handlers
BOOL CCallDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// Init Local Language
g_dwLanguageConversion = GetThreadLocale();
if(g_dwLanguageConversion != g_dwCHINESE_SIMPLIFIED)
{
if(g_dwLanguageConversion == g_dwCHINESE_TRADITIONAL
||g_dwLanguageConversion == g_dwCHINESE_HONGKONG)
{
SetThreadLocale(MAKELANGID(LANG_CHINESE, SUBLANG_DEFAULT));
}
else
{
SetThreadLocale(MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT));
}
InitLab();
}
if(!InitCtiSystem())
{
PostQuitMessage(0);
return FALSE;
}
ProtocolType();
InitAllChannel();
InitAnalogChListCtrl();
InitStationChListCtrl();
InitIpChListCtrl();
SetTimer(1000, 50, NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CCallDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CCallDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
///////////////////////////////////////////////////////////////////////////////////////////////
void CCallDlg::OnTimer(UINT nIDEvent)
{
ScanAnalogCh();
UpDateAnalogChListCtrl();
ScanIpCh();
UpDateIpChListCtrl();
UpDateStationChListCtrl();
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
///////////////////////////////////////////////////////////////////////////////////////////////
void CCallDlg::ScanAnalogCh()
{
for( int i=0; i< m_nTotalAnalogCh; i++ )
{
if( !m_AnalogCh[i].bEnCalled ) continue;
m_AnalogCh[i].iLineState = SsmGetChState(m_AnalogCh[i].iChId);
if( m_AnalogCh[i].iLineState == S_CALL_PENDING || m_AnalogCh[i].iLineState == S_CALL_STANDBY) //check if remote station hangup
{
switch( m_AnalogCh[i].Step )
{
case E_STATE_ANALOG_CHECK_PLAY_WELCOM:
{
SsmStopPlayFileList(m_AnalogCh[i].iChId);
break;
}
case E_STATE_ANALOG_CHECK_PLAY_PASSWORD:
case E_STATE_ANALOG_CHECK_REC_START:
case E_STATE_ANALOG_CHECK_PLAY_SELECT:
case E_STATE_ANALOG_CHECK_PLAY_BYEBYE:
{
SsmStopPlayIndex(m_AnalogCh[i].iChId);
break;
}
case E_STATE_ANALOG_CHECK_REC_END:
{
SsmStopRecToFile(m_AnalogCh[i].iChId);
break;
}
case E_STATE_ANALOG_CHECK_PLAY_RECORD:
{
SsmStopPlayFile(m_AnalogCh[i].iChId);
break;
}
case E_STATE_ANALOG_WAIT_STATION_PICKUP:
{
SsmStopRing(m_AnalogCh[i].nStationCh);
SetStationChState(m_AnalogCh[i].nStationCh, E_STATE_STATION_IDLE);
SetStationChTalkWith(m_AnalogCh[i].nStationCh, -1);
m_AnalogCh[i].nStationCh = -1;
break;
}
case E_STATE_ANALOG_WAIT_STATION_HANGUP:
{
SsmStopTalkWith(m_AnalogCh[i].nStationCh,m_AnalogCh[i].iChId);
SetStationChState(m_AnalogCh[i].nStationCh, E_STATE_STATION_IDLE);
SetStationChTalkWith(m_AnalogCh[i].nStationCh, -1);
m_AnalogCh[i].nStationCh = -1;
break;
}
}
SsmHangup(m_AnalogCh[i].iChId);
m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
}
switch( m_AnalogCh[i].Step )
{
case E_STATE_ANALOG_IDLE:
{
if( m_AnalogCh[i].iLineState == S_CALL_RINGING ) //ring detected
{
SsmPickup(m_AnalogCh[i].iChId);
SsmGetCallerId(m_AnalogCh[i].iChId, m_AnalogCh[i].szCallerTelNumber);
m_AnalogCh[i].ulTimeOutCounter = 0;
m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_CONNECT;
}
else
{
memset(m_AnalogCh[i].szCallerTelNumber,0,64);
}
break;
}
case E_STATE_ANALOG_WAIT_CONNECT:
{
if( m_AnalogCh[i].iLineState == S_CALL_TALKING )
{
m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_WELCOM;
}
break;
}
case E_STATE_ANALOG_PLAY_WELCOM:
{
SsmClearFileList(m_AnalogCh[i].iChId);
if (SsmAddToFileList(i,".\\DemoVoc\\cchi.voc",6,0,-1)==-1 ||
SsmAddToFileList(i,".\\DemoVoc\\cchi2.voc",6,0,-1)==-1)
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
if(SsmPlayFileList(m_AnalogCh[i].iChId) == -1)
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_WELCOM;
}
}
}
case E_STATE_ANALOG_CHECK_PLAY_WELCOM:
{
if( SsmCheckPlay(m_AnalogCh[i].iChId) > 0) //end of playing "welcom"
{
m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_SELECT;
}
break;
}
case E_STATE_ANALOG_PLAY_SELECT:
{
SsmSetDtmfStopPlay(m_AnalogCh[i].iChId,1); //enable DTMF-Stop-Play function
if(SsmPlayIndexString(m_AnalogCh[i].iChId, "Menu") == -1)
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
SsmClearRxDtmfBuf(m_AnalogCh[i].iChId);
m_AnalogCh[i].ulTimeOutCounter = 0;
m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_SELECT;
}
break;
}
case E_STATE_ANALOG_CHECK_PLAY_SELECT:
{
if(SsmGetRxDtmfLen(m_AnalogCh[i].iChId) >= 1 && (SsmCheckPlay(m_AnalogCh[i].iChId) == 2 || SsmCheckPlay(m_AnalogCh[i].iChId) == 1))
{
char ch;
SsmGet1stDtmf(m_AnalogCh[i].iChId,&ch);
SsmClearRxDtmfBuf(m_AnalogCh[i].iChId);
switch(ch)
{
case '1': //DTMF=1: record to file "test.voc"
{
if(SsmPlayIndexString(m_AnalogCh[i].iChId,"RecPrompt") == -1) //play "press any key to start, and any key again to stop".
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
m_AnalogCh[i].ulTimeOutCounter = 0;
m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_REC_START;
}
break;
}
case '2'://DTMF=2: play recorded file "test.voc"
{
CFileFind fileFind;
if(fileFind.FindFile(".\\DemocVoc\\test.voc", 0) != 0)
{
if(SsmPlayFile(m_AnalogCh[i].iChId,".\\DemocVoc\\test.voc",6,0,0xFFFFFFFF) == -1)
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_RECORD;
}
}
else
{
if(SsmPlayIndexString(m_AnalogCh[i].iChId,"FileNotFound") == -1) //play "file not found" message
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_RECORD;
}
}
break ;
}
case '3': //DTMF=3: play station's password,some sample digital
{
SsmSetDtmfStopPlay(m_AnalogCh[i].iChId,0); //disable DTMF-Stop-Play function while playing password
if(SsmPlayIndexString(m_AnalogCh[i].iChId,"YourPasswordIs,1,2,3,4") == -1) //play "your password is 1234".
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_PASSWORD;
}
break;
}
case '4': //DTMF=4: connect to an idle station channel
{
int nStationCh = SearchIdleStationCh();
if(nStationCh <= 0)
{
m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_SELECT;
}
else
{
SsmStartRing(nStationCh);
SetStationChState(nStationCh, E_STATE_STATION_RINGING );
SetStationChTalkWith(nStationCh, m_AnalogCh[i].iChId );
m_AnalogCh[i].nStationCh = nStationCh;
m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_STATION_PICKUP;
}
break;
}
case '0': //DTMF=0: end of service,play "Byebye"
{
if ( SsmPlayIndexString(m_AnalogCh[i].iChId, "Byebye" )== -1 )
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_BYEBYE;
}
break;
}
default:
break;
}
}
else
{
if( SsmCheckPlay(m_AnalogCh[i].iChId) > 0) // end of playing "Select"
{
if(++m_AnalogCh[i].ulTimeOutCounter > 100) // wait DTMF key for maximum 10 seconds
{
if ( SsmPlayIndexString( m_AnalogCh[i].iChId, "Byebye" )== -1 )
{
AppErrorHandler(m_AnalogCh[i].iChId);
}
else
{
m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_BYEBYE;
}
}
}
}
break;
}
case E_STATE_ANALOG_CHECK_PLAY_PASSWORD:
{
if(SsmCheckPlay(m_AnalogCh[i].iChId) > 0) //this channel is not playing index now
{
m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_SELECT;
}
break ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -