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

TAPI编程

开发平台:

Visual C++

  1. // talker32.cpp : Defines the class behaviors for the application.
  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 "helpid.h"
  11. #include "devspec.h"
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char BASED_CODE THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CTalkApp
  18. BEGIN_MESSAGE_MAP(CTalkApp, CTapiApp)
  19. //{{AFX_MSG_MAP(CTalkApp)
  20. // NOTE - the ClassWizard will add and remove mapping macros here.
  21. //    DO NOT EDIT what you see in these blocks of generated code!
  22. ON_COMMAND(ID_HELP, OnHelp)
  23. //}}AFX_MSG
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CTalkApp construction
  27. CTalkApp::CTalkApp()
  28. {
  29. m_dwTapiAlert = 0;
  30. }
  31. /////////////////////////////////////////////////////////////////////////////
  32. // The one and only CTalkApp object
  33. CTalkApp theApp;
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CTalkApp initialization
  36. BOOL CTalkApp::InitInstance()
  37. {
  38. DWORD i, dwrc;
  39. CString csTemp, csAA;
  40. if(!CTapiApp::InitInstance()) // failed to initialize
  41. return FALSE;
  42. memset((PBYTE)m_ctlLines, 0, sizeof(m_ctlLines));
  43. CStatusBox sbDlg;
  44. sbDlg.m_csStatus = "Initializing TAPI..."; 
  45. sbDlg.Create(IDD_STATUSDLG);
  46. if(m_dwLines > MAXLINES) 
  47. {
  48. AfxMessageBox("This program supports up to 16 lines", MB_ICONEXCLAMATION);
  49. m_dwLines = MAXLINES;
  50. }
  51. // Read optional info
  52. memset((LPBYTE)m_wLineOptions, 0, sizeof(m_wLineOptions));
  53. SetRegistryKey("Dialogic\SystemRelease 4.x");
  54. for(i = 0; i < m_dwLines; i++)
  55. {
  56. dwrc = 0L;
  57. if(NULL == (m_ctlLines[i] = new CTapiLine(i)))  //constructor dn open the line
  58. MessageBox(NULL, "Failed to get Cline", NULL, MB_OK);
  59. else dwrc = m_ctlLines[i]->ctlLineOpen(i);
  60. if(dwrc) 
  61. {
  62. char szErr[48];
  63. if(!Code2Error(dwrc, szErr, 46))
  64. csTemp.Format("Failed to open line %d reason=%lx", i, dwrc);
  65. else
  66. csTemp.Format("Failed to open line %d, reason=%s", i, szErr);
  67. MessageBox(NULL, (LPCTSTR)csTemp, NULL, MB_ICONSTOP);
  68. }
  69. else sbDlg.m_csStatus.Format("Line %d opened", i);
  70. sbDlg.UpdateData(FALSE);    
  71. csTemp.Format("Line%d", i);
  72. csAA = GetProfileString((LPCTSTR)csTemp, "AutoAnswer", "");
  73. if(!csAA.IsEmpty())  // Default mode is no autoanswer
  74. {
  75. csAA.MakeUpper();
  76. if((-1 != csAA.Find("YES")) || (-1 != csAA.Find("ON"))) 
  77. m_wLineOptions[i] |= AUTOANSWER; // set bit 
  78. }
  79. csAA = GetProfileString((LPCTSTR)csTemp, "AutoPlay", "");
  80. if(!csAA.IsEmpty())  // Default mode is no autoplay
  81. {
  82. csAA.MakeUpper();
  83. if((-1 != csAA.Find("YES")) || (-1 != csAA.Find("ON"))) 
  84. m_wLineOptions[i] |= AUTOPLAY; // set bit 
  85. }
  86. }
  87. sbDlg.DestroyWindow();
  88. CTalkDlg dlg;
  89. m_pMainWnd = &dlg;
  90. int nResponse = dlg.DoModal();
  91. if (nResponse == IDOK)
  92. {
  93. // TODO: Place code here to handle when the dialog is
  94. //  dismissed with OK
  95. }
  96. else if (nResponse == IDCANCEL)
  97. {
  98. // TODO: Place code here to handle when the dialog is
  99. //  dismissed with Cancel
  100. }
  101. // Since the dialog has been closed, return FALSE so that we exit the
  102. //  application, rather than start the application's message pump.
  103. return FALSE;
  104. }
  105. // Check for active calls, close them properly; called from the front end before shutting down the app
  106. void CTalkApp::Cleanup()
  107. {
  108. DWORD i;
  109. for(i=0; i<m_dwLines; i++)
  110. m_ctlLines[i]->ctlLineDrop();    
  111. }
  112. // close the lines; if there are active calls shut them
  113. int CTalkApp::ExitInstance() 
  114. {
  115. DWORD i;
  116.  
  117. for(i=0; i<m_dwLines; i++)
  118. {
  119. if(m_ctlLines[i])    
  120. delete m_ctlLines[i];
  121. }
  122. return CTapiApp::ExitInstance();
  123. }
  124. // Get CTapiLine by hLine
  125. CTapiLine * CTalkApp::GetLineByHLine(HLINE hLine)
  126. {
  127. DWORD i;
  128. for(i=0; i < m_dwLines; i++)
  129. {
  130. if(m_ctlLines[i] && m_ctlLines[i]->ctlGetHLine() == hLine) 
  131. return m_ctlLines[i];
  132. }
  133. }
  134. return NULL;
  135. }
  136. // Get CTapiLine by hcall
  137. CTapiLine * CTalkApp::GetLineByCall(HCALL hCall)
  138. {
  139. LPLINECALLINFO lpLCI = GetCallInfo(hCall);
  140. if(lpLCI == NULL) return NULL; // failed for some reason
  141. // implement additional logic here to search thru inactive calls
  142. CTapiLine *pLine = GetLineByHLine(lpLCI->hLine); 
  143. delete (LPBYTE) lpLCI;
  144. return pLine;
  145. }
  146. // Find pCall by specified parameter
  147. LPVOID CTalkApp::GetCallByParm(WORD wKey, DWORD dwValue)
  148. {
  149. DWORD i;
  150. CTapiCall *pCall;
  151. for(i=0; i< m_dwLines; i++)
  152. {
  153. if(NULL == m_ctlLines[i] || (NULL == (pCall = m_ctlLines[i]->ctlGetActiveCall()))) continue;
  154. switch(wKey)
  155. {
  156. case KEY_LINE:
  157.   if(m_ctlLines[i] == (CTapiLine *)dwValue) return (LPVOID)pCall;
  158. break;
  159. case KEY_WAVEINHANDLE:
  160. if(NULL != dwValue && pCall->GetHWaveIn() == dwValue) 
  161. return (LPVOID)pCall;
  162. break;
  163. case KEY_WAVEOUTHANDLE:
  164. if(NULL != dwValue && pCall->GetHWaveOut() == dwValue) 
  165. return (LPVOID)pCall;
  166. break;
  167. default:
  168. break;
  169. }
  170. }
  171. return NULL;  // not found
  172. }
  173. // override of CTapiApp implementation
  174. void CTalkApp::OnLineReply(DWORD dwCallback, DWORD dwRequest, DWORD dwStatus)
  175. {
  176. // first, find the request
  177. TRACE("*** TALKER32 *** :enter OnReply ID=%lx Status=%lxn", dwRequest, dwStatus);
  178. PASYNCCALL pAC = FindAsyncID(dwRequest, FIND_ID);
  179. if(pAC == NULL)  // not found for some reason (???)
  180. {
  181. TRACE1("*** TALKER32 *** :Request ID=%lx not found!n", dwRequest);
  182. return;
  183. }
  184. ASSERT(pAC->dwID == dwRequest);  // sanity check
  185. CTapiLine *pCurLine = (CTapiLine *) pAC->pvLine;
  186. switch (pAC->wFunction)
  187. {
  188. case FUNCTION_MAKECALL:  
  189. if(dwStatus & 0x80000000)  // makecall failed, try to drop 
  190. {
  191. TRACE("*** TALKER32 *** :MakeCall ID=%lx failed, err=%lxn", dwRequest, dwStatus);
  192. // notify the line, let it find out what to do
  193. }
  194. pCurLine->ctlUpdateCallStatus(pAC->wFunction, dwStatus, (CTapiCall *)(pAC->pvCall));
  195. break;
  196. case FUNCTION_DROP:
  197. if(dwStatus & 0x80000000)  // drop failed 
  198. TRACE("*** TALKER32 *** :Drop ID=%lx failed, err=%lxn", dwRequest, dwStatus);
  199. // notify the line, let it find out what to do
  200. pCurLine->ctlUpdateCallStatus(pAC->wFunction, dwStatus, (CTapiCall *)(pAC->pvCall));
  201. break;
  202. case FUNCTION_ANSWER:
  203. // Answer succeeded?...
  204. if(dwStatus & 0x80000000)  // answer failed 
  205. TRACE("*** TALKER32 *** :Answer ID=%lx failed, err=%lxn", dwRequest, dwStatus);
  206. pCurLine->ctlUpdateCallStatus(pAC->wFunction, dwStatus, (CTapiCall *)(pAC->pvCall));
  207. break;
  208. case FUNCTION_DIAL:
  209. if(dwStatus & 0x80000000)  // answer failed 
  210. TRACE("*** TALKER32 *** :Dial ID=%lx failed, err=%lxn", dwRequest, dwStatus);
  211. pCurLine->ctlUpdateCallStatus(pAC->wFunction, dwStatus, (CTapiCall *)(pAC->pvCall));
  212. break;
  213. case FUNCTION_DEVSPEC:  // device specific...
  214. if(dwStatus & 0x80000000)  
  215. TRACE("*** TALKER32 *** :Devspec ID=%lx failed, err=%lxn", dwRequest, dwStatus);
  216. pCurLine->ctlUpdateCallStatus(pAC->wFunction, dwStatus, (CTapiCall *)(pAC->pvCall));
  217. break;
  218. default:
  219. TRACE("*** TALKER32 ***: Undefined async function calln"); 
  220. break;
  221. } // end of switch(wFunction)
  222. TRACE("*** TALKER32 *** :exit OnReply ID=%lxn", dwRequest);
  223. FindAsyncID(dwRequest, REMOVE_ID); // Done, remove the ID from list
  224. }
  225. // Override of CTapiApp OnLineCallInfo implementation
  226. void CTalkApp::OnLineCallInfo(HCALL hCall, DWORD dwCallBack, DWORD dwParm)
  227. {
  228. BOOL brc, bFound = FALSE;
  229. DWORD i;
  230. LPLINECALLINFO lpCI = GetCallInfo(hCall);
  231. TRACE("*** TALKER32 *** :OnLineCallinfo hCall=%lx, DevID=%dn", 
  232. hCall, lpCI->dwLineDeviceID);
  233. if(lpCI == NULL) return;
  234. for(i=0; i < m_dwLines; i++)
  235. {
  236. if(m_ctlLines[i] && m_ctlLines[i]->ctlGetHLine() == lpCI->hLine) 
  237. bFound = TRUE;
  238. break;
  239. }
  240. }
  241. if(bFound) brc = m_ctlLines[i]->ctlUpdateCallInfo(hCall, lpCI); 
  242. if(!bFound || (bFound && brc == FALSE)) delete lpCI;
  243. }
  244. // Override of CTapiApp OnCallState implementation
  245. void CTalkApp::OnCallState(HCALL hCall, DWORD hCallback, DWORD dwCallState,
  246. DWORD dwCallStateDetail, DWORD dwCallPrivilege)
  247. {
  248. // May issue lineGetCallStatus here to get info
  249. CString csTemp;
  250. DWORD dwDiscMode;
  251. LONG lrc;
  252. TRACE("*** TALKER32 *** :OnLineCallState hCall=%lx, state=%lx, detail=%lxn",
  253.  hCall, dwCallState, dwCallStateDetail);
  254. CTapiLine *pclTemp = GetLineByCall(hCall);
  255. if(pclTemp == NULL)  // line not found
  256. {
  257. TRACE("*** TALKER32 ***: OnCallState failed to find linen");
  258. return;
  259. }
  260. CTapiCall *pCall = pclTemp->ctlGetActiveCall();
  261. if(pCall == NULL && dwCallState != LINECALLSTATE_OFFERING 
  262.  && dwCallState != LINECALLSTATE_ACCEPTED ) // call not found - probably offering
  263. {
  264. TRACE("*** TALKER32 ***: OnCallState failed to find calln");
  265. return;
  266. }
  267. switch(dwCallState)
  268. {
  269. case LINECALLSTATE_DIALING:
  270.         case LINECALLSTATE_DIALTONE:
  271.         case LINECALLSTATE_PROCEEDING:
  272.         // not clear what to do if this collides w/Drop -so do nothing
  273. TRACE("*** TALKER32 ***: Callstate = %sn", dwCallState==LINECALLSTATE_DIALTONE ? "Dialtone" :
  274.                 dwCallState==LINECALLSTATE_DIALING ? "Dialing" : "Proceeding");
  275. // pCall->UpdateCallState(CONNECTED, 0xffff, dwCallState);
  276. NotifyFrontEnd(pclTemp->ctlGetLineID());
  277.          break; 
  278. case LINECALLSTATE_OFFERING:
  279. case LINECALLSTATE_ACCEPTED:     
  280. TRACE("*** TALKER32 ***: Callstate = %sn", dwCallState==LINECALLSTATE_OFFERING ? "Offering" : "Accepted");
  281. if(pCall)
  282. {
  283. TRACE("*** TALKER32 ***: Cannot answer, another call is active on this linen");
  284. csTemp.Format("Cannot answer call on line %d, another call still activen", pclTemp->ctlGetLineID());
  285. m_pMainWnd->MessageBox(csTemp);
  286. }  
  287. else if(pclTemp != NULL)
  288. pclTemp->ctlOfferCall(hCall);  // line allocates call & alerts front end
  289.          break;
  290. case LINECALLSTATE_CONNECTED: 
  291. TRACE("*** TALKER32 ***: Callstate = Connectedn");
  292. pCall->UpdateCallState(CONNECTED, 0xffff, dwCallState);
  293. m_wLineOptions[pclTemp->ctlGetLineID()] |= PLAY_ONCE;
  294. NotifyFrontEnd(pclTemp->ctlGetLineID());
  295.             break;
  296.         
  297.         case LINECALLSTATE_DISCONNECTED: 
  298.         case LINECALLSTATE_SPECIALINFO:
  299.         case LINECALLSTATE_BUSY:
  300. if (dwCallState == LINECALLSTATE_DISCONNECTED)
  301. TRACE("*** TALKER32 ***: Callstate = Disconnected, reason=%lxn", dwCallStateDetail);
  302. else if (dwCallState == LINECALLSTATE_BUSY)
  303. TRACE("*** TALKER32 ***: Callstate = BUSY, mode = %lxn", dwCallStateDetail);
  304. else if (dwCallState == LINECALLSTATE_SPECIALINFO)
  305. TRACE("*** TALKER32 ***: Callstate = SPECIALINFO, mode = %lxn", dwCallStateDetail);
  306. dwDiscMode = dwCallStateDetail;
  307. if (dwDiscMode == 0) dwDiscMode = LINEDISCONNECTMODE_NORMAL;
  308. pCall->UpdateCallState(DISCONNECTED, 0xffff, dwCallState);
  309. /*            fCallOK = (discMode == LINEDISCONNECTMODE_NORMAL
  310.                 || discMode == LINEDISCONNECTMODE_UNKNOWN
  311.                 || discMode == LINEDISCONNECTMODE_PICKUP
  312.                 || discMode == LINEDISCONNECTMODE_FORWARDED
  313.                 || discMode == LINEDISCONNECTMODE_UNAVAIL);
  314.  */           
  315.             lrc = pclTemp->ctlLineDrop(pCall); // which will notify front end
  316. if(lrc <0)
  317. TRACE("*** TALKER32 ***: lineDrop failed rc = %lxn", lrc);
  318.             break;
  319.         case LINECALLSTATE_IDLE: 
  320. TRACE("*** TALKER32 ***: Callstate IDLE for hcall=%lxn", hCall);
  321. pCall->UpdateCallState(IDLE, IDLE, dwCallState);
  322.             pclTemp->ctlLineDeallocateCall(pCall);
  323.             break;   
  324. default:
  325. break;
  326. } // switch CALLSTATE
  327. }
  328. // LINE_MONITORDIGITS processor
  329. void CTalkApp::OnMonitorDigits(HCALL hCall, DWORD dwCallBack, DWORD dwDigit, DWORD dwDigitMode)
  330. {
  331. TRACE("***: OnMonitorDigits digit = %lxn", dwDigit);
  332. CTapiLine *pclTemp = GetLineByCall(hCall);
  333. if(pclTemp == NULL)  // line not found
  334. {
  335. TRACE("*** TALKER32 ***: OnMonitorDigits failed to find linen");
  336. return;
  337. }
  338. CTapiCall *pCall = pclTemp->ctlGetActiveCall();
  339. if(pCall == NULL)  
  340. {
  341. TRACE("*** TALKER32 ***: OnMonitorDigits failed to find calln");
  342. return;
  343. }
  344. pCall->UpdateMonitorState(MONITOR_DIGITS, dwDigit, dwDigitMode); // new status
  345. pCall->NotifyCallWindow((UINT)dwDigit, (LONG)dwDigitMode); // post a message that status has changed
  346. }
  347. // LINE_GATHERDIGITS processor
  348. void CTalkApp::OnGatherDigits(HCALL hCall, DWORD dwCallBack, DWORD dwTermination)
  349. {
  350. CString csTemp;
  351. CTapiLine *pclTemp = GetLineByCall(hCall);
  352. TRACE("***: OnGatherDigits term = %lxn", dwTermination);
  353. if(pclTemp == NULL)  // line not found
  354. {
  355. TRACE("*** TALKER32 ***: OnGatherDigits failed to find linen");
  356. return;
  357. }
  358. CTapiCall *pCall = pclTemp->ctlGetActiveCall();
  359. if(pCall == NULL)  
  360. {
  361. TRACE("*** TALKER32 ***: OnGatherDigits failed to find calln");
  362. return;
  363. }
  364. pCall->UpdateMonitorState(END_GATHER_DIGITS, dwTermination, 0L); // new status
  365. // pCall->NotifyCallWindow(); // post a message that status has changed
  366. pCall->NotifyCallWindow(0, (LONG)dwTermination); // post a message that status has changed
  367. }
  368. // Process LINE_MONITORMEDIA callback
  369. void CTalkApp::OnMonitorMedia(DWORD hCall, DWORD dwCallBack, DWORD dwParm1, DWORD dwParm2, DWORD dwParm3)
  370. {
  371. // This is a temp workaround until MS fixes remotesp.tsp to process Devspecific & Generate events
  372. if(dwParm1) return;
  373. switch(dwParm2)
  374. {
  375. case PLAY_WAVE:
  376. case RECORD_WAVE:
  377. OnLineDevSpec(hCall, dwCallBack, dwParm2, dwParm3==55 ? 0 : dwParm3, 1111);
  378. return;
  379. default:
  380. return;
  381. }
  382. }
  383. // Process LINE_DEVSPECIFIC callback
  384. void CTalkApp::OnLineDevSpec(DWORD hCall, DWORD dwCallBack, DWORD dwParm1, DWORD dwParm2, DWORD dwParm3)
  385. {
  386. // the action depends on the meaning of parm1
  387. if(dwParm1 != PLAY_WAVE && dwParm1 != RECORD_WAVE) return;
  388. CTapiLine *pLine = (dwParm3 == 1111 ? GetLineByCall((HCALL) hCall) :
  389.   GetLineByHLine((HLINE)hCall));
  390. if(pLine)
  391. pLine->ctlUpdateDevSpecStatus(dwParm2 ? DEVSPEC_RESULTFAILED : DEVSPEC_IDLE);
  392. }
  393. // translate code into verbal call state
  394. BOOL CTalkApp::Code2CallState(DWORD dwState, LPSTR lpBuf, int nSize)
  395. {
  396. BOOL brc = TRUE;
  397. switch(dwState)
  398. {
  399. case LINECALLSTATE_IDLE:
  400. strncpy(lpBuf, "LINECALLSTATE_IDLE", nSize);
  401. break;
  402. case LINECALLSTATE_OFFERING:
  403. strncpy(lpBuf, "LINECALLSTATE_OFFERING", nSize);
  404. break;
  405. case LINECALLSTATE_ACCEPTED:
  406. strncpy(lpBuf, "LINECALLSTATE_ACCEPTED", nSize);
  407. break;
  408. case LINECALLSTATE_DIALTONE:
  409. strncpy(lpBuf, "LINECALLSTATE_DIALTONE", nSize);
  410. break;
  411. case LINECALLSTATE_DIALING:
  412. strncpy(lpBuf, "LINECALLSTATE_DIALING", nSize);
  413. break;
  414. case LINECALLSTATE_RINGBACK:
  415. strncpy(lpBuf, "LINECALLSTATE_RINGBACK", nSize);
  416. break;
  417. case LINECALLSTATE_BUSY:
  418. strncpy(lpBuf, "LINECALLSTATE_BUSY", nSize);
  419. break;
  420. case LINECALLSTATE_SPECIALINFO:
  421. strncpy(lpBuf, "LINECALLSTATE_SPECIALINFO", nSize);
  422. break;
  423. case LINECALLSTATE_CONNECTED:
  424. strncpy(lpBuf, "LINECALLSTATE_CONNECTED", nSize);
  425. break;
  426. case LINECALLSTATE_PROCEEDING:
  427. strncpy(lpBuf, "LINECALLSTATE_PROCEEDING", nSize);
  428. break;
  429. case LINECALLSTATE_ONHOLD:
  430. strncpy(lpBuf, "LINECALLSTATE_ONHOLD", nSize);
  431. break;
  432. case LINECALLSTATE_DISCONNECTED:
  433. strncpy(lpBuf, "LINECALLSTATE_DISCONNECTED", nSize);
  434. break;
  435. case LINECALLSTATE_UNKNOWN:
  436. strncpy(lpBuf, "LINECALLSTATE_UNKNOWN", nSize);
  437. break;
  438. case LINECALLSTATE_ONHOLDPENDTRANSFER:
  439. strncpy(lpBuf, "LINECALLSTATE_ONHOLDPENDTRANSFER", nSize);
  440. break;
  441. default:
  442. brc = FALSE; // not found
  443. break;
  444. }
  445. return brc;
  446. }
  447. BOOL CTalkApp::Code2Error(DWORD dwErr, LPSTR lpBuf, int nSize)
  448. {
  449. BOOL brc = TRUE;
  450. switch(dwErr)
  451. {
  452. case LINEERR_BADDEVICEID:
  453. strncpy(lpBuf, "LINEERR_BADDEVICEID", nSize);
  454. break;
  455. case LINEERR_INCOMPATIBLEAPIVERSION:
  456. strncpy(lpBuf, "LINEERR_INCOMPATIBLEAPIVERSION", nSize);
  457. break;
  458. case LINEERR_INCOMPATIBLEEXTVERSION:
  459. strncpy(lpBuf, "LINEERR_INCOMPATIBLEEXTVERSION", nSize);
  460. break;
  461. case LINEERR_INUSE:
  462. strncpy(lpBuf, "LINEERR_INUSE", nSize);
  463. break;
  464. case LINEERR_INVALCALLHANDLE:
  465. strncpy(lpBuf, "LINEERR_INVALCALLHANDLE", nSize);
  466. break;
  467. case LINEERR_INVALCALLPRIVILEGE:
  468. strncpy(lpBuf, "LINEERR_INVALCALLPRIVILEGE", nSize);
  469. break;
  470. case LINEERR_INVALCALLSTATE:
  471. strncpy(lpBuf, "LINEERR_INVALCALLSTATE", nSize);
  472. break;
  473. case LINEERR_INVALMEDIAMODE:
  474. strncpy(lpBuf, "LINEERR_INVALMEDIAMODE", nSize);
  475. break;
  476. case LINEERR_INVALPARAM:
  477. strncpy(lpBuf, "LINEERR_INVALPARAM", nSize);
  478. break;
  479. case LINEERR_INVALPOINTER:
  480. strncpy(lpBuf, "LINEERR_INVALPOINTER", nSize);
  481. break;
  482. case LINEERR_OPERATIONFAILED:
  483. strncpy(lpBuf, "LINEERR_OPERATIONFAILED", nSize);
  484. break;
  485. case LINEERR_OPERATIONUNAVAIL:
  486. strncpy(lpBuf, "LINEERR_OPERATIONUNAVAIL", nSize);
  487. break;
  488. default:
  489. brc = FALSE; // not found
  490. break;
  491. }
  492. return brc;
  493. }
  494. void CTalkApp::OnHelp()
  495. {
  496. // if(m_pMainWnd->GetSafeHwnd() == ::GetActiveWindow())
  497. // WinHelp(HIDD_TALKER32_DialogMain, HELP_CONTEXT);
  498. // else
  499. // WinHelp(HIDD_TALKER32_DialogLineInfo, HELP_CONTEXT);
  500. WinHelp(m_nHelpId, HELP_CONTEXT);
  501. }
  502. /////////////////////////////////////////////////////////////////////////////
  503. // CStatusBox dialog
  504. CStatusBox::CStatusBox(CWnd* pParent /*=NULL*/)
  505. : CDialog(CStatusBox::IDD, pParent)
  506. {
  507. //{{AFX_DATA_INIT(CStatusBox)
  508. m_csStatus = _T("");
  509. //}}AFX_DATA_INIT
  510. }
  511. void CStatusBox::DoDataExchange(CDataExchange* pDX)
  512. {
  513. CDialog::DoDataExchange(pDX);
  514. //{{AFX_DATA_MAP(CStatusBox)
  515. DDX_Text(pDX, IDC_STATUS, m_csStatus);
  516. //}}AFX_DATA_MAP
  517. }
  518. BEGIN_MESSAGE_MAP(CStatusBox, CDialog)
  519. //{{AFX_MSG_MAP(CStatusBox)
  520. //}}AFX_MSG_MAP
  521. END_MESSAGE_MAP()
  522. /////////////////////////////////////////////////////////////////////////////
  523. // CStatusBox message handlers
  524. BOOL CStatusBox::OnInitDialog() 
  525. {
  526. CDialog::OnInitDialog();
  527. // TODO: Add extra initialization here
  528. return TRUE;  // return TRUE unless you set the focus to a control
  529.               // EXCEPTION: OCX Property Pages should return FALSE
  530. }