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

📄 pbxdlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -