www.pudn.com > dialogic_IVR.rar > AI2001Dlg.cpp


// AI2001Dlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "AI2001.h" 
#include "AI2001Dlg.h" 
#include "setupdlg.h" 
 
//Add header					--------2001/6/30 
#include "Answer.h" 
#include "Mindex.h" 
#include "SourceMonitor.h" 
#include "ServiceDataQueue.h" 
#include "VSInterpreter.h" 
//Add end						--------2001/6/30 
 
#include "export.h" 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
//Add protype					--------2001/6/30 
extern CVSInterpreter vsInterpreter; 
extern int isConnect; 
 
int	 iShow = 0; 
int	 InitAI2001( void ); 
int	 RunAI2001( HWND hWnd ); 
int	 CreatConsole( void ); 
BOOL WINAPI HandlerRoutine( DWORD dwCtrlType ); 
//Add end						--------2001/6/30 
 
extern HANDLE __hStdOut; 
 
int m_ChannelStatus[1441]; 
HICON	hIcon[8]; 
CCriticalSection m_cs; 
int m_iMyWindowFlag=0;//弹出窗口标识 1 子窗口 0 其它应用程序 
int iDrawFlag=0; 
int m_iCurrNo=0; 
int m_iStatusNo=0; 
int m_iTotal=0; 
int m_iFlag=0; 
 
extern int maxchans; 
 
 
///////////////////////////////////////////////////////////////////////////// 
// 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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAI2001Dlg dialog 
 
CAI2001Dlg::CAI2001Dlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CAI2001Dlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CAI2001Dlg) 
		// 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 CAI2001Dlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAI2001Dlg) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
	DDX_Control(pDX, IDC_BUTTON_START, m_btnStart); 
	DDX_Control(pDX, IDC_BUTTON_EXIT, m_btnExit); 
	DDX_Control(pDX, IDC_BUTTON_SCRIPT, m_btnScript); 
	DDX_Control(pDX, IDC_BUTTON_SETUP, m_btnSetup); 
	DDX_Control(pDX, IDC_BUTTON_CONSOLE, m_btnConsole); 
	DDX_Control(pDX, IDC_BUTTON_SIMUIVR, m_btnSimuIvr ); 
} 
 
BEGIN_MESSAGE_MAP(CAI2001Dlg, CDialog) 
	//{{AFX_MSG_MAP(CAI2001Dlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_WM_ACTIVATE() 
	ON_COMMAND(ID_MENUITEM_ONHOOK, OnMenuitemOnhook) 
	ON_WM_MOUSEMOVE() 
	ON_WM_CREATE() 
	ON_BN_CLICKED(IDC_BUTTON_EXIT, OnButtonExit) 
	ON_BN_CLICKED(IDC_BUTTON_SETUP, OnButtonSetup) 
	ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart) 
	ON_WM_RBUTTONDOWN() 
	ON_WM_LBUTTONDBLCLK() 
	ON_WM_MOVE() 
	ON_COMMAND(ID_MENUITEM_SCRIPT, OnMenuitemScript) 
	ON_WM_CLOSE() 
	ON_BN_CLICKED(IDC_BUTTON_CONSOLE, OnButtonConsole) 
	ON_BN_CLICKED(IDC_BUTTON_SCRIPT, OnButtonScript) 
	ON_COMMAND(ID_MENUITEM_RESET, OnMenuitemReset) 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_BUTTON_SIMUIVR, OnButtonSimuivr) 
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_IVR, OnSelchangeTabIvr) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAI2001Dlg message handlers 
 
BOOL CAI2001Dlg::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 
	//读取图标 
	m_btnStart.SetIcon(IDI_START);  
	m_btnConsole.SetIcon(IDI_CONSOLE);  
	m_btnScript.SetIcon(IDI_SCRIPT);  
	m_btnSetup.SetIcon(IDI_SETUP);  
	m_btnSimuIvr.SetIcon(IDI_SIMUIVR);  
	m_btnExit.SetIcon(IDI_EXIT);  
 
	hIcon[0] = AfxGetApp()->LoadIcon(IDI_WHITE); 
	hIcon[1] = AfxGetApp()->LoadIcon(IDI_CYAN); 
	hIcon[7] = AfxGetApp()->LoadIcon(IDI_GREEN); 
	hIcon[2] = AfxGetApp()->LoadIcon(IDI_YELLOW); 
	hIcon[3] = AfxGetApp()->LoadIcon(IDI_RED); 
	hIcon[4] = AfxGetApp()->LoadIcon(IDI_BLACK); 
	hIcon[5] = AfxGetApp()->LoadIcon(IDI_BLUE); 
	hIcon[6] = AfxGetApp()->LoadIcon(IDI_PURPLE); 
	 
	for (int i=0;i<7;i++) 
		SetIcon(hIcon[i],TRUE); 
 
	CTabCtrl *pTab=(CTabCtrl *)GetDlgItem(IDC_TAB_IVR); 
 
	TC_ITEM tcItem;//添加标签 
	tcItem.mask=TCIF_TEXT; 
 
	//---------------------------------------------------- 
	//insert sub1 dlg 
	//---------------------------------------------------- 
	tcItem.pszText = "模块一"; 
	pTab->InsertItem(0,&tcItem); 
	m_sub1Dlg.Create(IDD_DIALOG_PANE1,pTab); 
	//------------------------------------- 
	tcItem.pszText = "模块二"; 
	pTab->InsertItem(1,&tcItem); 
	m_sub2Dlg.Create(IDD_DIALOG_PANE2,pTab); 
	//----------------------------------- 
	tcItem.pszText = "模块三"; 
	pTab->InsertItem(2,&tcItem); 
	m_sub3Dlg.Create(IDD_DIALOG_PANE3,pTab); 
	//------------------------------------ 
	tcItem.pszText = "模块四"; 
	pTab->InsertItem(3, &tcItem); 
	m_sub4Dlg.Create(IDD_DIALOG_PANE4,pTab); 
	 
	pTab->SetCurSel(0);	 
	m_sub1Dlg.ShowWindow(SW_SHOW); 
 
	InitAI2001(); 
	 
	SetTimer( 1, 500, NULL ); 
 
	int nTime = GetPrivateProfileInt("TIMESLICE", "time", 10, ".\\setup.ini"); 
 
	SetTimer( 2, nTime*1000, NULL ); 
   // Sleep(1000); 
	int run = GetPrivateProfileInt("Auto_Run", "run",1,".\\setup.ini"); 
	if(run) 
		OnButtonStart(); 
 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CAI2001Dlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		m_iMyWindowFlag=1; 
		dlgAbout.DoModal(); 
		m_iMyWindowFlag=0; 
	} 
	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 CAI2001Dlg::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 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		dc.SetMapMode(MM_ANISOTROPIC); 
		dc.SetWindowExt(400,400); 
		dc.SetViewportExt(dc.GetDeviceCaps(LOGPIXELSX), 
				dc.GetDeviceCaps(LOGPIXELSY)); 
		int i,j,iChannelNo; 
		int iResult,x,y; 
		switch(iDrawFlag)       //0:初始状态 1:更改局部状态-offhook2onhook 2:更改局部状态-onhook2offhook 3.更改局部状态-err status  
		{ 
			case 0: 
				dc.DrawIcon(240, 1290, hIcon[1]); 
				dc.DrawIcon(240+400, 1290, hIcon[2]); 
				dc.DrawIcon(240+780, 1290, hIcon[3]); 
				dc.DrawIcon(240+1170, 1290, hIcon[0]); 
				//iDrawFlag = 4; 
				break; 
		} 
 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CAI2001Dlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
int ChannelNoToPoint(int iChannelNo, int &x, int &y) 
{ 
	if (iChannelNo > 360) return -1; 
	int i,j; 
	i = iChannelNo % 30; 
	j = iChannelNo / 30; 
	if (i != 0) 
	{ 
		x = BEGIN_X + (i - 1) * INTERVAL_X; 
		y = BEGIN_Y + j * INTERVAL_Y; 
	} 
	else 
	{ 
		x = BEGIN_X + 29 * INTERVAL_X; 
		y = BEGIN_Y + (j - 1) * INTERVAL_Y; 
	} 
	 
	return 0; 
} 
 
int PointToChannelNo(CPoint point) 
{ 
	int i,j; 
	if (point.x * SCALE < BEGIN_X || point.y * SCALE < BEGIN_Y || point.y * SCALE > (BEGIN_Y+INTERVAL_Y*12) || point.x * SCALE > (BEGIN_X+30*INTERVAL_X)) 
		return 0; 
	else 
	{ 
	i = (int)(point.x * SCALE - BEGIN_X) / INTERVAL_X;//col number 
		j = (int)(point.y * SCALE - BEGIN_Y) / INTERVAL_Y;//row number 
		if (point.x > (i*INTERVAL_X+BEGIN_X)/SCALE && point.x < (BEGIN_X+32+i*INTERVAL_X)/SCALE &&  
			point.y > (j*INTERVAL_Y+BEGIN_Y)/SCALE && point.y < (BEGIN_Y+32+j*INTERVAL_Y)/SCALE &&  
			i < 30)	 
			return (j*30+i+1); 
		else 
			return 0; 
	} 
} 
 
 
void CAI2001Dlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)  
{ 
	CDialog::OnActivate(nState, pWndOther, bMinimized); 
	 
	 
	// TODO: Add your message handler code here 
	if (nState == WA_INACTIVE && m_iMyWindowFlag == 0) 
	{ 
		this->ShowWindow(SW_MINIMIZE); 
		m_iMyWindowFlag = 0; 
	} 
 
	iDrawFlag = 0;	 
} 
 
void CAI2001Dlg::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CDialog::OnMouseMove(nFlags, point); 
} 
 
int CAI2001Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CDialog::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	// TODO: Add your specialized creation code here 
	m_StatusBarCtl.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM|SBARS_SIZEGRIP, 
          CRect(0,0,0,0), this, ID_MY_STATUS_BAR); 
	 
	int nParts = 4; 
	CRect rect; 
	char sTemp[200]; 
	int iFlag = GetPrivateProfileString("CHANNEL", "MAXCHANS", NULL, sTemp, sizeof(sTemp), ".\\Setup.ini");	 
	if(iFlag == 0) 
	{ 
		AfxMessageBox("Please set the channelnumber in the setup.ini first!"); 
		return -1; 
	} 
 
	m_StatusBarCtl.GetClientRect(&rect); 
	int widths[4] = { rect.right/4, rect.right/2, rect.right*3/4, -1 }; 
	m_StatusBarCtl.SetParts(4, widths ); 
 
	m_iTotal = atoi(sTemp); 
	 
 
	sprintf(sTemp,"总端口数: %d",m_iTotal); 
	m_StatusBarCtl.SetText(sTemp,0,0); 
	m_StatusBarCtl.SetText("呼入次数: 0",1,0); 
	m_StatusBarCtl.SetText("呼出次数: 0",2,0); 
	m_StatusBarCtl.SetText("联机状态: 0",3,0); 
 
	//获取运行时间 
	CTime	tFirstTime; 
	tFirstTime = CTime::GetCurrentTime(); 
	strcpy(sTemp,tFirstTime.Format("AI2001 Professional - [ 启动时间:%Y-%m-%d %H:%M:%S ]")); 
	this->SetWindowText( sTemp ); 
 
	//初始化通道状态 0 无效通道 1 待机状态 2 通话状态 3 故障状态 
	int i; 
	for(i=0;i<1001;i++) 
		m_ChannelStatus[i] = 0; 
 
	for(i=0;i<=m_iTotal;i++) 
		m_ChannelStatus[i] = 1; 
	 
	return 0; 
} 
 
 
void CAI2001Dlg::OnButtonExit()  
{ 
	// TODO: Add your control notification handler code here 
	 
	SendMessage(WM_CLOSE); 
	//CDialog::OnOK(); 
} 
 
void CAI2001Dlg::OnButtonSetup()  
{ 
	// TODO: Add your control notification handler code here 
	CSetupDlg setup; 
	m_iMyWindowFlag=1; 
	setup.DoModal(); 
	m_iMyWindowFlag=0; 
} 
 
void CAI2001Dlg::OnButtonStart()  
{ 
	// TODO: Add your control notification handler code here 
	if (m_iFlag == 0) 
	{ 
		if( RunAI2001( this->m_hWnd ) != 0 ) 
		{ 
			//AfxMessageBox("Start failed", MB_ICONEXCLAMATION); 
			return; 
		} 
		//m_btnStart.EnableWindow( FALSE ); 
		m_btnStart.SetIcon(IDI_STOP);  
		m_btnStart.SetWindowText("停止"); 
		m_btnSimuIvr.EnableWindow(TRUE);    //刷新脚本按钮 
		UpdateData(FALSE); 
		m_iFlag = 1; 
	} 
	else 
	{ 
		SendMessage(WM_CLOSE); 
		/* 
		if (!SetEvent(ghDLGCEvent)) // unsuccessful 
		{ 
			AfxMessageBox("Stop failed", MB_ICONEXCLAMATION); 
			return; 
		} 
		m_btnStart.SetIcon(IDI_START);  
		m_btnStart.SetWindowText("启动"); 
		UpdateData(FALSE); 
		m_iFlag = 0; 
		*/ 
	} 
} 
 
void CAI2001Dlg::OnRButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	m_iCurrNo = PointToChannelNo(point); 
	if (m_iCurrNo != 0 && (m_iCurrNo <= m_iTotal))  
	{ 
		CMenu menu; 
		CRect rect; 
		this->GetWindowRect(rect); 
		menu.LoadMenu(IDR_MYMENU); 
		 
		char szTemp[20]; 
		sprintf(szTemp,"通道号:%d",m_iCurrNo); 
		menu.ModifyMenu(0, MF_BYCOMMAND, 0, szTemp); 
 
		menu.EnableMenuItem(ID_MENUITEM_ONHOOK,MF_ENABLED); 
		if (m_ChannelStatus[m_iCurrNo] != 2) 
			menu.EnableMenuItem(ID_MENUITEM_ONHOOK,MF_GRAYED); 
		menu.EnableMenuItem(ID_MENUITEM_RESET,MF_ENABLED); 
		if (m_ChannelStatus[m_iCurrNo] != 3) 
			menu.EnableMenuItem(ID_MENUITEM_RESET,MF_GRAYED); 
		menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,rect.left+point.x+5,rect.top+point.y+30,this); 
	} 
 
	CDialog::OnRButtonDown(nFlags, point); 
} 
 
void CAI2001Dlg::OnLButtonDblClk(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	/*	 
	if (m_iCurrNo != 0 && m_iCurrNo <= m_iTotal && m_ChannelStatus[m_iCurrNo] == 1)  
	{ 
		m_cs.Lock(); 
		m_ChannelStatus[m_iCurrNo] = 2; 
		m_cs.Unlock(); 
		iDrawFlag = 2; 
		m_iStatusNo = m_iCurrNo; 
		wprintf("channelno:%d",m_iCurrNo); 
		Invalidate(FALSE);    
		UpdateWindow(); 
	} 
	*/ 
	CDialog::OnLButtonDblClk(nFlags, point); 
} 
 
void CAI2001Dlg::OnMove(int x, int y)  
{ 
	CDialog::OnMove(x, y); 
	 
	// TODO: Add your message handler code here 
	iDrawFlag=0; 
} 
 
int InitAI2001( void ) 
{ 
	if ((ghDLGCEvent = CreateEvent( 
		NULL,	// pointer to security attributes, we use default 
		FALSE,	// flag for manual reset event, we choose auto-reset 
		FALSE,	// flag for initial state, we choose unsignalled 
		NULL)	// pointer to event-object name, we choose no name 
		) == NULL)// failure 
	{ 
		AfxMessageBox("ghDLGCEvent = CreateEvent failed", MB_ICONEXCLAMATION); 
		return -1; 
    } 
 
	GetPrivateProfileString("PATH", "SYSPATH", "\\Pansr\\Voc\\", SVocDir, 128, ".\\Setup.ini" ); 
	GetPrivateProfileString("PATH", "USRPATH", "\\Pansr\\Voc\\", GVocDir, 128, ".\\Setup.ini" ); 
	GetPrivateProfileString("PATH", "FAXPATH","\\Pansr\\Fax\\", SFaxDir, 128, ".\\Setup.ini" ); 
 
	char  combvox[128] = ".\\combvox.ini"; 
 
	int unit, tlen ; 
	CMindex *mindex = new CMindex; 
 
	mindex->InitCombvox( combvox, "MANDARIN" ); 
	unit =  mindex->GetCount(); 
	tlen =  mindex->GetCombBufLen(); 
	pCombIdx[0]    =  new IDXINFO[unit]; 
	pCombBuf[0]    =  new char[tlen]; 
	memcpy( (char *)pCombIdx[0], mindex->GetCombIdx(), unit*sizeof(IDXINFO) ); 
	memcpy( pCombBuf[0], mindex->GetCombBuf(), tlen ); 
	CombCount[0]    =  unit; 
	mindex->ResetComb(); 
 
	mindex->InitCombvox( combvox, "CANTONESE" ); 
	unit =  mindex->GetCount(); 
	tlen =  mindex->GetCombBufLen(); 
	pCombIdx[1]    =  new IDXINFO[unit]; 
	pCombBuf[1]    =  new char[tlen]; 
	memcpy( (char *)pCombIdx[1], mindex->GetCombIdx(), unit*sizeof(IDXINFO) ); 
	memcpy( pCombBuf[1], mindex->GetCombBuf(), tlen ); 
	CombCount[1]    =  unit; 
	mindex->ResetComb(); 
 
	mindex->ReadEnglish( combvox, "ENGLISH" ); 
	unit =  mindex->GetCount(); 
	tlen =  mindex->GetCombBufLen(); 
	pCombIdx[2]    =  new IDXINFO[unit]; 
	pCombBuf[2]    =  new char[tlen]; 
	memcpy( (char *)pCombIdx[2], mindex->GetCombIdx(), unit*sizeof(IDXINFO) ); 
	memcpy( pCombBuf[2], mindex->GetCombBuf(), tlen ); 
	CombCount[2]    =  unit; 
	mindex->ResetComb(); 
 
	delete mindex; 
 
	pSilenceBuf = new char[16000]; 
	memset( pSilenceBuf, 0x08, 16000 ); 
	 
	maxchans = GetPrivateProfileInt("CHANNEL", "MAXCHANS", 4, ".\\Setup.ini" ); 
	frontend = GetPrivateProfileInt("CHANNEL", "FRONTEND", 2, ".\\Setup.ini" ); 
	 
	char  faxtype[12] = ""; 
 
	GetPrivateProfileString("CHANNEL", "FAXRES", "VFAX",faxtype,12, ".\\Setup.ini" ); 
	 
	if( stricmp( faxtype, "GFAX" ) == 0 )  
	{ 
		gammfax  = 1; 
		faxchans = GetPrivateProfileInt("GFAX", "FAXCHANS", 0, ".\\Setup.ini" ); 
		faxbdnum = GetPrivateProfileInt("GFAX", "FAXBDNUM", 0, ".\\Setup.ini" ); 
	} 
	else  
	{ 
		gammfax = 0; 
		faxchans = GetPrivateProfileInt("VFAX", "FAXCHANS", 0, ".\\Setup.ini" ); 
		faxbdnum = GetPrivateProfileInt("VFAX", "FAXBDNUM", 0, ".\\Setup.ini" ); 
	} 
 
	msichans = GetPrivateProfileInt("MSI", "MSICHANS", 0, ".\\Setup.ini" ); 
	msibdnum = GetPrivateProfileInt("MSI", "MSIBDNUM", 0, ".\\Setup.ini" ); 
 
	warnspan = GetPrivateProfileInt("WARN", "WARNSPAN", 4, ".\\Setup.ini" ); 
	stopspan = GetPrivateProfileInt("WARN", "STOPSPAN", 6, ".\\Setup.ini" ); 
	warntype = GetPrivateProfileInt("WARN", "WARNTYPE", 0, ".\\Setup.ini" ); 
 
	return 0; 
} 
 
int RunAI2001( HWND hWnd ) 
{ 
	int chdev; 
 
	if((chdev = dx_open("dxxxB1C1", 0)) == -1) 
	{ 
		m_iMyWindowFlag=1; 
		AfxMessageBox("Dialogic Service is not running! \r\nPlease first run it!", MB_ICONEXCLAMATION ); 
		m_iMyWindowFlag=0; 
		return -1; 
	} 
	else 
	{ 
		dx_close(chdev); 
	} 
 
	DeleteFile("SourceMonitor.inf"); 
 
	if (!ResetEvent(ghDLGCEvent)) // make sure ghDLGCEvent is unsignalled 
	{ 
		AfxMessageBox("Reset event failed in OnDlgcButton", MB_ICONEXCLAMATION ); 
		return -1; 
	} 
 
	//-----Run VSInterpreter thread 
	// 
	struct VSInterpreterThreadParam *pvsInterpreter; 
	pvsInterpreter = (struct VSInterpreterThreadParam *)malloc(sizeof(VSInterpreterThreadParam)); 
	 
	memset( (char *)pvsInterpreter, 0x0, sizeof(VSInterpreterThreadParam) ); 
	 
	pvsInterpreter->iChannelCount = maxchans; 
	//初始化 
	strcpy(pvsInterpreter->aszInstructionFileName, "d:\\ai2001\\script\\vscript_isee.ini" ); 
	if( !AfxBeginThread(VSInterpreterThread,(LPVOID)pvsInterpreter) ) 
	{ 
		AfxMessageBox("AfxBeginThread VSInterpreter failed.", MB_ICONEXCLAMATION); 
		return -1; 
	} 
	 
	Sleep(1000);	//等待CONSOLE创建完毕 
				 
	//-----Run Dialogic thread 
	// 
	ARG_STRUCT  m_args; 
	 
	m_args.hWnd     = hWnd; 
	m_args.d4xbdnum = 1; 
	m_args.dtibdnum = 1; 
	m_args.maxchans = maxchans; 
	m_args.faxbdnum = faxbdnum; 
	m_args.faxchans = faxchans; 
	m_args.msibdnum = msibdnum; 
	m_args.msichans = msichans; 
 
	m_args.frontend = frontend; 
	m_args.scbus    = TRUE; 
	m_args.routeag  = TRUE; 
	m_args.boardtag = FALSE; 
 
	if (!AfxBeginThread(RunDialogic,(LPVOID)&m_args)) 
	{ 
		AfxMessageBox("AfxBeginThread RunDialogic failed.", MB_ICONEXCLAMATION); 
		return -1; 
	} 
	 
	Sleep(4000); 
 
	return 0; 
} 
 
void CAI2001Dlg::OnCancel()  
{ 
	// TODO: Add your message handler code here and/or call default 
	 
	//CDialog::OnCancel(); 
} 
 
void CAI2001Dlg::OnClose()  
{ 
	// TODO: Add your message handler code here and/or call default 
	if(AfxMessageBox("您确实要退出吗?" ,MB_YESNO|MB_DEFBUTTON2) == IDYES) 
	{ 
		SetEvent(ghDLGCEvent); 
		Sleep(4000); 
		 
		CDialog::OnOK(); 
	} 
	//CDialog::OnClose(); 
} 
 
void CAI2001Dlg::OnButtonConsole()  
{ 
	// TODO: Add your control notification handler code here 
	if( __hStdOut == NULL )	 
	{ 
		CreatConsole(); 
 
		iDrawFlag = 0; 
		Invalidate(FALSE);    
		UpdateWindow(); 
	} 
	else 
	{ 
		__hStdOut = NULL; 
		FreeConsole(); 
	} 
} 
 
BOOL WINAPI HandlerRoutine( DWORD dwCtrlType ) 
{ 
	__hStdOut = NULL; 
	FreeConsole(); 
	return TRUE; 
} 
  
int CreatConsole( void ) 
{ 
	AllocConsole(); 
	SetConsoleTitle("Console Window"); 
	__hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);	 
	COORD co = {100, 100}; 
	SetConsoleScreenBufferSize(__hStdOut, co);	 
	SetConsoleCtrlHandler( HandlerRoutine, TRUE ); 
 	CWnd *pwnd = AfxGetMainWnd(); 
	SetForegroundWindow(pwnd->m_hWnd); 
 
	return 0; 
} 
 
 
void CAI2001Dlg::OnButtonScript()  
{ 
	// TODO: Add your control notification handler code here 
	if( m_iFlag == 0 ) return; 
		 
	if( !iShow ) 
	{ 
		vsInterpreter.m_psourceMonitor->ShowWindow( SW_SHOW ); 
		iShow = 1; 
	} 
	else 
	{ 
		vsInterpreter.m_psourceMonitor->ShowWindow( SW_HIDE ); 
		iShow = 0; 
	} 
} 
 
BOOL CAI2001Dlg::PreTranslateMessage(MSG* pMsg)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
 
	switch(pMsg->message) 
	{ 
	case WM_DLGC_STATE: 
		if (pMsg->lParam == ST_ERROR) 
		{ 
			m_ChannelStatus[pMsg->wParam] = 3;     
			iDrawFlag = 3; 
		} 
		else if(pMsg->lParam == ST_WTRING ||pMsg->lParam == ST_ONHOOK) 
		{ 
			m_ChannelStatus[pMsg->wParam] = 1; 
			iDrawFlag = 1; 
		} 
		else 
		{ 
			m_ChannelStatus[pMsg->wParam] = 2; 
			iDrawFlag = 2; 
		} 
		m_iStatusNo=pMsg->wParam; 
		wprintf("channelno:%d    state:%d",pMsg->wParam,pMsg->lParam); 
		if(m_iStatusNo>0&&m_iStatusNo<=360) 
		{ 
			m_sub1Dlg.Invalidate(FALSE);    
			m_sub1Dlg.UpdateWindow(); 
		} 
		if(m_iStatusNo>360&&m_iStatusNo<=720) 
		{ 
			m_sub2Dlg.Invalidate(FALSE);    
			m_sub2Dlg.UpdateWindow(); 
		} 
		if(m_iStatusNo>720&&m_iStatusNo<=1080) 
		{ 
			m_sub3Dlg.Invalidate(FALSE);    
			m_sub3Dlg.UpdateWindow(); 
		} 
		if(m_iStatusNo>1080&&m_iStatusNo<=1140) 
		{ 
			m_sub4Dlg.Invalidate(FALSE);    
			m_sub4Dlg.UpdateWindow(); 
		} 
	/*	if(m_iStatusNo<=360) 
			::SendMessage(m_sub1Dlg.m_hWnd, WM_PAINT,0,0); 
		if(m_iStatusNo>360 && m_iStatusNo<=720) 
			::SendMessage(m_sub2Dlg.m_hWnd, WM_PAINT, 0,0); 
		if(m_iStatusNo>720 && m_iStatusNo<=1080) 
			::SendMessage(m_sub3Dlg.m_hWnd, WM_PAINT, 0,0); 
		if(m_iStatusNo>1080 && m_iStatusNo<=1440) 
			::SendMessage(m_sub4Dlg.m_hWnd, WM_PAINT, 0,0); 
*/ 
		 
		break; 
 
	case WM_KEYDOWN:   //屏蔽回车键 
		if(pMsg->wParam == VK_RETURN) 
			return TRUE; 
  
	 case WM_DLGC_STOPPED: 
	 case WM_DLGC_CODE: 
	 default: 
		break; 
	 } 
	return CDialog::PreTranslateMessage(pMsg); 
} 
 
void CAI2001Dlg::OnMenuitemOnhook()  
{ 
	// TODO: Add your command handler code here 
	/* 
	SendMessage(WM_POP_STATE, m_iCurrNo, 1 ); 
 
	m_cs.Lock(); 
	m_ChannelStatus[m_iCurrNo]=1; 
	m_cs.Unlock(); 
	m_iStatusNo = m_iCurrNo; 
	iDrawFlag = 1; 
	Invalidate(FALSE);    
	UpdateWindow(); 
	*/ 
 
} 
 
void CAI2001Dlg::OnMenuitemReset()  
{ 
	// TODO: Add your command handler code here 
	SendMessage(WM_POP_STATE, m_iCurrNo, 2 ); 
} 
 
void CAI2001Dlg::OnMenuitemScript()  
{ 
	// TODO: Add your command handler code here 
	SendMessage(WM_POP_STATE, m_iCurrNo, 3 ); 
} 
 
 
void CAI2001Dlg::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	char aszTemp[100]=""; 
	switch( nIDEvent ) 
	{ 
	case 1: 
		if( m_iFlag != 1 ) return; 
 
		sprintf(aszTemp, "呼入次数: %d", vsInterpreter.m_iCountOfTurnOnOfTotal_In ); 
		m_StatusBarCtl.SetText(aszTemp, 1, 0); 
		sprintf(aszTemp, "呼出次数: %d", vsInterpreter.m_iCountOfTurnOnOfTotal_Out ); 
		m_StatusBarCtl.SetText(aszTemp, 2, 0); 
		sprintf(aszTemp, "联机状态: %d", isConnect ); 
		m_StatusBarCtl.SetText(aszTemp, 3, 0); 
		break; 
	 
	case 2: 
		Ccs_sr_Connect(); 
		break; 
	 
	default: 
		break; 
	} 
	 
	CDialog::OnTimer(nIDEvent); 
} 
 
//更新脚本, 
//add by lj 2003/05/21 
void CAI2001Dlg::OnButtonSimuivr()  
{ 
	//将内存中脚本文件重新读入内存 
	/********************************************************* 
	将m_vsFileBufferList(BUFFER末尾有0结束)中已经load进内存的所有文件 
	重新load一次。     
	重新load script.ini中引用的所有脚本到内存 
	------add by lj 2003/05/22 
*********************************************************/ 
	int j; 
 
	struct CurrentState *pcurrentState; 
	FILE *file; 
	int iFileSize; 
 
	for(int i=0; iaszInstructionFile, "rb"); 
		if(file == NULL) 
		{ 
			wprintf_err1("In LoadVSFileToBuffer_Refresh(%d) can not open %s", i, pcurrentState->aszInstructionFile); 
			return; 
		} 
		fseek(file, SEEK_SET, SEEK_END); 
		 
		iFileSize = ftell(file) + 1;	//在末尾增加一个0 
		fseek(file, SEEK_SET, SEEK_SET); 
		char *szFileBuf; 
		szFileBuf = (char *)malloc(iFileSize); 
		if(fread(szFileBuf, sizeof(char), iFileSize, file) != iFileSize - 1) 
		{ 
			wprintf_err1("In LoadVSFileToBuffer_Refresh(%d), fread(%s) failed", i, pcurrentState->aszInstructionFile); 
			return; 
		} 
		szFileBuf[iFileSize - 1] = 0; 
		fclose(file); 
 
		//检查这个通道的脚本文件是否已被调入内存 
		for(j = 0; j < vsInterpreter.m_vsFileBufList.iCount; j ++) 
		{ 
			if(stricmp((vsInterpreter.m_vsFileBufList.vsFileBuf)[j].aszVSFileName, pcurrentState->aszInstructionFile) == 0) 
				break; 
		} 
		if(j < vsInterpreter.m_vsFileBufList.iCount) 
		{//已被调入过 
			//刷新调入内存中的VSFILE 
			free((vsInterpreter.m_vsFileBufList.vsFileBuf)[j].szFileBuf);	//释放原来的内存 
			(vsInterpreter.m_vsFileBufList.vsFileBuf)[j].szFileBuf = szFileBuf; 
			continue ; 
		} 
		 
		//未被调入过,则调入内存 
		vsInterpreter.m_vsFileBufList.iCount ++; 
		vsInterpreter.m_vsFileBufList.vsFileBuf = (struct VSFileBuf *)realloc(vsInterpreter.m_vsFileBufList.vsFileBuf, vsInterpreter.m_vsFileBufList.iCount * sizeof(struct VSFileBuf)); 
		(vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].szFileBuf = szFileBuf; 
		(vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].iFileBufLen = iFileSize; 
		strcpy((vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].aszVSFileName, pcurrentState->aszInstructionFile); 
	} 
	 
	//将script.ini中引用的子script调入内存 
	char szFileName[100] = "\0"; 
	char aszTempKey[100] = "\0"; 
	int len; 
     
	CStdioFile fTemp; 
    CString strTemp; 
	int nStart, nEnd; 
	if(fTemp.Open(".\\script.ini",CFile::modeRead) == 0) 
		return; 
	while( fTemp.ReadString(strTemp) ) 
	{ 
		if((nStart=strTemp.Find('=')) != -1 && (nEnd=strTemp.Find('#')) != -1) 
		{ 
			memset(szFileName, 0x0, 100); 
			memset(aszTempKey, 0x0, 100); 
			strcpy(szFileName, strTemp.Mid(nStart+1, nEnd-nStart-1 )); 
			if( szFileName[0] != '\\' && szFileName[1] != ':' ) 
			{ 
				GetCurrentDirectory(100, aszTempKey); 
				len = strlen(aszTempKey); 
				if( aszTempKey[len-1] != '\\' ) 
				{ 
					strcat( aszTempKey, "\\Script\\" ); 
					strcat( aszTempKey, szFileName ); 
				} 
				strcpy( szFileName, aszTempKey ); 
			} 
 
			if((file = fopen(szFileName, "rb")) == NULL) 
			{ 
				continue; 
			} 
 
			fseek(file, SEEK_SET, SEEK_END); 
 
			 
			iFileSize = ftell(file) + 1;	//在末尾增加一个0 
			fseek(file, SEEK_SET, SEEK_SET); 
			char* szIniBuf; 
			szIniBuf = (char *)malloc(iFileSize); 
			if(fread(szIniBuf, sizeof(char), iFileSize, file) != iFileSize - 1) 
			{ 
				wprintf_err1("In LoadVSFileToBuffer_Refresh(%d), fread(%s) failed", i, pcurrentState->aszInstructionFile); 
				return ; 
			} 
			szIniBuf[iFileSize - 1] = 0; 
			fclose(file); 
			//写到内存文件,先检查是否已经调入内存 
 
			for(j = 0; j < vsInterpreter.m_vsFileBufList.iCount; j ++) 
			{ 
				if(stricmp((vsInterpreter.m_vsFileBufList.vsFileBuf)[j].aszVSFileName, szFileName) == 0) 
					break; 
			} 
			if(j < vsInterpreter.m_vsFileBufList.iCount) 
			{//已被调入过 
				//刷新调入内存中的VSFILE 
				free((vsInterpreter.m_vsFileBufList.vsFileBuf)[j].szFileBuf);	//释放原来的内存 
				(vsInterpreter.m_vsFileBufList.vsFileBuf)[j].szFileBuf = szIniBuf; 
				(vsInterpreter.m_vsFileBufList.vsFileBuf)[j].iFileBufLen = iFileSize; 
				continue ; 
			} 
			 
			//未被调入过,则调入内存 
			vsInterpreter.m_vsFileBufList.iCount ++; 
			vsInterpreter.m_vsFileBufList.vsFileBuf = (struct VSFileBuf *)realloc(vsInterpreter.m_vsFileBufList.vsFileBuf, vsInterpreter.m_vsFileBufList.iCount * sizeof(struct VSFileBuf)); 
			(vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].szFileBuf = szIniBuf; 
			(vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].iFileBufLen = iFileSize; 
			strcpy((vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].aszVSFileName, szFileName); 
 
		} 
	} 
	fTemp.Close(); 
	 
	return ; 
	 
} 
//end add 
 
void CAI2001Dlg::OnSelchangeTabIvr(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	CTabCtrl *pTab=(CTabCtrl *)GetDlgItem(IDC_TAB_IVR); 
	 
	int nPage=pTab->GetCurSel(); 
    if(nPage==0) 
	{ 
		iDrawFlag = 0;   //初始化 
		m_sub2Dlg.ShowWindow(SW_HIDE); 
		m_sub3Dlg.ShowWindow(SW_HIDE); 
		m_sub4Dlg.ShowWindow(SW_HIDE); 
		m_sub1Dlg.ShowWindow(SW_SHOW); 
		::SendMessage(m_sub1Dlg.m_hWnd, WM_PAINT, 0, 0); 
		 
 
	}	 
	if(nPage==1) 
	{ 
		iDrawFlag = 0;       //初始化 
		m_sub1Dlg.ShowWindow(SW_HIDE); 
		m_sub3Dlg.ShowWindow(SW_HIDE); 
		m_sub4Dlg.ShowWindow(SW_HIDE); 
		m_sub2Dlg.ShowWindow(SW_SHOW); 
		::SendMessage(m_sub2Dlg.m_hWnd, WM_PAINT, 0, 0); 
		 
	}	 
	if(nPage==2) 
	{ 
		iDrawFlag = 0;	 
		m_sub2Dlg.ShowWindow(SW_HIDE); 
		m_sub1Dlg.ShowWindow(SW_HIDE); 
		m_sub4Dlg.ShowWindow(SW_HIDE); 
		m_sub3Dlg.ShowWindow(SW_SHOW); 
		::SendMessage(m_sub3Dlg.m_hWnd, WM_PAINT, 0, 0); 
	 
	} 
	if(nPage==3) 
	{ 
		iDrawFlag = 0; 
		m_sub2Dlg.ShowWindow(SW_HIDE); 
		m_sub3Dlg.ShowWindow(SW_HIDE); 
		m_sub1Dlg.ShowWindow(SW_HIDE); 
		m_sub4Dlg.ShowWindow(SW_SHOW); 
		::SendMessage(m_sub4Dlg.m_hWnd, WM_PAINT, 0, 0);	 
	} 
 
	 
	*pResult = 0; 
}