📄 pbxdlg.cpp
字号:
lvc.iSubItem = 2;
cString.LoadString(IDS_PBX20);
lvc.pszText = (LPTSTR)(LPCTSTR)cString;
lvc.cx = ColumnWidth[2];
m_StationChList.InsertColumn(2, &lvc);
lvc.iSubItem = 3;
cString.LoadString(IDS_PBX21);
lvc.pszText = (LPTSTR)(LPCTSTR)cString;
lvc.cx = ColumnWidth[3];
m_StationChList.InsertColumn(3, &lvc);
lvc.iSubItem = 4;
cString.LoadString(IDS_PBX22);
lvc.pszText = (LPTSTR)(LPCTSTR)cString;
lvc.cx = ColumnWidth[4];
m_StationChList.InsertColumn(4, &lvc);
char szChId[3];
for(int i=0; i<m_nTotalStationCh; i++)
{
m_StationChList.InsertItem(i, _itoa(m_StationCh[i].nChId, szChId, 10));
m_StationChList.SetItemText(i, 1, m_StationCh[i].szStationNum);
cString.LoadString(IDS_PBX23);
m_StationChList.SetItemText(i, 2, cString);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
// 函数说明:初始化日志列表控件
///////////////////////////////////////////////////////////////////////////////////////////////
void CPBXDlg::InitLogListCtrl()
{
CString cString;
m_LogList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
COLORREF cr = 0x000000;
m_LogList.SetBkColor(cr);
m_LogList.SetTextBkColor(cr);
COLORREF cr1 = 0x00ff00;
m_LogList.SetTextColor(cr1);
int ColumnWidth[4] = {70, 80, 130, 750};
LV_COLUMN lvc;
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
cString.LoadString(IDS_PBX24);
lvc.pszText = (LPTSTR)(LPCTSTR)cString;
lvc.cx = ColumnWidth[0];
m_LogList.InsertColumn(0, &lvc);
lvc.iSubItem = 1;
cString.LoadString(IDS_PBX25);
lvc.pszText = (LPTSTR)(LPCTSTR)cString;
lvc.cx = ColumnWidth[1];
m_LogList.InsertColumn(1, &lvc);
lvc.iSubItem = 2;
cString.LoadString(IDS_PBX26);
lvc.pszText = (LPTSTR)(LPCTSTR)cString;
lvc.cx = ColumnWidth[2];
m_LogList.InsertColumn(2, &lvc);
lvc.iSubItem = 3;
cString.LoadString(IDS_PBX27);
lvc.pszText = (LPTSTR)(LPCTSTR)cString;
lvc.cx = ColumnWidth[3];
m_LogList.InsertColumn(3, &lvc);
}
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
// 函数说明:程序退出时卸载板卡
///////////////////////////////////////////////////////////////////////////////////////////////
void CPBXDlg::OnDestroy()
{
CDialog::OnDestroy();
SsmCloseCti();
}
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
// 函数说明:消息处理函数,接收底层通道状态信息和自定义消息
///////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CPBXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
CString cString;
int nIndex = -1; // 在相应通道数组中的索引值
int nEventCode; // 事件号
if(message > WM_USER)
{
nEventCode = message - WM_USER; // 取得事件代码
switch(nEventCode)
{
case E_SYS_TIMEOUT: // 定时器超时事件
{
int i;
// 根据定时器标识号搜索模拟通道数组
for(i = 0; i < m_nTotalAnalogCh; i++)
{
if(wParam == (WPARAM)m_AnalogCh[i].nTimer)
{
nIndex = i;
AnalogProc(nEventCode, nIndex, lParam);
UpdateAnalogChListCtrl(nIndex);
break;
}
}
// 如果在模拟通道数组中没搜到,继续搜索IP通道
if(nIndex == -1)
{
// 根据定时器标识号搜索IP通道数组
for(i = 0; i < m_nTotalIpCh; i++)
{
if(wParam == (WPARAM)m_IpCh[i].nTimer)
{
nIndex = i;
IpProc(nEventCode, nIndex, lParam);
UpdateIpChListCtrl(nIndex);
break;
}
}
}
// 如果在模拟通道和IP通道都没搜到,则搜索座席通道
if(nIndex == -1)
{
// 根据定时器标识号搜索座席通道数组
for(i = 0; i < m_nTotalStationCh; i++)
{
if(wParam == (WPARAM)m_StationCh[i].nTimer)
{
nIndex = i;
StationProc(nEventCode, nIndex, lParam);
UpdateStationChListCtrl(nIndex);
break;
}
}
}
ASSERT(nIndex != -1);
break;
}
case E_CHG_HookState:
case E_CHG_RcvDTMF:
case E_CHG_FlashCount:
case E_CHG_ChState:
case E_US_SEIZURE:
case E_US_RELEASE:
case E_US_SEIZURE_ACK_IDLE:
case E_US_SEIZURE_ACK_BUSY:
case E_US_PICKUP:
case E_US_SEIZURE_TK:
case E_TK_SEIZURE_TK_ACK_IDLE:
case E_TK_SEIZURE_TK_ACK_BUSY:
case E_TK_RELEASE:
case E_US_DTMF2TK:
case E_TK_DIAL_OK:
case E_TK_DIAL_FAIL:
case E_TK_REMOTE_NOANSWER:
case E_TK_REMOTE_PICKUP:
case E_US_SEIZURE_IP:
case E_IP_SEIZURE_IP_ACK_IDLE:
case E_IP_SEIZURE_IP_ACK_BUSY:
case E_IP_RELEASE:
case E_US_DTMF2IP:
case E_IP_DIAL_OK:
case E_IP_DIAL_FAIL:
case E_IP_REMOTE_NOANSWER:
case E_IP_REMOTE_PICKUP:
case E_MSG_RELEASE:
case E_MSG_FLASH:
case E_MSG_CONNECT:
case E_MSG_HANGUP:
case F_US_SEIZURE:
{
int nChId = wParam; // 通道号
int nType = SsmGetChType(nChId); // 通道类型
switch(nType)
{
// 模拟通道
case 0:
{
nIndex = FindIndexByAnalogChId(nChId);
ASSERT(nIndex != -1);
AnalogProc(nEventCode, nIndex, lParam);
UpdateAnalogChListCtrl(nIndex);
break;
}
// 座席通道
case 2:
{
nIndex = FindIndexByStationChId(nChId);
ASSERT(nIndex != -1);
StationProc(nEventCode, nIndex, lParam);
UpdateStationChListCtrl(nIndex);
break;
}
// IP通道
case PROTOCOL_H323:
case PROTOCOL_SIP:
{
nIndex = FindIndexByIpChId(nChId);
ASSERT(nIndex != -1);
IpProc(nEventCode, nIndex, lParam);
UpdateIpChListCtrl(nIndex);
break;
}
default:
{
cString.LoadString(IDS_PBX28);
LogToList(LOGTYPE_INFORMATION, m_StationCh[nIndex].nChId, (LPTSTR)(LPCTSTR)cString);
break;
}
}
break;
}
default:
return CDialog::WindowProc(message, wParam, lParam);
break;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
// 函数说明:处理座席通道消息
///////////////////////////////////////////////////////////////////////////////////////////////
void CPBXDlg::StationProc(UINT event, int nIndex, LPARAM lParam)
{
CString cString;
DWORD dwDtmfLen; // 收到DTMF码的长度
UCHAR dwDtmfNum; // 收到DTMF码
LONG nHook; // nHook:0 表示座席挂机;1 表示座席摘机
char szVoicePath[MAX_PATH]; // 声音文件目录
int nToneType = -2; // 信号音类型
int nToneChResult; // 信号音检测结果
int nPlayResult; // 存放SsmCheckPlay的返回值
switch(event)
{
/*+++++++++驱动消息+++++++++*/
case E_CHG_HookState: // 座席摘挂机事件
{
nHook = lParam;
if(nHook == 0) // 座席挂机
{
cString.LoadString(IDS_PBX29);
LogToList(LOGTYPE_INFORMATION, m_StationCh[nIndex].nChId, (LPTSTR)(LPCTSTR)cString, m_StationCh[nIndex].szStationNum);
switch(m_StationCh[nIndex].nStatus)
{
case STATION_GET_1STDTMF:
{
// 关闭T1
if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
break;
}
case STATION_GET_DTMF:
{
// 关闭T2
if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
break;
}
case STATION_REQ_STATION:
{
// 发送E_US_RELEASE
SendMessage(WM_USER+E_US_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
break;
}
case STATION_RING_BACK:
{
// 向Ch-k通道发送E_US_RELEASE
SendMessage(WM_USER+E_US_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
break;
}
case STATION_TALKING:
{
// 断开总线
if(SsmStopTalkWith(m_StationCh[nIndex].nChId, m_StationCh[nIndex].nLinkToChId) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
// 向连接方发送E_MSG_RELEASE
SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
break;
}
case STATION_WAIT_HANGUP:
break;
case STATION_REQ_ANALOG:
break;
case STATION_DIALOUT_WITH_ANALOG:
{
//关闭T3
if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
// 外线模拟通道发送E_TK_RELEASE
SendMessage(WM_USER+E_TK_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
break;
}
case STATION_WAIT_REMOTE_ANALOG_PICKUP:
{
// 外线模拟通道,发送E_TK_RELEASE
SendMessage(WM_USER+E_TK_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
break;
}
case STATION_DIALOUT_WITH_IP:
{
// 关闭T3
if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
// IP通道,发送E_IP_RELEASE
SendMessage(WM_USER+E_IP_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
break;
}
case STATION_WAIT_REMOTE_IP_PICKUP:
{
// IP通道,则发送E_IP_RELEASE
SendMessage(WM_USER+E_IP_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
break;
}
case STATION_REQ_IP:
{
// 是否还在播放选择语音
int iRet = SsmCheckPlay(m_StationCh[nIndex].nChId);
if(iRet == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
if(!iRet)
{
if(SsmStopPlay(m_StationCh[nIndex].nChId) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
}
break;
}
case STATION_F_WAIT_TALK:
{
// 停背景音乐
nPlayResult = SsmCheckPlay(m_StationCh[nIndex].nChId);
if(nPlayResult != -1)
{
if(nPlayResult == 0)
{
if(SsmStopPlayFile(m_StationCh[nIndex].nChId) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
}
}
else
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
// E_MSG_HANGUP→ch1
SendMessage(WM_USER+E_MSG_HANGUP, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
break;
}
case STATION_F_GET_DTMF:
{
// 关闭T4
if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
// E_MSG_RELEASE→ch0
if(!m_StationCh[nIndex].bSubmiteChHookFlag)
{
SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nChId);
}
break;
}
case STATION_F_REQ_STATION:
{
// E_MSG_RELEASE→ch0
if(!m_StationCh[nIndex].bSubmiteChHookFlag)
{
SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nChId);
}
break;
}
case STATION_F_RING_BACK:
{
// E_US_RELEASE→ch2
SendMessage(WM_USER+E_US_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
// E_MSG_RELEASE→ch0
if(!m_StationCh[nIndex].bSubmiteChHookFlag)
{
SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nChId);
}
break;
}
case STATION_F_TALKING:
{
// 断开总线(ch1,ch2)
if(SsmStopTalkWith(m_StationCh[nIndex].nChId, m_StationCh[nIndex].nLinkToChId) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
if(!m_StationCh[nIndex].bSubmiteChHookFlag) // Ch0挂机Flag==0?
{
// 找到Ch1连接方的索引号,也就是 Ch2的索引号
int ch2Index = FindIndexByStationChId(m_StationCh[nIndex].nLinkToChId);
// 将Ch2的连接方设置为Ch0
m_StationCh[ch2Index].nLinkToChId = m_StationCh[nIndex].nSaveSubmiteCh;
// E_MSG_CONNECT→ch0 给Ch0发送重新连接信息
SendMessage(WM_USER+E_MSG_CONNECT, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nLinkToChId);
// 连接原通话方和转移目标方(ch0,ch2)
if(SsmTalkWith(m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nLinkToChId) == -1)
{
AppErrorHandler(m_StationCh[nIndex].nChId);
}
m_StationCh[ch2Index].bPressFlag = FALSE;
}
else
{
// E_MSG_RELEASE→ch2,如果Ch0 已经挂机,则指示Ch2也挂机
SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
}
break;
}
case STATION_F_OPERATE:
{
if(!m_StationCh[nIndex].bSubmiteChHookFlag)
{
// E_MSG_RELEASE→ch0
SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nChId);
}
break;
}
default:
break;
}// end of switch for m_StationCh[nIndex].nStatus
// 清空通道DTMF缓冲区
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -