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

TAPI编程

开发平台:

Visual C++

  1. // talkdlg.cpp : implementation file
  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 <mmsystem.h>
  10. #include "wavex.h"
  11. //#include "wavexg.h"
  12. #include "callinfo.h"
  13. #include "lineinfo.h"
  14. #include "talkdlg.h"
  15. #include "helpid.h"
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char BASED_CODE THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CTalkDlg dialog
  22. CTalkDlg::CTalkDlg(CWnd* pParent /*=NULL*/)
  23. : CDialog(CTalkDlg::IDD, pParent)
  24. {
  25. //{{AFX_DATA_INIT(CTalkDlg)
  26. m_csDialString = _T("");
  27. //}}AFX_DATA_INIT
  28. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  29. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  30. SetHelpID(HIDD_TALKER32_DialogMain);
  31. }
  32. void CTalkDlg::DoDataExchange(CDataExchange* pDX)
  33. {
  34. CDialog::DoDataExchange(pDX);
  35. //{{AFX_DATA_MAP(CTalkDlg)
  36. DDX_Control(pDX, IDC_DIAL, m_btnDial);
  37. DDX_Control(pDX, IDC_EDIT1, m_ctlDialString);
  38. DDX_Control(pDX, IDC_CALLS, m_ctlActiveCalls);
  39. DDX_Control(pDX, IDC_LINEFRAME, m_ctlLineFrame);
  40. DDX_Control(pDX, IDC_NUMBER0, m_ctlLineNum0);
  41. DDX_Control(pDX, IDC_INFO0, m_btnInfo0);
  42. DDX_Control(pDX, IDC_ACTION0, m_btnAction0);
  43. DDX_Control(pDX, IDC_IND0, m_ctlFrame0);
  44. DDX_Text(pDX, IDC_EDIT1, m_csDialString);
  45. //}}AFX_DATA_MAP
  46. }
  47. BEGIN_MESSAGE_MAP(CTalkDlg, CDialog)
  48. //{{AFX_MSG_MAP(CTalkDlg)
  49. ON_WM_PAINT()
  50. ON_WM_QUERYDRAGICON()
  51. ON_WM_DESTROY()
  52. ON_BN_CLICKED(IDC_DIAL, OnDial)
  53. ON_MESSAGE(MM_WOM_DONE, OnWomDone) // Finish playing WAVE
  54. ON_MESSAGE(MM_WIM_DATA, OnWimData) // Finish recording WAVE 
  55. ON_BN_CLICKED(IDC_CLEAR, OnClear)
  56. ON_BN_CLICKED(ID_CONTEXT_HELP, OnContextHelp)
  57. ON_WM_SETFOCUS()
  58. ON_WM_ACTIVATE()
  59. //}}AFX_MSG_MAP
  60. END_MESSAGE_MAP()
  61. /////////////////////////////////////////////////////////////////////////////
  62. // CTalkDlg message handlers
  63. BOOL CTalkDlg::OnInitDialog()
  64. {
  65. DWORD i;
  66. char szBuf[16];
  67. CTapiLine *ptlTemp;
  68. CDialog::OnInitDialog();
  69. CenterWindow();
  70. // SetHelpID(HIDD_TALKER32_DialogMain);
  71. // set the control ID so that the TapiApp object knows where to send notification messages
  72. ((CTalkApp *)AfxGetApp())->SetNotificationControlID(IDC_TAPIALERT);
  73. m_dwLines = ((CTalkApp *)AfxGetApp())->m_dwLines;
  74. m_LineControls[0].uiActionID = IDC_ACTION0;
  75. m_LineControls[0].uiInfoID = IDC_INFO0;
  76. m_LineControls[0].pbtnAction = &m_btnAction0;
  77. m_LineControls[0].pbtnInfo = &m_btnInfo0;
  78. m_LineControls[0].pFrame = &m_ctlFrame0;
  79. m_LineControls[0].pctlLineNum = &m_ctlLineNum0;
  80. m_LineControls[0].pInfoDlg = NULL;
  81. m_nLastX =  95;   
  82. m_nLastY =  25;
  83. m_uiLastID = CONTROL_ARRAY_START;
  84. memset((PBYTE)&(m_LineControls[1]), 0, sizeof(LINECONTROL)*(MAXLINES-1)); // zeroinit
  85. //difference between non-existent & non-functional line:ctlLine=0-nonexist, hline=0-nonfunct
  86. for(i=0; i< m_dwLines; i++)
  87. {
  88. if(NULL == (ptlTemp = ((CTalkApp *)AfxGetApp())->GetTapiLine(i))) continue;
  89. if(i) if(FALSE == CreateLineWindows(&(m_LineControls[i]))) continue;
  90. m_LineControls[i].pctlLine = ptlTemp; // save the line pointer for future ref
  91. sprintf(szBuf, "%d", i);
  92. (m_LineControls[i].pctlLineNum)->SetWindowText(szBuf);
  93. if(NULL != ptlTemp->ctlGetHLine()) // Line functional
  94. (m_LineControls[i].pFrame)->m_Colorref = GREEN; //green=OK
  95. else 
  96. {
  97. (m_LineControls[i].pFrame)->m_Colorref = BLACK; //black=nonfunctional
  98. (m_LineControls[i].pbtnAction)->EnableWindow(FALSE);
  99. }
  100. m_LineControls[0].pInfoDlg = NULL;
  101. (m_LineControls[i].pFrame)->Invalidate();
  102. }
  103. if(!m_dwLines) // remove the pilot windows
  104. {
  105. m_btnAction0.ShowWindow(SW_HIDE);
  106. m_btnInfo0.ShowWindow(SW_HIDE);
  107. m_ctlFrame0.ShowWindow(SW_HIDE);
  108. m_ctlLineNum0.ShowWindow(SW_HIDE);
  109. MessageBox("No TAPI lines found, check TAPI configuration", "Talker32", MB_ICONEXCLAMATION); 
  110. }
  111. m_btnDial.EnableWindow(FALSE);
  112. return TRUE;  // return TRUE  unless you set the focus to a control
  113. }
  114. // If you add a minimize button to your dialog, you will need the code below
  115. //  to draw the icon.  For MFC applications using the document/view model,
  116. //  this is automatically done for you by the framework.
  117. BOOL CTalkDlg::CreateLineWindows(PLINECONTROL pLineControl)
  118. {
  119. CRect rCur, rNew, rWork;
  120. CFont *pcfTemp = m_btnAction0.GetFont();
  121. POINT pntNew;
  122. if(NULL == (pLineControl->pctlLineNum = new CStatic)) return FALSE;
  123. if(NULL == (pLineControl->pFrame = new CXstatic)) return FALSE;
  124. if(NULL == (pLineControl->pbtnAction = new CButton)) return FALSE;
  125. if(NULL == (pLineControl->pbtnInfo = new CButton)) return FALSE;
  126. m_uiLastID++;
  127. // Get the position & IDs for the new controls
  128. if(FALSE == DetermineLinePos(&pntNew)) return FALSE; // main wnd too small
  129. rNew.left = pntNew.x;
  130. rNew.top = pntNew.y;
  131. rNew.right = pntNew.x + 8; 
  132. rNew.bottom = pntNew.y + 10;
  133. rWork = rNew;
  134. MapDialogRect(&rWork);    // convert from dialog base units to screen units
  135. if(!pLineControl->pctlLineNum->Create(" ", m_ctlLineNum0.GetStyle(), rWork, 
  136. this, m_uiLastID)) return FALSE;
  137. pLineControl->pctlLineNum->ShowWindow(SW_SHOW);
  138. pLineControl->pctlLineNum->SetFont(pcfTemp);
  139. m_uiLastID++;
  140. m_nLastX = rNew.left; // Save new values
  141. m_nLastY = rNew.top; 
  142. rCur = rNew;
  143. GetNextRect(&rCur, &rNew, 13, 0, 10, 10);  // Lamp
  144. rWork = rNew;
  145. MapDialogRect(&rWork);   // convert from dialog base units to screen units
  146. if(!pLineControl->pFrame->Create(" ", m_ctlFrame0.GetStyle(), rWork, 
  147. this, m_uiLastID)) return FALSE;
  148. pLineControl->pFrame->ShowWindow(SW_SHOW);
  149. m_uiLastID++;
  150. rCur = rNew;
  151. GetNextRect(&rCur, &rNew, 15, 0, 35, 15);  // Action button
  152. rWork = rNew;
  153. MapDialogRect(&rWork);
  154. if(!pLineControl->pbtnAction->Create("Call", m_btnAction0.GetButtonStyle(), rWork, 
  155. this, m_uiLastID)) return FALSE;
  156. pLineControl->uiActionID = m_uiLastID;
  157. pLineControl->pbtnAction->ShowWindow(SW_SHOW);
  158. pLineControl->pbtnAction->SetFont(pcfTemp);
  159. m_uiLastID++;
  160. rCur = rNew;
  161. GetNextRect(&rCur, &rNew, 40, 0, 20, 15);  // Info button
  162. rWork = rNew;
  163. MapDialogRect(&rWork);
  164. if(!pLineControl->pbtnInfo->Create("Info", m_btnInfo0.GetButtonStyle(), rWork, 
  165. this, m_uiLastID)) return FALSE;
  166. pLineControl->uiInfoID = m_uiLastID;
  167. pLineControl->pbtnInfo->ShowWindow(SW_SHOW);
  168. pLineControl->pbtnInfo->SetFont(pcfTemp);
  169. return TRUE;
  170. //may use DeferWindowPos ?...
  171. }
  172. void CTalkDlg::GetNextRect(RECT *pLastRect, RECT *pNewRect, int ndX, int ndY, int nW, int nH)
  173. {
  174. // put bounds check here
  175. pNewRect->top = pLastRect->top + ndY;
  176. pNewRect->bottom = pNewRect->top + nH;
  177. pNewRect->left = pLastRect->left + ndX;
  178. pNewRect->right = pNewRect->left + nW;
  179. }
  180. // Calculate position for new line of controls; resize window if needed
  181. BOOL CTalkDlg::DetermineLinePos(POINT *ppntNew)
  182. {
  183. CRect rctLimit1, rctNew;
  184. CRect rcT(10, 10, 10, 10);
  185. MapDialogRect(&rcT); // isn't it a shame...
  186. //LONG ldbu = GetDialogBaseUnits();
  187. m_ctlLineFrame.GetWindowRect(&rctLimit1);
  188. ScreenToClient(&rctLimit1);
  189. // the real rect
  190. CRect rctLimit((rctLimit1.left*10)/rcT.left, (rctLimit1.top*10)/rcT.top,
  191. (rctLimit1.right*10)/rcT.right ,(rctLimit1.bottom*10)/rcT.bottom);
  192. if(m_nLastY > (rctLimit.bottom - 40))  // resize window; start next row
  193. {
  194. AddColumn();   
  195. ppntNew->x = m_nLastX + 100; 
  196. ppntNew->y = rctLimit.top + 20; // 25 it should be
  197. }
  198. else 
  199. {
  200. ppntNew->x = m_nLastX;
  201. ppntNew->y = m_nLastY + 20;
  202. }
  203. // if(ppntNew->x > (rctLimit1.right - 100)) return FALSE; // need to resize the main wnd
  204. return TRUE;
  205. }
  206. // add a new column of controls
  207. void CTalkDlg::AddColumn()
  208. {
  209. CRect rctMain, rctFrame;
  210. CRect rcT(100, 100, 100, 100);
  211. MapDialogRect(&rcT);
  212. GetWindowRect(&rctMain);   // resize main window
  213. rctMain.right += rcT.left; // do everything in dialog units ONLY
  214. MoveWindow(&rctMain);
  215. m_ctlLineFrame.GetWindowRect(&rctFrame); // resize frame
  216. ScreenToClient(&rctFrame);
  217. rctFrame.right += rcT.left; // only horizontally
  218. m_ctlLineFrame.MoveWindow(&rctFrame);
  219. }
  220. void CTalkDlg::OnPaint() 
  221. {
  222. if (IsIconic())
  223. {
  224. CPaintDC dc(this); // device context for painting
  225. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  226. // Center icon in client rectangle
  227. int cxIcon = GetSystemMetrics(SM_CXICON);
  228. int cyIcon = GetSystemMetrics(SM_CYICON);
  229. CRect rect;
  230. GetClientRect(&rect);
  231. int x = (rect.Width() - cxIcon + 1) / 2;
  232. int y = (rect.Height() - cyIcon + 1) / 2;
  233. // Draw the icon
  234. dc.DrawIcon(x, y, m_hIcon);
  235. }
  236. else
  237. {
  238. CDialog::OnPaint();
  239. }
  240. }
  241. // The system calls this to obtain the cursor to display while the user drags
  242. //  the minimized window.
  243. HCURSOR CTalkDlg::OnQueryDragIcon()
  244. {
  245. return (HCURSOR) m_hIcon;
  246. }
  247. // User clicked on Action button; find out what to do & do it
  248. void CTalkDlg::OnAction(DWORD dwIndex) 
  249. {
  250. PLINECONTROL plcTemp = &m_LineControls[dwIndex];
  251. LONG lrc;
  252. CTapiCall *pCall = plcTemp->pctlLine->ctlGetActiveCall();
  253. WORD wCallState;
  254. CString csTemp;
  255. LPTSTR lpTemp;
  256. plcTemp->pbtnAction->GetWindowText(csTemp);
  257. plcTemp->pbtnAction->EnableWindow(FALSE); // disable for now
  258. // find out what the line state is
  259. if(pCall == NULL && !csTemp.CompareNoCase("Call")) // no active calls, try to call
  260. {
  261. UpdateData(); // to get m_csDialString
  262. if(m_csDialString.IsEmpty()) lpTemp = NULL;
  263. else lpTemp = m_csDialString.GetBuffer(256);
  264. lrc = plcTemp->pctlLine->ctlLineMakeCall((LPCTSTR)lpTemp, 0);
  265. if(lrc < 0)
  266. csTemp.Format("Make call failed reason=%lx", lrc);
  267. MessageBox(csTemp); // restore call state-WHERE?
  268. }
  269. else return;
  270. }
  271. else 
  272. {
  273. wCallState = pCall->GetCallState();
  274. switch (wCallState) // find out what to do depending on state
  275. {
  276. case MAKING:
  277. case PROGRESS:
  278. case CONNECTED:
  279. case HOLD:
  280. if(!csTemp.CompareNoCase("Hangup")) 
  281. {
  282. ((CTalkApp *)AfxGetApp())->m_wLineOptions[dwIndex] &= ~PLAY_ONCE;
  283. plcTemp->pctlLine->ctlLineDrop();
  284. }
  285. return; //break;
  286. case OFFERING:
  287. if(!csTemp.CompareNoCase("Pickup"))
  288. lrc = plcTemp->pctlLine->ctlLineAnswer(); 
  289. if(lrc < 0) TRACE("*** TALKER32 ***: Answer failed rc=%lxn",lrc); 
  290. break;
  291. case ANSWERING:   // do nothing
  292. break;
  293. case DROPPING:   // unclear what to do
  294. break;
  295. case DISCONNECTED:
  296. if(!csTemp.CompareNoCase("Hangup")) 
  297. plcTemp->pctlLine->ctlLineDrop();
  298. break;
  299. default:
  300. break;
  301. }
  302. }
  303. plcTemp->pbtnAction->EnableWindow(TRUE); // reenable
  304. }
  305. // User clicked on Info button; find out what to do & do it
  306. void CTalkDlg::OnInfo(DWORD dwIndex) 
  307. {
  308. CTapiLine *pLine = (&m_LineControls[dwIndex])->pctlLine;
  309. // set the line in the info dialog, let it do the rest
  310. CString csTemp;
  311. csTemp.Format("Line #%d information", dwIndex);
  312. // Always destroy before creation
  313. DestroyPropSheet(dwIndex);
  314. if(m_LineControls[dwIndex].pInfoDlg == NULL) // reallocate brand new
  315. m_LineControls[dwIndex].pInfoDlg = (LPVOID)new CInfo(csTemp, NULL, 0, pLine);
  316. if(m_LineControls[dwIndex].pInfoDlg != NULL)
  317. ((CInfo *)m_LineControls[dwIndex].pInfoDlg)->Create();
  318. return;    
  319. /***PLINECONTROL plcTemp = &m_LineControls[dwIndex]; // temporary for testing play!!!
  320. CTapiCall *pCall = plcTemp->pctlLine->ctlGetActiveCall();
  321. if(pCall != NULL) pCall->Play("record1.wav");
  322. ***/
  323. }
  324. // Update the indicator & other status
  325. void CTalkDlg::UpdateDisplayStatus(DWORD dwLineID)
  326. {
  327. CTapiCall *pCall;
  328. WORD wCallState = IDLE;
  329. DWORD dwError = NULL;
  330. CString csTemp, csWaveName;
  331. int nNum;
  332. if(dwLineID == 0xffff || dwLineID >= m_dwLines) {return;} // update all lines info
  333. PLINECONTROL plcTemp = &m_LineControls[dwLineID];
  334. if(NULL != (pCall = plcTemp->pctlLine->ctlGetActiveCall()))
  335. {
  336. wCallState = pCall->GetCallState(); // No active call==state IDLE
  337. dwError = pCall->GetCallError();
  338. }
  339. switch(wCallState)
  340. {
  341. case IDLE:
  342. m_LineControls[dwLineID].pFrame->m_Colorref = GREEN;
  343. m_LineControls[dwLineID].pbtnAction->SetWindowText("Call");
  344. m_LineControls[dwLineID].pbtnAction->EnableWindow();
  345. DestroyPropSheet(dwLineID, TRUE);  // destroy if has calls
  346. // if(1 == m_ctlActiveCalls.GetCount())  // the last one
  347. // {
  348. // m_ctlActiveCalls.ResetContent();
  349. // m_btnDial.EnableWindow(FALSE);
  350. // }
  351. csTemp.Format("line %d", dwLineID);
  352. nNum = m_ctlActiveCalls.FindString(-1, (LPCTSTR) csTemp);
  353. if(nNum != CB_ERR) m_ctlActiveCalls.DeleteString(nNum);
  354. break;
  355. case MAKING:
  356. case PROGRESS:
  357. m_LineControls[dwLineID].pFrame->m_Colorref = PURPLE;
  358. m_LineControls[dwLineID].pbtnAction->SetWindowText("Hangup");
  359. csTemp.Format("line %d", dwLineID);
  360. nNum = m_ctlActiveCalls.FindString(-1, (LPCTSTR) csTemp);
  361. if(nNum == CB_ERR) nNum = m_ctlActiveCalls.AddString((LPCTSTR) csTemp);
  362. m_ctlActiveCalls.SetCurSel(nNum);
  363. m_btnDial.EnableWindow();
  364. m_LineControls[dwLineID].pbtnAction->EnableWindow();
  365. break;
  366. case OFFERING:
  367. m_LineControls[dwLineID].pFrame->m_Colorref = BROWN;
  368. m_LineControls[dwLineID].pbtnAction->SetWindowText("Pickup");
  369. m_LineControls[dwLineID].pbtnAction->EnableWindow();
  370. if(((CTalkApp *)AfxGetApp())->m_wLineOptions[dwLineID] & AUTOANSWER) //answer immediately
  371. PostMessage(WM_COMMAND, MAKELONG(m_LineControls[dwLineID].uiActionID, BN_CLICKED), 
  372. (LPARAM)m_LineControls[dwLineID].pbtnAction->GetSafeHwnd()); 
  373. break;
  374. case ANSWERING:
  375. m_LineControls[dwLineID].pFrame->m_Colorref = BROWN;
  376. m_LineControls[dwLineID].pbtnAction->SetWindowText("Hangup");
  377. m_LineControls[dwLineID].pbtnAction->EnableWindow(FALSE);
  378. break;
  379. case CONNECTED:
  380. m_LineControls[dwLineID].pFrame->m_Colorref = YELLOW;
  381. m_LineControls[dwLineID].pbtnAction->SetWindowText("Hangup");
  382. csTemp.Format("line %d", dwLineID);
  383. nNum = m_ctlActiveCalls.FindString(-1, (LPCTSTR) csTemp);
  384. if(nNum == CB_ERR) nNum = m_ctlActiveCalls.AddString((LPCTSTR) csTemp);
  385. m_ctlActiveCalls.SetCurSel(nNum);
  386. m_btnDial.EnableWindow();
  387. m_LineControls[dwLineID].pbtnAction->EnableWindow();
  388. if(((CTalkApp *)AfxGetApp())->m_wLineOptions[dwLineID] & AUTOPLAY) //play immediately
  389. {
  390. if(!(((CTalkApp *)AfxGetApp())->m_wLineOptions[dwLineID] & PLAY_ONCE)) break;
  391. ((CTalkApp *)AfxGetApp())->m_wLineOptions[dwLineID] &= ~PLAY_ONCE;
  392. csTemp.Format("line%d", dwLineID);
  393. csWaveName = AfxGetApp()->GetProfileString((LPCTSTR)csTemp, "WaveFile", "");
  394. if(csWaveName.IsEmpty()) csWaveName = "play.wav";
  395. pCall->Play(csWaveName.GetBuffer(128));
  396. }
  397. break;
  398. case HOLD:
  399. m_LineControls[dwLineID].pFrame->m_Colorref = BLUE;
  400. m_LineControls[dwLineID].pbtnAction->SetWindowText("Hangup");
  401. m_LineControls[dwLineID].pbtnAction->EnableWindow();
  402. break;
  403. case STOP_MAKING:
  404. case DROPPING:
  405. case DISCONNECTED:
  406. m_LineControls[dwLineID].pFrame->m_Colorref = ORANGE;
  407. m_LineControls[dwLineID].pbtnAction->SetWindowText("Hangup");
  408. csTemp.Format("line %d", dwLineID);
  409. if(1 == m_ctlActiveCalls.GetCount())  // the last one
  410. {
  411. m_ctlActiveCalls.ResetContent();
  412. m_btnDial.EnableWindow(FALSE);
  413. }
  414. nNum = m_ctlActiveCalls.FindString(-1, (LPCTSTR) csTemp);
  415. if(nNum != CB_ERR) m_ctlActiveCalls.DeleteString(nNum);
  416. break;
  417. default:
  418. break;
  419. }
  420. if(dwError != NULL)   // indication that something went wrong
  421. {
  422. m_LineControls[dwLineID].pFrame->m_Colorref = RED;
  423. m_LineControls[dwLineID].pbtnAction->SetWindowText("Hangup");
  424. m_LineControls[dwLineID].pbtnAction->EnableWindow();
  425. }
  426. UpdateData();
  427. m_LineControls[dwLineID].pFrame->Invalidate();
  428. }
  429. void CTalkDlg::DestroyPropSheet(DWORD dwIndex, BOOL bDestroyIfCalls)
  430. {
  431. DWORD i;
  432. // Destroy specific one
  433. if(dwIndex != 0xffffffff) 
  434. {
  435. if(m_LineControls[dwIndex].pInfoDlg != NULL)
  436. {
  437. if(bDestroyIfCalls &&
  438.   ((CInfo *)m_LineControls[dwIndex].pInfoDlg)->m_LineInfo.m_dwCalls == 0)
  439. return;
  440. if(((CInfo *)m_LineControls[dwIndex].pInfoDlg)->m_hWnd && 
  441. ((CInfo *)m_LineControls[dwIndex].pInfoDlg)->IsWindowVisible())
  442. ((CInfo *)m_LineControls[dwIndex].pInfoDlg)->DestroyWindow();
  443. delete ((CInfo *)m_LineControls[dwIndex].pInfoDlg);
  444. m_LineControls[dwIndex].pInfoDlg = NULL;
  445. }
  446. return;
  447. }
  448. for(i=0; i < m_dwLines; i++)
  449. {
  450. // Destroy prop sheets if any
  451. if(m_LineControls[i].pInfoDlg != NULL)
  452. {
  453. if(bDestroyIfCalls && 
  454.   ((CInfo *)m_LineControls[i].pInfoDlg)->m_LineInfo.m_dwCalls == 0)
  455. continue;
  456. if(((CInfo *)m_LineControls[i].pInfoDlg)->m_hWnd && 
  457. ((CInfo *)m_LineControls[i].pInfoDlg)->IsWindowVisible())
  458. ((CInfo *)m_LineControls[i].pInfoDlg)->DestroyWindow();
  459. delete ((CInfo *)m_LineControls[i].pInfoDlg);
  460. m_LineControls[i].pInfoDlg = NULL;
  461. }
  462. }
  463. }
  464. void CTalkDlg::OnDestroy() 
  465. {
  466. DWORD i;
  467. // destroy all allocated controls
  468. for(i = 1; i < m_dwLines; i++)
  469. {
  470. if(NULL != m_LineControls[i].pctlLineNum) delete m_LineControls[i].pctlLineNum;
  471. m_LineControls[i].pctlLineNum = NULL;
  472. if(NULL != m_LineControls[i].pFrame) delete m_LineControls[i].pFrame;
  473. m_LineControls[i].pFrame = NULL;
  474. if(NULL != m_LineControls[i].pbtnAction) delete m_LineControls[i].pbtnAction;
  475. m_LineControls[i].pbtnAction = NULL;
  476. if(NULL != m_LineControls[i].pbtnInfo) delete m_LineControls[i].pbtnInfo;
  477. m_LineControls[i].pbtnInfo = NULL;
  478. DestroyPropSheet(); // remove all
  479. }
  480. CDialog::OnDestroy();
  481. }
  482. BOOL CTalkDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
  483. {
  484. DWORD i;
  485. if(wParam == IDC_TAPIALERT)
  486. {
  487. UpdateDisplayStatus((DWORD) lParam);
  488. return TRUE;
  489. }
  490. WORD wID = LOWORD(wParam);
  491. if((wID < (CONTROL_ARRAY_START + 1)) && wID > IDC_IND0) goto CommandFinish; // not in array
  492. if(!lParam || !wID || HIWORD(wParam) != BN_CLICKED) goto CommandFinish;
  493. for(i=0; i< m_dwLines; i++)
  494. {
  495. if(m_LineControls[i].uiActionID == wID) // Action button clicked
  496. {
  497. OnAction(i);
  498. break;
  499. }
  500. else if(m_LineControls[i].uiInfoID == wID) // Info button clicked
  501. {
  502. OnInfo(i);
  503. break;
  504. }
  505. }
  506. switch(wID) // Handle digits here
  507. {
  508. case IDC_0:
  509. AddDigit("0");
  510. break;
  511. case IDC_1:
  512. AddDigit("1");
  513. break;
  514. case IDC_2:
  515. AddDigit("2");
  516. break;
  517. case IDC_3:
  518. AddDigit("3");
  519. break;
  520. case IDC_4:
  521. AddDigit("4");
  522. break;
  523. case IDC_5:
  524. AddDigit("5");
  525. break;
  526. case IDC_6:
  527. AddDigit("6");
  528. break;
  529. case IDC_7:
  530. AddDigit("7");
  531. break;
  532. case IDC_8:
  533. AddDigit("8");
  534. break;
  535. case IDC_9:
  536. AddDigit("9");
  537. break;
  538. case IDC_POUND:
  539. AddDigit("#");
  540. break;
  541. case IDC_STAR:
  542. AddDigit("*");
  543. break;
  544. default:
  545. break;
  546. }
  547. CommandFinish:
  548. return CDialog::OnCommand(wParam, lParam);
  549. }
  550. void CTalkDlg::AddDigit(LPCSTR lpDigit)
  551. {
  552. if(lpDigit == NULL) // Clear
  553. {
  554.   m_csDialString.Empty();
  555. UpdateData(FALSE);
  556. return;
  557. }
  558. if(m_ctlDialString.GetSel())
  559. {
  560. m_ctlDialString.ReplaceSel(lpDigit);
  561. UpdateData(TRUE);
  562. }
  563. else
  564. {
  565. UpdateData(TRUE); // retrieve
  566. m_csDialString += lpDigit;
  567. UpdateData(FALSE); // save
  568. }
  569. }
  570. // If there is a call, try to dial on it
  571. void CTalkDlg::OnDial() 
  572. {
  573. int nNum;
  574. DWORD i;
  575. CString csTemp, csTemp1; 
  576. LONG lrc;
  577. // first, get the currently selected call
  578. nNum = m_ctlActiveCalls.GetCurSel();
  579. if(nNum == CB_ERR) return;
  580. m_ctlActiveCalls.GetLBText(nNum, csTemp);
  581. for(i=0; i<m_dwLines; i++)
  582. {
  583. csTemp1.Format("line %d", i);
  584. if(!csTemp.Compare((LPCTSTR) csTemp1)) break;
  585. }
  586. if(i >= m_dwLines) i--;
  587. UpdateData();
  588. lrc = m_LineControls[i].pctlLine->ctlLineDial(NULL, (LPCSTR) m_csDialString, 0L); // Country code=0 for now
  589. if(lrc < 0) 
  590. {
  591. char szErr[48];
  592. if(!((CTalkApp *)AfxGetApp())->Code2Error(lrc, szErr, 46))
  593. csTemp.Format("Dial on line %d failed reason=%lx", i, lrc);
  594. else
  595. csTemp.Format("Dial on line %d failed reason=%s", i, szErr);
  596. AfxMessageBox(csTemp);
  597. }
  598. }
  599. // Find the pCall using hWave, finish palying on that call.
  600. LONG CTalkDlg::OnWomDone(UINT wParam, LONG lParam)
  601. {
  602. CTapiCall *pCall = (CTapiCall *)(((CTalkApp *)AfxGetApp())->GetCallByParm(KEY_WAVEOUTHANDLE, (DWORD) wParam));
  603. if(pCall != NULL) 
  604. {
  605. // For MT implementation, signal the semaphore here 
  606. pCall->FinishPlay(wParam, lParam); // override this for MT implementation
  607. //::WavexFinishPlay(wParam, lParam);
  608. return TRUE;
  609. }
  610. // End of recording handler
  611. LONG CTalkDlg::OnWimData(UINT wParam, LONG lParam)
  612. {
  613. TRACE("*** TALKER32 ***: WIM_DATA wParam=%lx, lParam=%lxn", wParam, lParam);
  614. CTapiCall *pCall = (CTapiCall *)(((CTalkApp *)AfxGetApp())->GetCallByParm(KEY_WAVEINHANDLE, (DWORD) wParam));
  615. if(pCall != NULL) 
  616. {
  617. // For MT implementation, signal the semaphore here 
  618. pCall->FinishRecord(wParam, lParam); // override this for MT implementation
  619. }
  620. //::WavexFinishRecord(wParam, lParam, NULL);  
  621. return TRUE;
  622. }
  623. void CTalkDlg::OnCancel() 
  624. {
  625. // lineConfigDialog(0, m_hWnd, "tapi/line");
  626. ((CTalkApp *)AfxGetApp())->Cleanup();
  627. // may have to wait until all calls are actually closed
  628. CDialog::OnCancel();
  629. }
  630. void CTalkDlg::OnOK() 
  631. {
  632. }
  633. void CTalkDlg::OnClear() 
  634. {
  635. AddDigit(NULL);
  636. }
  637. void CTalkDlg::OnContextHelp() 
  638. {
  639. CDialog::WinHelp(HIDD_TALKER32_DialogMain, HELP_CONTEXT);
  640. }
  641. void CTalkDlg::OnSetFocus(CWnd* pOldWnd) 
  642. {
  643. CDialog::OnSetFocus(pOldWnd);
  644. ((CTalkApp *)AfxGetApp())->SetHelpId(HIDD_TALKER32_DialogMain);
  645. }
  646. void CTalkDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
  647. {
  648. CDialog::OnActivate(nState, pWndOther, bMinimized);
  649. ((CTalkApp *)AfxGetApp())->SetHelpId(HIDD_TALKER32_DialogMain);
  650. }
  651. /*************************
  652. void CTalkDlg::OnCheck1() 
  653. {
  654. CTapiCall *pCall = m_LineControls[0].pctlLine->ctlGetActiveCall();
  655. if(pCall == NULL) return;
  656. if(m_ctlMonitor.GetCheck())
  657. {
  658. LONG lrc = lineMonitorDigits(pCall->m_hCall, LINEDIGITMODE_DTMF);
  659. if(lrc) AfxMessageBox("Monitor failed");
  660. }
  661. else
  662. lineMonitorDigits(pCall->m_hCall,0);
  663. }
  664. void CTalkDlg::OnCheck2() 
  665. {
  666. if(m_ctlGather.GetCheck())
  667. {
  668. CTapiCall *pCall = m_LineControls[0].pctlLine->ctlGetActiveCall();
  669. if(pCall == NULL) return;
  670. // LONG lrc = pCall->GatherDigits(20, "*#", 10000, 5000, "");
  671. LPSTR lpDigits = (LPSTR)malloc(2048);
  672. LPSTR lpDelimit = (LPSTR) malloc(16);
  673. lstrcpy(lpDelimit, "*#");
  674. memset(lpDigits, 0, sizeof(lpDigits));
  675. LONG lrc = lineGatherDigits(pCall->m_hCall, LINEDIGITMODE_DTMF, lpDigits,
  676. 20, lpDelimit, 8000, 5000);
  677. if(lrc) AfxMessageBox("Gather failed");
  678. }
  679. }
  680. *********************/