LINEINFO.CPP
资源名称:tapi3.zip [点击查看]
上传用户:chinamans
上传日期:2013-03-17
资源大小:202k
文件大小:14k
源码类别:
TAPI编程
开发平台:
Visual C++
- // lineinfo.cpp : implementation file for CLineInfo
- // (c) Dialogic corp 1995, 1996
- #include "stdafx.h"
- #include <tapi.h>
- #include "tapiapp.h"
- #include "tapiline.h"
- #include "tapicall.h"
- #include "talker32.h"
- #include "talkdlg.h"
- #include "callinfo.h"
- #include "lineinfo.h"
- #include "helpid.h"
- #include "wavedlg.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char BASED_CODE THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CLineInfo property page
- IMPLEMENT_DYNCREATE(CLineInfo, CPropertyPage)
- CLineInfo::CLineInfo() : CPropertyPage(CLineInfo::IDD)
- {
- //{{AFX_DATA_INIT(CLineInfo)
- m_csLineInfo = _T("");
- m_fAuto = FALSE;
- m_csDisplayWaveName = _T("");
- m_fAutoPlay = FALSE;
- //}}AFX_DATA_INIT
- m_pParent = NULL;
- m_csWaveName = "play.wav";
- }
- CLineInfo::~CLineInfo()
- {
- }
- void CLineInfo::DoDataExchange(CDataExchange* pDX)
- {
- CPropertyPage::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CLineInfo)
- DDX_Control(pDX, IDC_WAVENAME, m_ctlWaveName);
- DDX_Control(pDX, IDC_AUTOPLAY, m_btnAutoPlay);
- DDX_Control(pDX, IDC_DEVCAPS, m_btnDevCaps);
- DDX_Control(pDX, IDC_AUTOANSWER, m_btnAutoAnswer);
- DDX_Text(pDX, IDC_LINEINFO, m_csLineInfo);
- DDX_Check(pDX, IDC_AUTOANSWER, m_fAuto);
- DDX_Text(pDX, IDC_WAVENAME, m_csDisplayWaveName);
- DDX_Check(pDX, IDC_AUTOPLAY, m_fAutoPlay);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CLineInfo, CPropertyPage)
- //{{AFX_MSG_MAP(CLineInfo)
- ON_BN_CLICKED(IDC_DEVCAPS, OnDevcaps)
- ON_BN_CLICKED(IDC_CONFIG, OnConfig)
- ON_BN_CLICKED(IDC_AUTOANSWER, OnAutoanswer)
- ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
- ON_BN_CLICKED(IDC_GETDEVSTATUS, OnGetdevstatus)
- ON_BN_CLICKED(IDC_AUTOPLAY, OnAutoplay)
- ON_WM_SETFOCUS()
- ON_WM_DESTROY()
- ON_BN_CLICKED(IDC_WAVEFORMAT, OnWaveformat)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- // call lineGetLineDevCaps & display results
- void CLineInfo::DisplayDevCaps()
- {
- LPLINEDEVCAPS lpDC;
- if(m_pLine->ctlLineGetCaps(&lpDC)) return;
- if(lpDC == NULL) return;
- // display status
- m_csLineInfo.Empty();
- CString csTemp;
- csTemp.Format("dwPermanentLineID = %d,rndwAddressModes = %d,rndwGenerateToneModes = %drn",
- lpDC->dwPermanentLineID, lpDC->dwAddressModes, lpDC->dwGenerateToneModes);
- m_csLineInfo += csTemp;
- csTemp.Format("dwMonitorDigitModes = %d,rndwMediaModes = %d,rndwMaxRate = %drn",
- lpDC->dwMonitorDigitModes, lpDC->dwMediaModes, lpDC->dwMaxRate);
- m_csLineInfo += csTemp;
- if(m_pLine->m_csName.IsEmpty())
- csTemp.Format("Line name = %srn", (LPSTR)((LPBYTE)lpDC + lpDC->dwLineNameOffset));
- else
- csTemp.Format("Line name = %srn", m_pLine->m_csName);
- m_csLineInfo += csTemp;
- csTemp.Format("Provider info = %srn", (LPCTSTR)((LPBYTE)lpDC + lpDC->dwProviderInfoOffset));
- m_csLineInfo += csTemp;
- if(m_pLine->IsRemote())
- csTemp.Format("Line is operating on remote machine!rn");
- else
- csTemp.Format("Wave/In ID = %d, Wave/Out ID = %drn", m_pLine->ctlGetWaveInID(), m_pLine->ctlGetWaveOutID());
- m_csLineInfo += csTemp;
- UpdateData(FALSE);
- delete lpDC;
- }
- // call lineGetLineDevStatus & display results
- void CLineInfo::DisplayDevStatus()
- {
- CString csTemp;
- LPLINEDEVSTATUS lpDS = m_pLine->ctlGetLineDevStatus();
- if(lpDS == NULL)
- {
- m_csLineInfo.Format("Status unavailable!rn");
- UpdateData(FALSE);
- return;
- }
- // display status
- m_csLineInfo.Empty();
- csTemp.Format("dwNumOpens = %d,rndwOpenMediaModes = %d,rndwNumActiveCalls = %drn",
- lpDS->dwNumOpens, lpDS->dwOpenMediaModes, lpDS->dwNumActiveCalls);
- m_csLineInfo += csTemp;
- csTemp.Format("dwNumOnHoldCalls = %d,rndwNumOnHoldPendCalls = %d,rndwLineFeatures = %drn",
- lpDS->dwNumOnHoldCalls, lpDS->dwNumOnHoldPendCalls, lpDS->dwLineFeatures);
- m_csLineInfo += csTemp;
- UpdateData(FALSE);
- delete lpDS;
- }
- /////////////////////////////////////////////////////////////////////////////
- // CLineInfo message handlers
- BOOL CLineInfo::OnInitDialog()
- {
- CPropertyPage::OnInitDialog();
- WORD wOptions = ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()];
- if(wOptions & AUTOANSWER) m_fAuto = TRUE;
- if(wOptions & AUTOPLAY) m_fAutoPlay = TRUE;
- FitWaveName();
- if(m_pLine != NULL) DisplayDevStatus();
- m_nFormatID = 10; // default = 11k 8bit PCM
- m_dwRecFileSize = 65534; // default
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
- void CLineInfo::OnDevcaps()
- {
- if(m_pLine==NULL) return;
- if(m_pLine != NULL) DisplayDevCaps();
- }
- void CLineInfo::OnConfig()
- {
- m_pLine->ctlConfigDialog(GetSafeHwnd(), "tapi/line");
- }
- void CLineInfo::OnAutoanswer()
- {
- CString csTemp;
- csTemp.Format("line%d", m_pLine->ctlGetLineID());
- if(m_btnAutoAnswer.GetCheck())
- {
- AfxGetApp()->WriteProfileString(csTemp, "AutoAnswer", "yes");
- ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()] |= AUTOANSWER;
- }
- else
- {
- AfxGetApp()->WriteProfileString(csTemp, "AutoAnswer", "no");
- ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()] &= ~AUTOANSWER;
- }
- UpdateData();
- }
- void CLineInfo::OnAutoplay()
- {
- CString csTemp;
- csTemp.Format("line%d", m_pLine->ctlGetLineID());
- if(m_btnAutoPlay.GetCheck())
- {
- AfxGetApp()->WriteProfileString(csTemp, "AutoPlay", "yes");
- ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()] |= AUTOPLAY;
- }
- else
- {
- AfxGetApp()->WriteProfileString(csTemp, "AutoPlay", "no");
- ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()] &= ~AUTOPLAY;
- }
- UpdateData();
- }
- // Select the wave file to play
- void CLineInfo::OnBrowse()
- {
- CString csTemp;
- csTemp.Format("line%d", m_pLine->ctlGetLineID());
- CString csFilter = "Wave Files(*.wav)|*.wav|All Files(*.*)|*.*||";
- CFileDialog dlg(TRUE, NULL, m_csWaveName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
- (LPCTSTR) csFilter, this);
- if(IDOK == dlg.DoModal())
- {
- m_csWaveName = dlg.GetPathName();
- AfxGetApp()->WriteProfileString(csTemp, "Wave Play File", m_csWaveName);
- FitWaveName();
- UpdateData(FALSE);
- m_pParent->m_CallInfo[0].m_pWaveName = &m_csWaveName;
- }
- DWORD dwDesiredAccess = GENERIC_READ; // access (read-write) mode
- DWORD dwShareMode = 0; // share mode
- LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL; // address of security descriptor
- DWORD dwCreationDistribution = OPEN_EXISTING; // how to create
- HANDLE hF = CreateFile((LPCTSTR)m_csWaveName, dwDesiredAccess,
- dwShareMode, lpSecurityAttributes, dwCreationDistribution, FILE_ATTRIBUTE_NORMAL,NULL);
- if(hF == INVALID_HANDLE_VALUE)
- TRACE("Openfailed err=%dn", GetLastError());
- else CloseHandle(hF);
- }
- // Fit the wave file name into available space
- void CLineInfo::FitWaveName()
- {
- int nChars = 0, nLen, nInd1, nInd2;
- // find out how much space is available
- CDC *pDC = m_ctlWaveName.GetDC();
- if(pDC)
- {
- TEXTMETRIC myTM;
- if(pDC->GetTextMetrics(&myTM))
- {
- CRect cr;
- m_ctlWaveName.GetClientRect(&cr);
- nChars = (cr.right - cr.left)/myTM.tmAveCharWidth;
- }
- m_ctlWaveName.ReleaseDC(pDC);
- }
- if(nChars < 25 || nChars > 40) nChars = 25; // just in case
- nLen = m_csWaveName.GetLength();
- if(nLen <= nChars) // fits already
- {
- m_csDisplayWaveName = m_csWaveName;
- goto FinishFit;
- }
- nInd1 = m_csWaveName.Find('\');
- nInd2 = m_csWaveName.ReverseFind('\');
- if(nInd1 && nInd2 && nInd2 > nInd1) // remove all between ind1 & ind2
- {
- m_csDisplayWaveName = m_csWaveName.Left(nInd1+1) + (LPCTSTR) "..." +m_csWaveName.Right(nLen - nInd2);
- }
- else m_csDisplayWaveName = m_csWaveName;
- FinishFit:
- m_csDisplayWaveName.MakeLower();
- }
- void CLineInfo::OnGetdevstatus()
- {
- DisplayDevStatus();
- }
- void CLineInfo::OnSetFocus(CWnd* pOldWnd)
- {
- CPropertyPage::OnSetFocus(pOldWnd);
- ((CTalkApp *)AfxGetApp())->SetHelpId(HIDD_TALKER32_DialogLineInfo);
- }
- void CLineInfo::OnWaveformat()
- {
- CWaveDlg dlg(this); // bring up the format dialog
- dlg.m_nFormatID = m_nFormatID;
- dlg.m_csFileName = m_csWaveName;
- if(IDOK == dlg.DoModal())
- m_nFormatID = dlg.m_nFormatID;
- }
- /////////////////////////////////////////////////////////////////////////////
- // CInfo
- IMPLEMENT_DYNAMIC(CInfo, CPropertySheet)
- CInfo::CInfo(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
- :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
- {
- m_pbtnClose = NULL;
- m_pbtnHelp = NULL;
- BuildSheet();
- }
- CInfo::CInfo(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage, LPVOID lpLine)
- :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
- {
- m_pbtnClose = NULL;
- m_pbtnHelp = NULL;
- BuildSheet(lpLine);
- }
- CInfo::~CInfo()
- {
- }
- BEGIN_MESSAGE_MAP(CInfo, CPropertySheet)
- //{{AFX_MSG_MAP(CInfo)
- ON_WM_CREATE()
- ON_WM_DESTROY()
- ON_WM_SHOWWINDOW()
- ON_BN_CLICKED(IDCANCEL, OnClose)
- ON_BN_CLICKED(ID_HELP, OnContextHelp)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- void CInfo::BuildSheet(LPVOID lpLine)
- {
- DWORD i;
- CString csTemp;
- OSVERSIONINFO verinfo;
- BOOL bNT = FALSE;
- verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- if(GetVersionEx(&verinfo) &&
- verinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) bNT = TRUE;
- // find out the number of calls; can handle only one for now
- m_LineInfo.m_dwCalls = 0;
- if(lpLine == NULL) return;
- m_LineInfo.m_pLine = (CTapiLine *)lpLine;
- m_LineInfo.m_pParent = this;
- CTapiCall *pCall = m_LineInfo.m_pLine->ctlGetActiveCall();
- if(pCall != NULL)
- {
- m_LineInfo.m_dwCalls = 1;
- m_LineInfo.m_ppCalls[0] = pCall;
- }
- m_LineInfo.m_csLineName.Empty();
- m_LineInfo.m_bRemote = FALSE;
- LPLINEDEVCAPS lpDC;
- if(!m_LineInfo.m_pLine->ctlLineGetCaps(&lpDC)) // extract line name
- {
- if(lpDC != NULL)
- {
- m_LineInfo.m_csLineName.Format("%s", (LPSTR)((LPBYTE)lpDC + lpDC->dwLineNameOffset));
- if(bNT)
- m_LineInfo.m_bRemote = IsLineRemote(lpDC); // find out if line is remote
- delete lpDC;
- }
- }
- // set the wave file name
- csTemp.Format("line%d", m_LineInfo.m_pLine->ctlGetLineID());
- m_LineInfo.m_csWaveName = AfxGetApp()->GetProfileString((LPCTSTR)csTemp, "Wave Play File", "");
- m_LineInfo.m_csWaveRecName = AfxGetApp()->GetProfileString((LPCTSTR)csTemp, "Wave Record File", "");
- if(m_LineInfo.m_csWaveName.IsEmpty()) //
- m_LineInfo.m_csWaveName = "play.wav";
- if(m_LineInfo.m_csWaveRecName.IsEmpty()) //
- m_LineInfo.m_csWaveRecName.Format("record%.2d.wav",m_LineInfo.m_pLine->ctlGetLineID());
- AddPage(&m_LineInfo);
- for(i = 0; i < m_LineInfo.m_dwCalls; i++)
- {
- m_CallInfo[i].m_csCaption.Format("Call %d", i+1);
- m_CallInfo[i].m_pCall = m_LineInfo.m_ppCalls[i];
- m_CallInfo[i].m_pLine = (CTapiLine *)lpLine;
- m_CallInfo[i].m_pWaveName = &m_LineInfo.m_csWaveName;
- m_CallInfo[i].m_pWaveRecName = &m_LineInfo.m_csWaveRecName;
- m_CallInfo[i].m_pLineName = &m_LineInfo.m_csLineName;
- m_CallInfo[i].m_bRemote = m_LineInfo.m_bRemote;
- m_CallInfo[i].m_bRunningOnNT = bNT;
- m_CallInfo[i].m_pnWaveFormatID = &m_LineInfo.m_nFormatID;
- m_CallInfo[i].m_pdwRecFileSize = &m_LineInfo.m_dwRecFileSize;
- AddPage(&m_CallInfo[i]); // where to init call info page?
- }
- }
- void CInfo::CreateCloseButton()
- {
- CRect crctw;
- if(m_pbtnClose) return;
- m_pbtnClose = new CButton;
- m_pbtnHelp = new CButton;
- GetWindowRect(&crctw);
- crctw.InflateRect(10,15);
- MoveWindow(&crctw);
- GetWindowRect(&crctw);
- CRect crctb(crctw.Width()-60, crctw.Height()-50, crctw.Width()-20, crctw.Height()-30);
- m_pbtnClose->Create("Close", BS_PUSHBUTTON, crctb, this, IDCANCEL); //special ID
- CFont *pcfTemp = m_LineInfo.m_btnDevCaps.GetFont(); //a little dirty, but works
- m_pbtnClose->SetFont(pcfTemp);
- m_pbtnClose->ShowWindow(SW_SHOW);
- crctb.left -= 60;
- crctb.right -= 60;
- m_pbtnHelp->Create("Help", BS_PUSHBUTTON, crctb, this, ID_HELP); //special ID
- m_pbtnHelp->SetFont(pcfTemp);
- m_pbtnHelp->ShowWindow(SW_SHOW);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CInfo message handlers
- int CInfo::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CPropertySheet::OnCreate(lpCreateStruct) == -1)
- return -1;
- // CreateCloseButton();
- return 0;
- }
- void CInfo::OnDestroy()
- {
- CPropertySheet::OnDestroy();
- if(m_pbtnClose==NULL) return;
- delete m_pbtnClose;
- m_pbtnClose = NULL;
- delete m_pbtnHelp;
- m_pbtnHelp = NULL;
- }
- void CInfo::OnShowWindow(BOOL bShow, UINT nStatus)
- {
- CPropertySheet::OnShowWindow(bShow, nStatus);
- CreateCloseButton();
- if(m_pbtnClose)
- m_pbtnClose->ShowWindow(SW_SHOW);
- if(m_pbtnHelp)
- m_pbtnHelp->ShowWindow(SW_SHOW);
- }
- void CInfo::OnClose()
- {
- PostMessage(WM_CLOSE,0,0);
- }
- void CInfo::OnContextHelp()
- {
- ((CTalkApp *)AfxGetApp())->OnHelp();
- // CPropertySheet::WinHelp(HIDD_TALKER32_DialogLineInfo, HELP_CONTEXT);
- }
- // Determine if the line is running on the remote computer
- // Since MS doesn't provide a standard way, use whatever mechanism is available for the SP
- // Override this function to implement a better way
- /*** Moved to talker32.cpp
- BOOL IsLineRemote(LPLINEDEVCAPS lpDC)
- {
- int nInd;
- CString csTemp;
- if(!lpDC->dwLineNameOffset) return FALSE;
- csTemp.Format("%s", (LPSTR)((LPBYTE)lpDC + lpDC->dwLineNameOffset));
- csTemp.MakeUpper();
- if(-1 == csTemp.Find("DXXXB")) return FALSE; // non-Dialogic TSP
- if(-1 == (nInd = csTemp.Find("\"))) return FALSE; // computer name not a part of board name
- csTemp = csTemp.Left(nInd);
- char szName[MAX_COMPUTERNAME_LENGTH+1];
- DWORD dwSize = MAX_COMPUTERNAME_LENGTH+1;
- if(!GetComputerName(szName, &dwSize)) return FALSE; // Name unavailable for some reason
- if(!strcmpi(szName, (LPCTSTR)csTemp)) return FALSE; // Same name
- return TRUE; // Finally, the names ARE different
- } ***/