LINEINFO.CPP
上传用户:chinamans
上传日期:2013-03-17
资源大小:202k
文件大小:14k
源码类别:

TAPI编程

开发平台:

Visual C++

  1. // lineinfo.cpp : implementation file for CLineInfo
  2. // (c) Dialogic corp 1995, 1996
  3. #include "stdafx.h"
  4. #include <tapi.h>
  5. #include "tapiapp.h"
  6. #include "tapiline.h"
  7. #include "tapicall.h"
  8. #include "talker32.h"
  9. #include "talkdlg.h"
  10. #include "callinfo.h"
  11. #include "lineinfo.h"
  12. #include "helpid.h"
  13. #include "wavedlg.h"
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char BASED_CODE THIS_FILE[] = __FILE__;
  17. #endif
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CLineInfo property page
  20. IMPLEMENT_DYNCREATE(CLineInfo, CPropertyPage)
  21. CLineInfo::CLineInfo() : CPropertyPage(CLineInfo::IDD)
  22. {
  23. //{{AFX_DATA_INIT(CLineInfo)
  24. m_csLineInfo = _T("");
  25. m_fAuto = FALSE;
  26. m_csDisplayWaveName = _T("");
  27. m_fAutoPlay = FALSE;
  28. //}}AFX_DATA_INIT
  29. m_pParent = NULL;
  30. m_csWaveName = "play.wav";
  31. }
  32. CLineInfo::~CLineInfo()
  33. {
  34. }
  35. void CLineInfo::DoDataExchange(CDataExchange* pDX)
  36. {
  37. CPropertyPage::DoDataExchange(pDX);
  38. //{{AFX_DATA_MAP(CLineInfo)
  39. DDX_Control(pDX, IDC_WAVENAME, m_ctlWaveName);
  40. DDX_Control(pDX, IDC_AUTOPLAY, m_btnAutoPlay);
  41. DDX_Control(pDX, IDC_DEVCAPS, m_btnDevCaps);
  42. DDX_Control(pDX, IDC_AUTOANSWER, m_btnAutoAnswer);
  43. DDX_Text(pDX, IDC_LINEINFO, m_csLineInfo);
  44. DDX_Check(pDX, IDC_AUTOANSWER, m_fAuto);
  45. DDX_Text(pDX, IDC_WAVENAME, m_csDisplayWaveName);
  46. DDX_Check(pDX, IDC_AUTOPLAY, m_fAutoPlay);
  47. //}}AFX_DATA_MAP
  48. }
  49. BEGIN_MESSAGE_MAP(CLineInfo, CPropertyPage)
  50. //{{AFX_MSG_MAP(CLineInfo)
  51. ON_BN_CLICKED(IDC_DEVCAPS, OnDevcaps)
  52. ON_BN_CLICKED(IDC_CONFIG, OnConfig)
  53. ON_BN_CLICKED(IDC_AUTOANSWER, OnAutoanswer)
  54. ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
  55. ON_BN_CLICKED(IDC_GETDEVSTATUS, OnGetdevstatus)
  56. ON_BN_CLICKED(IDC_AUTOPLAY, OnAutoplay)
  57. ON_WM_SETFOCUS()
  58. ON_WM_DESTROY()
  59. ON_BN_CLICKED(IDC_WAVEFORMAT, OnWaveformat)
  60. //}}AFX_MSG_MAP
  61. END_MESSAGE_MAP()
  62. // call lineGetLineDevCaps & display results
  63. void CLineInfo::DisplayDevCaps()
  64. {
  65. LPLINEDEVCAPS lpDC;
  66. if(m_pLine->ctlLineGetCaps(&lpDC)) return;
  67. if(lpDC == NULL) return;
  68. // display status
  69. m_csLineInfo.Empty();
  70. CString csTemp;
  71. csTemp.Format("dwPermanentLineID = %d,rndwAddressModes = %d,rndwGenerateToneModes = %drn",
  72. lpDC->dwPermanentLineID, lpDC->dwAddressModes, lpDC->dwGenerateToneModes);
  73. m_csLineInfo += csTemp;
  74. csTemp.Format("dwMonitorDigitModes = %d,rndwMediaModes = %d,rndwMaxRate = %drn",
  75. lpDC->dwMonitorDigitModes, lpDC->dwMediaModes, lpDC->dwMaxRate);
  76. m_csLineInfo += csTemp;
  77. if(m_pLine->m_csName.IsEmpty())
  78. csTemp.Format("Line name = %srn", (LPSTR)((LPBYTE)lpDC + lpDC->dwLineNameOffset));
  79. else
  80. csTemp.Format("Line name = %srn", m_pLine->m_csName);
  81. m_csLineInfo += csTemp;
  82. csTemp.Format("Provider info = %srn", (LPCTSTR)((LPBYTE)lpDC + lpDC->dwProviderInfoOffset));
  83. m_csLineInfo += csTemp;
  84. if(m_pLine->IsRemote())
  85. csTemp.Format("Line is operating on remote machine!rn");
  86. else
  87. csTemp.Format("Wave/In ID = %d, Wave/Out ID = %drn", m_pLine->ctlGetWaveInID(), m_pLine->ctlGetWaveOutID());
  88. m_csLineInfo += csTemp;
  89. UpdateData(FALSE);
  90. delete lpDC; 
  91. }
  92. // call lineGetLineDevStatus & display results
  93. void CLineInfo::DisplayDevStatus()
  94. {
  95. CString csTemp;
  96. LPLINEDEVSTATUS lpDS = m_pLine->ctlGetLineDevStatus();
  97. if(lpDS == NULL) 
  98. {
  99. m_csLineInfo.Format("Status unavailable!rn");
  100. UpdateData(FALSE);
  101. return;
  102. }
  103. // display status
  104. m_csLineInfo.Empty();
  105. csTemp.Format("dwNumOpens = %d,rndwOpenMediaModes = %d,rndwNumActiveCalls = %drn",
  106. lpDS->dwNumOpens, lpDS->dwOpenMediaModes, lpDS->dwNumActiveCalls);
  107. m_csLineInfo += csTemp;
  108. csTemp.Format("dwNumOnHoldCalls = %d,rndwNumOnHoldPendCalls = %d,rndwLineFeatures = %drn",
  109. lpDS->dwNumOnHoldCalls, lpDS->dwNumOnHoldPendCalls, lpDS->dwLineFeatures);
  110. m_csLineInfo += csTemp;
  111. UpdateData(FALSE);
  112. delete lpDS; 
  113. }
  114. /////////////////////////////////////////////////////////////////////////////
  115. // CLineInfo message handlers
  116. BOOL CLineInfo::OnInitDialog() 
  117. {
  118. CPropertyPage::OnInitDialog();
  119. WORD wOptions = ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()];
  120. if(wOptions & AUTOANSWER) m_fAuto = TRUE;
  121. if(wOptions & AUTOPLAY) m_fAutoPlay = TRUE;
  122. FitWaveName();
  123. if(m_pLine != NULL) DisplayDevStatus();
  124. m_nFormatID = 10; // default = 11k 8bit PCM
  125. m_dwRecFileSize = 65534; // default
  126. return TRUE;  // return TRUE unless you set the focus to a control
  127.               // EXCEPTION: OCX Property Pages should return FALSE
  128. }
  129. void CLineInfo::OnDevcaps() 
  130. {
  131. if(m_pLine==NULL) return;
  132. if(m_pLine != NULL) DisplayDevCaps();
  133. }
  134. void CLineInfo::OnConfig() 
  135. {
  136. m_pLine->ctlConfigDialog(GetSafeHwnd(), "tapi/line");
  137. }
  138. void CLineInfo::OnAutoanswer() 
  139. {
  140. CString csTemp;
  141. csTemp.Format("line%d", m_pLine->ctlGetLineID());
  142. if(m_btnAutoAnswer.GetCheck())
  143. {
  144. AfxGetApp()->WriteProfileString(csTemp, "AutoAnswer", "yes");
  145. ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()] |= AUTOANSWER;
  146. }
  147. else 
  148. {
  149. AfxGetApp()->WriteProfileString(csTemp, "AutoAnswer", "no");
  150. ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()] &= ~AUTOANSWER;
  151. }
  152. UpdateData();
  153. }
  154. void CLineInfo::OnAutoplay() 
  155. {
  156. CString csTemp;
  157. csTemp.Format("line%d", m_pLine->ctlGetLineID());
  158. if(m_btnAutoPlay.GetCheck())
  159. {
  160. AfxGetApp()->WriteProfileString(csTemp, "AutoPlay", "yes");
  161. ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()] |= AUTOPLAY;
  162. }
  163. else 
  164. {
  165. AfxGetApp()->WriteProfileString(csTemp, "AutoPlay", "no");
  166. ((CTalkApp *)AfxGetApp())->m_wLineOptions[m_pLine->ctlGetLineID()] &= ~AUTOPLAY;
  167. }
  168. UpdateData();
  169. }
  170. // Select the wave file to play
  171. void CLineInfo::OnBrowse() 
  172. {
  173. CString csTemp;
  174. csTemp.Format("line%d", m_pLine->ctlGetLineID());
  175. CString csFilter = "Wave Files(*.wav)|*.wav|All Files(*.*)|*.*||";
  176. CFileDialog dlg(TRUE, NULL, m_csWaveName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  177. (LPCTSTR) csFilter, this);
  178. if(IDOK == dlg.DoModal())
  179. {
  180. m_csWaveName = dlg.GetPathName();
  181. AfxGetApp()->WriteProfileString(csTemp, "Wave Play File", m_csWaveName);
  182. FitWaveName();
  183. UpdateData(FALSE);
  184. m_pParent->m_CallInfo[0].m_pWaveName = &m_csWaveName;
  185. }
  186. DWORD  dwDesiredAccess = GENERIC_READ; // access (read-write) mode 
  187.     DWORD  dwShareMode = 0; // share mode 
  188.     LPSECURITY_ATTRIBUTES  lpSecurityAttributes = NULL; // address of security descriptor 
  189.     DWORD  dwCreationDistribution = OPEN_EXISTING; // how to create 
  190.     HANDLE  hF = CreateFile((LPCTSTR)m_csWaveName, dwDesiredAccess, 
  191. dwShareMode, lpSecurityAttributes, dwCreationDistribution, FILE_ATTRIBUTE_NORMAL,NULL);
  192. if(hF == INVALID_HANDLE_VALUE) 
  193. TRACE("Openfailed err=%dn", GetLastError());
  194. else CloseHandle(hF);
  195. }
  196. // Fit the wave file name into available space
  197. void CLineInfo::FitWaveName()
  198. {
  199. int nChars = 0, nLen, nInd1, nInd2;
  200. // find out how much space is available
  201. CDC *pDC  = m_ctlWaveName.GetDC();
  202. if(pDC) 
  203. {
  204. TEXTMETRIC myTM;
  205. if(pDC->GetTextMetrics(&myTM))
  206. {
  207. CRect cr;
  208. m_ctlWaveName.GetClientRect(&cr);
  209. nChars = (cr.right - cr.left)/myTM.tmAveCharWidth;
  210. }
  211. m_ctlWaveName.ReleaseDC(pDC);
  212. }
  213. if(nChars < 25 || nChars > 40) nChars = 25; // just in case
  214. nLen = m_csWaveName.GetLength();
  215. if(nLen <= nChars) // fits already
  216. {
  217. m_csDisplayWaveName = m_csWaveName;
  218. goto FinishFit;
  219. }
  220. nInd1 = m_csWaveName.Find('\');
  221. nInd2 = m_csWaveName.ReverseFind('\');
  222. if(nInd1 && nInd2 && nInd2 > nInd1)  // remove all between ind1 & ind2
  223. {
  224. m_csDisplayWaveName = m_csWaveName.Left(nInd1+1) + (LPCTSTR) "..." +m_csWaveName.Right(nLen - nInd2); 
  225. }
  226. else m_csDisplayWaveName = m_csWaveName;
  227. FinishFit:
  228. m_csDisplayWaveName.MakeLower();
  229. }
  230. void CLineInfo::OnGetdevstatus() 
  231. {
  232. DisplayDevStatus();
  233. }
  234. void CLineInfo::OnSetFocus(CWnd* pOldWnd) 
  235. {
  236. CPropertyPage::OnSetFocus(pOldWnd);
  237. ((CTalkApp *)AfxGetApp())->SetHelpId(HIDD_TALKER32_DialogLineInfo);
  238. }
  239. void CLineInfo::OnWaveformat() 
  240. {
  241. CWaveDlg dlg(this); // bring up the format dialog
  242. dlg.m_nFormatID = m_nFormatID;
  243. dlg.m_csFileName = m_csWaveName;
  244. if(IDOK == dlg.DoModal())
  245. m_nFormatID = dlg.m_nFormatID;
  246. }
  247. /////////////////////////////////////////////////////////////////////////////
  248. // CInfo
  249. IMPLEMENT_DYNAMIC(CInfo, CPropertySheet)
  250. CInfo::CInfo(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
  251. :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
  252. {
  253. m_pbtnClose = NULL;
  254. m_pbtnHelp = NULL;
  255. BuildSheet();
  256. }
  257. CInfo::CInfo(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage, LPVOID lpLine)
  258. :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
  259. {
  260. m_pbtnClose = NULL;
  261. m_pbtnHelp = NULL;
  262. BuildSheet(lpLine);
  263. }
  264. CInfo::~CInfo()
  265. {
  266. }
  267. BEGIN_MESSAGE_MAP(CInfo, CPropertySheet)
  268. //{{AFX_MSG_MAP(CInfo)
  269. ON_WM_CREATE()
  270. ON_WM_DESTROY()
  271. ON_WM_SHOWWINDOW()
  272. ON_BN_CLICKED(IDCANCEL, OnClose)
  273. ON_BN_CLICKED(ID_HELP, OnContextHelp)
  274. //}}AFX_MSG_MAP
  275. END_MESSAGE_MAP()
  276. void CInfo::BuildSheet(LPVOID lpLine)
  277. {
  278. DWORD i;
  279. CString csTemp;
  280. OSVERSIONINFO verinfo;
  281. BOOL bNT = FALSE;
  282. verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  283. if(GetVersionEx(&verinfo) && 
  284. verinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) bNT = TRUE;
  285. // find out the number of calls; can handle only one for now
  286. m_LineInfo.m_dwCalls = 0;
  287. if(lpLine == NULL) return;
  288. m_LineInfo.m_pLine = (CTapiLine *)lpLine;
  289. m_LineInfo.m_pParent = this; 
  290. CTapiCall *pCall = m_LineInfo.m_pLine->ctlGetActiveCall();
  291. if(pCall != NULL)
  292. {
  293. m_LineInfo.m_dwCalls = 1;
  294. m_LineInfo.m_ppCalls[0] = pCall;
  295. }
  296. m_LineInfo.m_csLineName.Empty();
  297. m_LineInfo.m_bRemote = FALSE;
  298. LPLINEDEVCAPS lpDC;
  299. if(!m_LineInfo.m_pLine->ctlLineGetCaps(&lpDC)) // extract line name
  300. {
  301. if(lpDC != NULL) 
  302. {
  303. m_LineInfo.m_csLineName.Format("%s", (LPSTR)((LPBYTE)lpDC + lpDC->dwLineNameOffset));
  304. if(bNT)
  305. m_LineInfo.m_bRemote = IsLineRemote(lpDC); // find out if line is remote
  306. delete lpDC;
  307. }
  308. }
  309. // set the wave file name
  310. csTemp.Format("line%d", m_LineInfo.m_pLine->ctlGetLineID());
  311. m_LineInfo.m_csWaveName = AfxGetApp()->GetProfileString((LPCTSTR)csTemp, "Wave Play File", "");
  312. m_LineInfo.m_csWaveRecName = AfxGetApp()->GetProfileString((LPCTSTR)csTemp, "Wave Record File", "");
  313. if(m_LineInfo.m_csWaveName.IsEmpty())  // 
  314. m_LineInfo.m_csWaveName = "play.wav";
  315. if(m_LineInfo.m_csWaveRecName.IsEmpty())  // 
  316. m_LineInfo.m_csWaveRecName.Format("record%.2d.wav",m_LineInfo.m_pLine->ctlGetLineID());
  317. AddPage(&m_LineInfo);
  318. for(i = 0; i < m_LineInfo.m_dwCalls; i++)
  319. {
  320. m_CallInfo[i].m_csCaption.Format("Call %d", i+1);
  321. m_CallInfo[i].m_pCall = m_LineInfo.m_ppCalls[i];
  322. m_CallInfo[i].m_pLine = (CTapiLine *)lpLine;
  323. m_CallInfo[i].m_pWaveName = &m_LineInfo.m_csWaveName;
  324. m_CallInfo[i].m_pWaveRecName = &m_LineInfo.m_csWaveRecName;
  325. m_CallInfo[i].m_pLineName = &m_LineInfo.m_csLineName;
  326. m_CallInfo[i].m_bRemote = m_LineInfo.m_bRemote;
  327. m_CallInfo[i].m_bRunningOnNT = bNT;
  328. m_CallInfo[i].m_pnWaveFormatID = &m_LineInfo.m_nFormatID;
  329. m_CallInfo[i].m_pdwRecFileSize = &m_LineInfo.m_dwRecFileSize;
  330. AddPage(&m_CallInfo[i]); // where to init call info page?
  331. }
  332. }
  333. void CInfo::CreateCloseButton()
  334. {
  335. CRect crctw;
  336. if(m_pbtnClose) return;
  337. m_pbtnClose = new CButton;
  338. m_pbtnHelp = new CButton;
  339. GetWindowRect(&crctw);
  340. crctw.InflateRect(10,15);
  341. MoveWindow(&crctw);
  342. GetWindowRect(&crctw);
  343. CRect crctb(crctw.Width()-60, crctw.Height()-50, crctw.Width()-20, crctw.Height()-30); 
  344. m_pbtnClose->Create("Close", BS_PUSHBUTTON, crctb, this, IDCANCEL); //special ID
  345. CFont *pcfTemp = m_LineInfo.m_btnDevCaps.GetFont(); //a little dirty, but works
  346. m_pbtnClose->SetFont(pcfTemp);
  347. m_pbtnClose->ShowWindow(SW_SHOW);
  348. crctb.left -= 60;
  349. crctb.right -= 60;
  350. m_pbtnHelp->Create("Help", BS_PUSHBUTTON, crctb, this, ID_HELP); //special ID
  351. m_pbtnHelp->SetFont(pcfTemp);
  352. m_pbtnHelp->ShowWindow(SW_SHOW);
  353. }
  354. /////////////////////////////////////////////////////////////////////////////
  355. // CInfo message handlers
  356. int CInfo::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  357. {
  358. if (CPropertySheet::OnCreate(lpCreateStruct) == -1)
  359. return -1;
  360. // CreateCloseButton();
  361. return 0;
  362. }
  363. void CInfo::OnDestroy() 
  364. {
  365. CPropertySheet::OnDestroy();
  366. if(m_pbtnClose==NULL) return;
  367. delete m_pbtnClose;
  368. m_pbtnClose = NULL;
  369. delete m_pbtnHelp;
  370. m_pbtnHelp = NULL;
  371. }
  372. void CInfo::OnShowWindow(BOOL bShow, UINT nStatus) 
  373. {
  374. CPropertySheet::OnShowWindow(bShow, nStatus);
  375. CreateCloseButton();
  376. if(m_pbtnClose) 
  377. m_pbtnClose->ShowWindow(SW_SHOW);
  378. if(m_pbtnHelp) 
  379. m_pbtnHelp->ShowWindow(SW_SHOW);
  380. }
  381. void CInfo::OnClose() 
  382. {
  383. PostMessage(WM_CLOSE,0,0);
  384. }
  385. void CInfo::OnContextHelp() 
  386. {
  387. ((CTalkApp *)AfxGetApp())->OnHelp();
  388. // CPropertySheet::WinHelp(HIDD_TALKER32_DialogLineInfo, HELP_CONTEXT);
  389. }
  390. // Determine if the line is running on the remote computer
  391. // Since MS doesn't provide a standard way, use whatever mechanism is available for the SP
  392. // Override this function to implement a better way
  393. /*** Moved to talker32.cpp
  394. BOOL IsLineRemote(LPLINEDEVCAPS lpDC)
  395. {
  396. int nInd;
  397. CString csTemp;
  398. if(!lpDC->dwLineNameOffset) return FALSE;
  399. csTemp.Format("%s", (LPSTR)((LPBYTE)lpDC + lpDC->dwLineNameOffset));
  400. csTemp.MakeUpper();
  401. if(-1 == csTemp.Find("DXXXB")) return FALSE; // non-Dialogic TSP
  402. if(-1 == (nInd = csTemp.Find("\"))) return FALSE; // computer name not a part of board name
  403. csTemp = csTemp.Left(nInd);
  404. char szName[MAX_COMPUTERNAME_LENGTH+1];
  405. DWORD dwSize = MAX_COMPUTERNAME_LENGTH+1;
  406. if(!GetComputerName(szName, &dwSize)) return FALSE; // Name unavailable for some reason
  407. if(!strcmpi(szName, (LPCTSTR)csTemp)) return FALSE; // Same name
  408. return TRUE;  // Finally, the names ARE different
  409. } ***/