📄 pbxdlg.cpp
字号:
// pbxDlg.cpp : implementation file
//
#include "stdafx.h"
#include "pbx.h"
#include "pbxDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "../../../../api/vc6.0/inc/SHPA3API.h"
#define MAX_CH 400
#define MAX_PHONUM_LIST 400
typedef struct tagLIST_PARA{
int ColumnWidth;
char szText[100];
}LIST_PARA, *PLIST_PARA;
typedef struct tagPHONUM_LIST{
int nCh;
char szPhoNum[16];
}PHONUM_LIST, *PPHONUM_LIST;
typedef struct tagCH_INFO{
int nChType;
int nOldChState;
char szOldDtmf[300];
int Step;
int nToTrkCh;
int nToUserCh;
int InUse;
unsigned long dwTimeOut;
int PhoNumLen;
char pPhoNumBuf[21];
char szUserNumber[50];
CString pCallerId;
}CH_INFO;
int nIsSsmStartCtiOK=0,nMaxCh=0;
CH_INFO ChInfo[MAX_CH];
PHONUM_LIST PhoNumList[MAX_PHONUM_LIST];
char szStr[1000];
int PhoNumToUserCh(char* pszPhoNum)
{
for(int i=0; i<MAX_PHONUM_LIST; i++)
{
if(strcmp(PhoNumList[i].szPhoNum,pszPhoNum) == 0) return PhoNumList[i].nCh;
}
return -1;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPbxDlg dialog
CPbxDlg::CPbxDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPbxDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPbxDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CPbxDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPbxDlg)
DDX_Control(pDX, IDC_CHLIST, m_ChList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPbxDlg, CDialog)
//{{AFX_MSG_MAP(CPbxDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPbxDlg message handlers
#define MAX_CHLIST_ITEM 9
enum{
ITEM_Ch,
ITEM_ChHwType,
ITEM_ChState ,
ITEM_ChStateKeepTime,
ITEM_PhoneNumber,
ITEM_CallerId,
ITEM_RxDTMF,
ITEM_PendReason,
ITEM_BlockReason,
};
BOOL CPbxDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
nIsSsmStartCtiOK = SsmStartCti("ShConfig.ini", "ShIndex.ini");
if(nIsSsmStartCtiOK != 0)
{
SsmGetLastErrMsg(szStr);
AfxMessageBox(szStr, MB_OK, 0);
PostQuitMessage(0);
return FALSE;
}
if(SsmGetMaxUsableBoard() != SsmGetMaxCfgBoard())
{
SsmGetLastErrMsg(szStr);
AfxMessageBox(szStr, MB_OK, 0);
PostQuitMessage(0);
return FALSE;
}
LV_COLUMN lvcChList[MAX_CHLIST_ITEM];
LIST_PARA MainList[MAX_CHLIST_ITEM] =
{
{24 ,"Ch",},
{80 ,"Type"},
{60 ,"State"},
{60 ,"StateKeepTime"},
{80 ,"CalledId"},
{80 ,"CallerId"},
{100 ,"DTMFRcvBuffer"},
{160,"Pending"},
{160,"BlockCause"},
};
for(int i=0; i<MAX_CHLIST_ITEM; i++ )
{
lvcChList[i].mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT;
lvcChList[i].iSubItem = i;
lvcChList[i].pszText = MainList[i].szText;
lvcChList[i].cx = MainList[i].ColumnWidth;
lvcChList[i].fmt = LVCFMT_RIGHT;
m_ChList.InsertColumn(i,&lvcChList[i]);
}
nMaxCh = SsmGetMaxCh();
CFileFind ff;
LPCTSTR lpAppName = "PBX";
char KeyName[50];
BOOL bPbxIni = TRUE;
int ch;
char szConfig[200];
GetCurrentDirectory(200,szConfig);
strcat(szConfig,"\\pbx.ini");
for( ch=0, i = 0; ch<nMaxCh; ch++)
{
int nDirection;
m_ChList.InsertItem(ch,_itoa(ch,szStr,10));
ChInfo[ch].InUse = 0;
ChInfo[ch].nToTrkCh = -1;
ChInfo[ch].nToUserCh = -1;
ChInfo[ch].Step = USER_IDLE;
ChInfo[ch].nChType = SsmGetChType(ch);
ChInfo[ch].nOldChState = -2;
switch(ChInfo[ch].nChType)
{
case 0: wsprintf(szStr,"Analog"); break;
case 1: wsprintf(szStr,"Station"); break;
case 2:
if( bPbxIni )
{
wsprintf(KeyName,"UserChPhoNum[%d]",i);
GetPrivateProfileString(lpAppName, KeyName, "XXXXXXXX", PhoNumList[i].szPhoNum, 16, szConfig);
PhoNumList[i].nCh = ch;
}
else
{
wsprintf(KeyName,"20%02d",i);
strcpy(PhoNumList[i].szPhoNum ,KeyName);
PhoNumList[i].nCh = ch;
}
wsprintf(szStr,"Station %s",PhoNumList[i].szPhoNum);
strcpy(ChInfo[ch].szUserNumber,PhoNumList[i].szPhoNum);
i++;
break;
case 3: wsprintf(szStr,"Record"); break;
case 4:
SsmEnableAutoSendKB(ch,TRUE);
if(SsmGetAutoCallDirection(ch,&nDirection) == 0) wsprintf(szStr,"SS1");
else if(nDirection==0) wsprintf(szStr,"SS1i");
else if(nDirection==1) wsprintf(szStr,"SS1o");
else wsprintf(szStr,"SS1io");
break;
case 5: wsprintf(szStr,"Fax"); break;
case 6:
SsmEnableAutoSendKB(ch,FALSE);
if(SsmGetAutoCallDirection(ch,&nDirection) == 0) wsprintf(szStr,"SS7");
else if(nDirection==0) wsprintf(szStr,"TUPi");
else if(nDirection==1) wsprintf(szStr,"TUPo");
else if(nDirection==2) wsprintf(szStr,"TUPio");
else wsprintf(szStr,"TUP-x");
break;
case 7:
SsmGetAutoCallDirection(ch,&nDirection);
if(nDirection==0) wsprintf(szStr,"ISDNiUserSide");
else if(nDirection==1) wsprintf(szStr,"ISDNoUserSide");
else if(nDirection==2) wsprintf(szStr,"ISDNioUserSide");
else wsprintf(szStr,"ISDN-x");
break;
case 8:
SsmGetAutoCallDirection(ch,&nDirection);
if(nDirection==0) wsprintf(szStr,"ISDNiNetSide");
else if(nDirection==1) wsprintf(szStr,"ISDNoNetSide");
else if(nDirection==2) wsprintf(szStr,"ISDNioNetSide");
else wsprintf(szStr,"ISDN-x");
break;
case 11:
SsmEnableAutoSendKB(ch,FALSE);
if(SsmGetAutoCallDirection(ch,&nDirection) == 0) wsprintf(szStr,"SS7");
else if(nDirection==0) wsprintf(szStr,"ISUPi");
else if(nDirection==1) wsprintf(szStr,"ISUPo");
else if(nDirection==2) wsprintf(szStr,"ISUPio");
else wsprintf(szStr,"ISUP-x");
break;
default:
wsprintf(szStr,""); break;
break;
}
m_ChList.SetItemText( ch, ITEM_ChHwType, szStr);
}
//ReadConfigFile("pbx.ini");
SetTimer(1,200,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CPbxDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 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 CPbxDlg::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();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPbxDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CPbxDlg::OnTimer(UINT nIDEvent)
{
char cNewStat[600], cOldStat[600];;
char szPhoNum[50];
int nNewChState;
char tmpstr[30];
int nToTrkCh,nToUserCh;
int nDialResult;
int nPhoNumLen;
int nChState;
for(int ch=0; ch<nMaxCh; ch++)
{
if((nNewChState=SsmGetChState(ch)) != ChInfo[ch].nOldChState)
{
ChInfo[ch].nOldChState = nNewChState;
switch(nNewChState)
{
case -1: wsprintf(cNewStat,"-1"); break;
case S_CALL_UNAVAILABLE: wsprintf(cNewStat,"Unavailable"); break;
case S_CALL_LOCKED: wsprintf(cNewStat,"CallLocked"); break;
case S_CALL_STANDBY: wsprintf(cNewStat,"Idle"); break;
case S_CALL_PICKUPED: wsprintf(cNewStat,"OffHook"); break;
case S_CALL_RINGING: wsprintf(cNewStat,"Ringing"); break;
case S_CALL_TALKING: wsprintf(cNewStat,"Talking"); break;
case S_CALL_ANALOG_WAITDIALTONE: wsprintf(cNewStat,"WtDialTone"); break;
case S_CALL_ANALOG_TXPHONUM: wsprintf(cNewStat,"Dling.."); break;
case S_CALL_ANALOG_WAITDIALRESULT: wsprintf(cNewStat,"WtDlleResult"); break;
case S_CALL_PENDING: wsprintf(cNewStat,"Pending"); break;
case S_CALL_OFFLINE: wsprintf(cNewStat,"OffLine"); break;
case S_CALL_WAIT_REMOTE_PICKUP: wsprintf(cNewStat,"Ringback"); break;
case S_CALL_LocalBlock: wsprintf(cNewStat,"LocalBlocked"); break;
case S_CALL_RemoteBlock: wsprintf(cNewStat,"RemoteBlocked"); break;
case S_CALL_Ss1InWaitPhoNum: wsprintf(cNewStat,"WaitCalledId"); break;
case S_CALL_Ss1InWaitFwdStop: wsprintf(cNewStat,"WaitFwdSendStop"); break;
case S_CALL_Ss1InWaitCallerID: wsprintf(cNewStat,"WaitCallerId"); break;
case S_CALL_Ss1InWaitKD: wsprintf(cNewStat,"WaitKD"); break;
case S_CALL_Ss1InWaitKDStop: wsprintf(cNewStat,"WaitStopKD"); break;
case S_CALL_SS1_SAYIDLE: wsprintf(cNewStat,"SendFreeIndicateSignaling"); break;
case S_CALL_SS1WaitIdleCAS: wsprintf(cNewStat,"WaitRemoteFreeIndicateSignaling"); break;
case S_CALL_SS1PhoNumHoldup: wsprintf(cNewStat,"RebundantNumberIntercept"); break;
case S_CALL_Ss1InWaitStopSendA3p: wsprintf(cNewStat,"WaitStopA3p"); break;
case S_CALL_Ss1OutWaitBwdAck: wsprintf(cNewStat,"WaitBackwardSeizureACK"); break;
case S_CALL_Ss1OutTxPhoNum: wsprintf(cNewStat,"SendCalledId"); break;
case S_CALL_Ss1OutWaitAppendPhoNum: wsprintf(cNewStat,"WaitApplicationAppendPhoNum"); break;
case S_CALL_Ss1OutTxCallerID: wsprintf(cNewStat,"SendCallerId"); break;
case S_CALL_Ss1OutWaitKB: wsprintf(cNewStat,"WaitKB"); break;
case S_CALL_Ss1OutDetectA3p: wsprintf(cNewStat,"DetectA3p(pulse)"); break;
case S_TUP_WaitPcmReset: wsprintf(cNewStat,"CircuitReset"); break;
case S_TUP_WaitSAM: wsprintf(cNewStat,"WaitSAM"); break;
case S_TUP_WaitGSM: wsprintf(cNewStat,"WaitGSM"); break;
case S_TUP_WaitCLF: wsprintf(cNewStat,"WaitCLF"); break;
case S_TUP_WaitRLG: wsprintf(cNewStat,"WaitRLG"); break;
case S_TUP_WaitPrefix: wsprintf(cNewStat,"RecPrefix"); break;
case S_TUP_WaitDialAnswer: wsprintf(cNewStat,"WaitAnswer"); break;
case S_ISUP_WaitSAM: wsprintf(cNewStat,"WaitSAM"); break;
case S_ISUP_WaitRLC: wsprintf(cNewStat,"WaitRLC"); break;
case S_ISUP_WaitReset: wsprintf(cNewStat,"CircuitRest"); break;
case S_ISUP_LocallyBlocked: wsprintf(cNewStat,"LocalBlocked"); break;
case S_ISUP_RemotelyBlocked: wsprintf(cNewStat,"RemoteBlocked"); break;
case S_ISUP_WaitDialAnswer: wsprintf(cNewStat,"WaitDialAnswer"); break;
case S_ISUP_WaitINF: wsprintf(cNewStat,"WaitCallerId"); break;
case S_ISDN_OUT_WAIT_NET_RESPONSE: wsprintf(cNewStat,"ISDN:WaitNetResponse"); break;
case S_ISDN_OUT_PLS_APPEND_NO: wsprintf(cNewStat,"ISDN:ToAppendPhoNum"); break;
case S_ISDN_IN_CHK_CALL_IN: wsprintf(cNewStat,"ISDN:InboundCallDetected"); break;
case S_ISDN_IN_RCVING_NO: wsprintf(cNewStat,"ISDN:RecevingPhoNum"); break;
case S_ISDN_IN_WAIT_TALK: wsprintf(cNewStat,"ISDN:ReadyForTalking"); break;
case S_ISDN_OUT_WAIT_ALERT: wsprintf(cNewStat,"ISDN: WaitAlertSignal"); break;
case S_ISDN_CALL_BEGIN: wsprintf(cNewStat,"ISDN:NewCallDetected "); break;
case S_ISDN_WAIT_HUANGUP: wsprintf(cNewStat,"ISDN: WaitReleaseComplete"); break;
default: wsprintf(cNewStat,"S=%d",nNewChState); break;
}
m_ChList.SetItemText( ch, ITEM_ChState, cNewStat );
}
if( ChInfo[ch].nOldChState == S_CALL_STANDBY )
{
strcpy(cNewStat,"");
m_ChList.SetItemText( ch, ITEM_CallerId, cNewStat );
}
else
{
m_ChList.GetItemText( ch, ITEM_CallerId, tmpstr, 29 ) ; //display caller ID
if ( tmpstr != ChInfo[ch].pCallerId )
m_ChList.SetItemText( ch, ITEM_CallerId, ChInfo[ch].pCallerId );
}
if(SsmGetDtmfStr(ch,cNewStat) != -1)
{
if(strcmp(ChInfo[ch].szOldDtmf,cNewStat) != 0)
{
strcpy(ChInfo[ch].szOldDtmf,cNewStat);
m_ChList.SetItemText( ch, ITEM_RxDTMF, cNewStat );
}
}
// State keep time
if( ChInfo[ch].nOldChState == S_CALL_STANDBY )
{
strcpy(cNewStat,"");
m_ChList.SetItemText( ch, ITEM_RxDTMF, cNewStat );
}
else
_itoa(SsmGetChStateKeepTime(ch),cNewStat,10);
m_ChList.GetItemText(ch, ITEM_ChStateKeepTime, cOldStat ,600);
if( strcmp(cOldStat,cNewStat) )
{
m_ChList.SetItemText( ch, ITEM_ChStateKeepTime, cNewStat );
}
if(ChInfo[ch].nOldChState == S_CALL_PENDING)
{
switch(SsmGetPendingReason(ch) )
{
case -1:
wsprintf(cNewStat,"FailedCall");
break;
case ANALOGOUT_NO_DIALTONE:
wsprintf(cNewStat,"NoDialTone");
break;
case ANALOGOUT_BUSYTONE:
wsprintf(cNewStat,"DialToneDetectedAfterAutoDial");
break;
case ANALOGOUT_ECHO_NOVOICE:
wsprintf(cNewStat,"SilenceAfterRingbackTone");
break;
case ANALOGOUT_NOANSWER:
wsprintf(cNewStat,"NoAnswer");
break;
case ANALOGOUT_TALKING_REMOTE_HANGUPED:
wsprintf(cNewStat,"-1");
break;
case ANALOGOUT_NOVOICE:
wsprintf(cNewStat,"-1");
break;
case PEND_WaitBckStpMsg:
wsprintf(cNewStat,"WaitAppSetKB");
break;
case SS1IN_BWD_KB5:
wsprintf(cNewStat,"-1");
break;
case PEND_RemoteHangupOnTalking:
wsprintf(cNewStat,"CalleeHangup");
break;
case PEND_AutoDialFailed:
wsprintf(cNewStat,"-1");
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -