TAPILine.cpp
上传用户:fstfhk1234
上传日期:2007-06-12
资源大小:67k
文件大小:21k
源码类别:

TAPI编程

开发平台:

Visual C++

  1. // TAPILine.cpp: implementation of the CTAPILine class.
  2. //////////////////////////////////////////////////////////////////////
  3. #include "stdafx.h"
  4. #include "TAPI.h"
  5. #include "TAPICase.h"
  6. #include "global.h"
  7. #include "TAPILine.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. CTAPILine* myTAPILine;
  14. #define TAPI_SUCCESS 0
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. //初始化这个类时,将要协商的最高版本设为3.0,最低版本设为1.3
  19. CTAPILine::CTAPILine()
  20. {
  21. m_lowAPIVersion = 0x00010003;
  22. m_highAPIVersion = 0x00030000;
  23. m_nCurLineID = 0;
  24. m_hLine = 0;
  25. m_nApplicationVersion = 0;
  26. myTAPILine = this;
  27. }
  28. //关闭线路
  29. CTAPILine::~CTAPILine()
  30. {
  31. if(m_hCall != 0)
  32. {
  33. lineDeallocateCall(m_hCall);
  34. m_hCall = 0;
  35. }
  36. if(m_hCall != 0)
  37. CloseLine();
  38. if(m_hLineApp != 0)
  39. {
  40. lineShutdown(m_hLineApp);
  41. m_hLineApp = 0;
  42. }
  43. }
  44. //这四个函数设定和获取最高版本号和最低版本号
  45. DWORD CTAPILine::GetLowAPI()
  46. {
  47. return m_lowAPIVersion;
  48. }
  49. void CTAPILine::SetLowAPI(DWORD ver)
  50. {
  51. m_lowAPIVersion = ver;
  52. }
  53. DWORD CTAPILine::GetHighAPI()
  54. {
  55. return m_highAPIVersion;
  56. }
  57. void CTAPILine::SetHighAPI(DWORD ver)
  58. {
  59. m_highAPIVersion = ver;
  60. }
  61. //获取当前的TAPI线路数值,并提供给其他模块使用
  62. DWORD CTAPILine::GetNumLines()
  63. {
  64. return m_nNumLines;
  65. }
  66. //获取和设定当前TAPI线路
  67. DWORD CTAPILine::GetCurrentLineID()
  68. {
  69. return m_nCurLineID;
  70. }
  71. void CTAPILine::SetCurrentLineID(DWORD id)
  72. {
  73. if(id >= 0 && id < m_nNumLines)
  74. m_nCurLineID = id;
  75. GetLineDevCaps();
  76. }
  77. //获取线路信息中的内容
  78. CString CTAPILine::GetLineName()
  79. {
  80. return m_strLineName;
  81. }
  82. CString CTAPILine::GetProviderInfo()
  83. {
  84. return m_strProviderInfo;
  85. }
  86. CString CTAPILine::GetSwitchInfo()
  87. {
  88. return m_strSwitchInfo;
  89. }
  90. DWORD CTAPILine::GetPermanentLineID()
  91. {
  92. return m_nPermanentLineID;
  93. }
  94. DWORD CTAPILine::GetStringFormat()
  95. {
  96. return m_nStringFormat;
  97. }
  98. DWORD CTAPILine::GetNumAddress()
  99. {
  100. return m_numAddresses;
  101. }
  102. DWORD CTAPILine::GetmaxDataRate()
  103. {
  104. return m_nMaxDataRate; 
  105. }
  106. LONG CTAPILine::GetBearerModes()
  107. {
  108. return m_nBearerModes;
  109. }
  110. LONG CTAPILine::GetAddressModes()
  111. {
  112. return m_nAddressModes;
  113. }
  114. LONG CTAPILine::GetMediaModes()
  115. {
  116. return m_nMediaModes;
  117. }
  118. DWORD CTAPILine::GetGenerateToneMaxNumFreq()
  119. {
  120. return m_nGenerateToneMaxNumFreq;
  121. }
  122. DWORD CTAPILine::GetGenerateToneModes()
  123. {
  124. return m_nGenerateToneModes;
  125. }
  126. DWORD CTAPILine::GetNumTerminals()
  127. {
  128. return m_nNumTerminals;
  129. }
  130. BOOL CTAPILine::GetLineSupportsVoice()
  131. {
  132. BOOL bLineSupportsVoice = FALSE;
  133. if(m_nBearerModes & LINEBEARERMODE_VOICE)
  134. {
  135. if(m_nMediaModes & LINEMEDIAMODE_INTERACTIVEVOICE)
  136. bLineSupportsVoice = TRUE;
  137. }
  138. return bLineSupportsVoice;
  139. }
  140. DWORD CTAPILine::GetNegoAPIVersion()
  141. {
  142. return m_nAPIVersions[m_nCurLineID];
  143. }
  144. DWORD CTAPILine::GetExtAPIID0()
  145. {
  146. return m_extAPIVersions[m_nCurLineID].dwExtensionID0;
  147. }
  148. DWORD CTAPILine::GetExtAPIID1()
  149. {
  150. return m_extAPIVersions[m_nCurLineID].dwExtensionID1;
  151. }
  152. DWORD CTAPILine::GetExtAPIID2()
  153. {
  154. return m_extAPIVersions[m_nCurLineID].dwExtensionID2;
  155. }
  156. DWORD CTAPILine::GetExtAPIID3()
  157. {
  158. return m_extAPIVersions[m_nCurLineID].dwExtensionID3;
  159. }
  160. //对错误代码提供返回错误信息字符串
  161. DWORD CTAPILine::GetLasterror()
  162. {
  163. DWORD lastError;
  164. lastError = m_nLastTAPIError;
  165. //重置错误标识
  166. m_nLastTAPIError = 0;
  167. return lastError;
  168. }
  169. CString CTAPILine::ErrorString(DWORD errCode)
  170. {
  171. CString strError;
  172. strError = GetLineErrString(errCode);
  173. return strError;
  174. }
  175. //创建函数
  176. BOOL CTAPILine::Create()
  177. {
  178. DWORD rc, line;
  179. LINEINITIALIZEEXPARAMS lip;
  180. LINEEXTENSIONID lxid;
  181. CString strTitle = _T("电话API程序");
  182. //初始化参数
  183. lip.dwTotalSize = sizeof(lip);
  184. lip.dwOptions = LINEINITIALIZEEXOPTION_USEHIDDENWINDOW;
  185. //初始化TAPI线路以及返回TAPI句柄
  186. rc = lineInitializeEx(&m_hLineApp, AfxGetApp()->m_hInstance, LineCallbackProc, 
  187. strTitle, &m_nNumLines, &m_highAPIVersion, &lip);
  188. if(rc != TAPI_SUCCESS)
  189. {
  190. m_nLastTAPIError = rc;
  191. return FALSE;
  192. }
  193. else
  194. {
  195. //不存在逻辑线路
  196. if(m_nNumLines > 0)
  197. {
  198. //为每一条TAPI线路进行版本协商
  199. for(line = 0; line < m_nNumLines; line++)
  200. {
  201. rc = lineNegotiateAPIVersion(m_hLineApp, line, m_lowAPIVersion, 
  202. m_highAPIVersion, &m_nAPIVersions[line], &lxid);
  203. //没有合适API版本
  204. if(rc != TAPI_SUCCESS)
  205. {
  206. m_nAPIVersions[line] = 0;
  207. rc = 0;
  208. }
  209. else
  210. {
  211. m_extAPIVersions[line].dwExtensionID0 = lxid.dwExtensionID0;
  212. m_extAPIVersions[line].dwExtensionID1 = lxid.dwExtensionID1;
  213. m_extAPIVersions[line].dwExtensionID2 = lxid.dwExtensionID2;
  214. m_extAPIVersions[line].dwExtensionID3 = lxid.dwExtensionID3;
  215. if(m_nAPIVersions[line] > m_nApplicationVersion)
  216. m_nApplicationVersion = m_nAPIVersions[line];
  217. }
  218. }
  219. }
  220. else
  221. return FALSE;
  222. }
  223. rc = GetLineDevCaps();
  224. return TRUE;
  225. }
  226. //打开线路信息函数
  227. BOOL CTAPILine::OpenLine(DWORD nPrivileges, 
  228.  DWORD nMediaModes)
  229. {
  230. //如果呼叫无效,返回打开线路失败函数
  231. if(m_hLine != 0)
  232. {
  233. return FALSE;
  234. }
  235. DWORD rc;
  236. //打开当前线路
  237. rc = lineOpen(m_hLineApp, 
  238. m_nCurLineID, 
  239. &m_hLine, 
  240. m_nAPIVersions[m_nCurLineID], 
  241. 0,
  242. 0, 
  243. nPrivileges, 
  244. nMediaModes, 
  245. NULL);
  246. //如果线路打开失败,范活错误标识;否则,返回线路打开成功标志
  247. if(rc != TAPI_SUCCESS)
  248. {
  249. m_nLastTAPIError = rc;
  250. return FALSE;
  251. }
  252. return TRUE;
  253. }
  254. //产生异步呼叫的函数
  255. BOOL CTAPILine::MakeCallAsynch(CString strPhoneNumbers)
  256. {
  257. DWORD rc;
  258. if(m_hLine == 0)
  259. return FALSE;
  260. //如果呼叫号码为空,实际上打开呼叫句柄,不进行实际的呼叫
  261. if(strPhoneNumbers == "")
  262. rc = lineMakeCall(m_hLine, &m_hCall, "", 0, NULL);
  263. //呼叫一个号码
  264. else
  265. rc = lineMakeCall(m_hLine, &m_hCall, strPhoneNumbers, 0, NULL);
  266. if(rc > 0)
  267. {
  268. //如果呼叫结束,则产生LINE_REPLY中将会反映出来
  269. //记录当前的请求ID
  270. m_nRequestingCall = rc;
  271. }
  272. else
  273. {
  274. m_nLastTAPIError = rc;
  275. return FALSE;
  276. }
  277. return TRUE;
  278. }
  279. //异步挂断电话的函数
  280. BOOL CTAPILine::DropCallAsynch()
  281. {
  282. DWORD rc;
  283. if(m_hCall == 0)
  284. {
  285. return FALSE;
  286. }
  287. rc = lineDrop(m_hCall, "", 0);
  288. if(rc > 0)
  289. m_nDroppingCall = rc;
  290. else
  291. {
  292. m_nLastTAPIError = rc;
  293. return FALSE;
  294. }
  295. return TRUE;
  296. }
  297. //关闭线路的函数
  298. BOOL CTAPILine::CloseLine()
  299. {
  300. DWORD rc;
  301. if(m_hLine == 0)
  302. {
  303. return FALSE;
  304. }
  305. //关闭线路
  306. rc = lineClose(m_hLine);
  307. //线路句柄无效
  308. m_hLine = 0;
  309. //记录错误
  310. if(rc != TAPI_SUCCESS)
  311. {
  312. m_nLastTAPIError = rc;
  313. return FALSE;
  314. }
  315. return TRUE;
  316. }
  317. //线路配置的函数,该函数调用线路配置对话框
  318. BOOL CTAPILine::ConfigDialog(HWND hWnd, CString strDeviceClass)
  319. {
  320. DWORD rc;
  321. if(strDeviceClass == "")
  322. rc = lineConfigDialog(m_nCurLineID, hWnd, "");
  323. else
  324. rc = lineConfigDialog(m_nCurLineID, hWnd, strDeviceClass);
  325. if(rc != TAPI_SUCCESS)
  326. {
  327. m_nLastTAPIError = rc;
  328. return FALSE;
  329. }
  330. //标识成功
  331. return TRUE;
  332. }
  333. //拨号配置的函数,该函数调用拨号配置对话框
  334. BOOL CTAPILine::DialoingPropertiesDialog(HWND hWnd, CString strPhoneNumber)
  335. {
  336. DWORD rc;
  337. if(strPhoneNumber == "")
  338. rc = lineTranslateDialog(m_hLineApp, m_nCurLineID, m_nApplicationVersion, hWnd, "");
  339. else
  340. rc = lineTranslateDialog(m_hLineApp, m_nCurLineID, m_nApplicationVersion, hWnd, strPhoneNumber);
  341. if(rc != TAPI_SUCCESS)
  342. {
  343. m_nLastTAPIError = rc;
  344. return FALSE;
  345. }
  346. return TRUE;
  347. }
  348. //获取线路信息
  349. BOOL CTAPILine::GetLineDevCaps()
  350. {
  351. DWORD rc;
  352. CString strRef;
  353. LPBYTE buffer = new BYTE[1000];
  354. LPLINEDEVCAPS lpDevCaps = (LPLINEDEVCAPS)buffer;
  355. lpDevCaps->dwTotalSize = 1000 * sizeof(BYTE);
  356. rc = lineGetDevCaps(m_hLineApp, m_nCurLineID, m_nAPIVersions[m_nCurLineID],
  357. 0, lpDevCaps);
  358. if(rc != TAPI_SUCCESS)
  359. {
  360. m_nLastTAPIError = rc;
  361. return FALSE;
  362. }
  363. //将信息保存入当前类中定义的变量
  364. if(lpDevCaps->dwLineNameSize != 0)
  365. m_strLineName = (LPCSTR)(buffer + lpDevCaps->dwLineNameOffset);
  366. else
  367. m_strLineName = _T("");
  368. if(lpDevCaps->dwProviderInfoSize != 0)
  369. m_strProviderInfo = (LPCSTR)(buffer + lpDevCaps->dwProviderInfoOffset);
  370. else
  371. m_strProviderInfo = _T("");
  372.  
  373. if(lpDevCaps->dwSwitchInfoSize != 0)
  374. m_strSwitchInfo = (LPCSTR)(buffer + lpDevCaps->dwSwitchInfoOffset);
  375. else
  376. m_strSwitchInfo = _T("");
  377.  
  378. m_nPermanentLineID = lpDevCaps->dwPermanentLineID;
  379. m_nStringFormat = lpDevCaps->dwStringFormat;
  380. m_numAddresses = lpDevCaps->dwNumAddresses;
  381. m_nMaxDataRate = lpDevCaps->dwMaxRate;
  382. m_nBearerModes = lpDevCaps->dwBearerModes;
  383. m_nAddressModes = lpDevCaps->dwAddressModes;
  384. m_nMediaModes = lpDevCaps->dwMediaModes;
  385. m_nGenerateToneMaxNumFreq = lpDevCaps->dwGenerateToneMaxNumFreq;
  386. m_nGenerateToneModes = lpDevCaps->dwGenerateToneModes;
  387. m_nNumTerminals = lpDevCaps->dwNumTerminals;
  388. return TRUE;
  389. }
  390. CString CTAPILine::GetLineErrString(DWORD lErrCode)
  391. {
  392. CString strErrorMsg;
  393. switch(lErrCode)
  394. {
  395. case LINEERR_ALLOCATED: //( = &H80000001)
  396.             strErrorMsg = _T("所要求得资源(如串行口)已经分配给另一个进程了");
  397. break;
  398. case LINEERR_BADDEVICEID: //(= &H80000002)
  399.             strErrorMsg = _T("指定的设备ID超出范围");
  400. break;
  401. case LINEERR_BEARERMODEUNAVAIL: //(= &H80000003)
  402.             strErrorMsg = _T("指定的模式超出范围");
  403. break;
  404. case LINEERR_CALLUNAVAIL: //(= &H80000005)
  405.             strErrorMsg = _T("在这个地址目前没有可用的呼叫出现");
  406. break;
  407. case LINEERR_COMPLETIONOVERRUN: //(= &H80000006)
  408.             strErrorMsg = _T("Completion Overrun");
  409. break;
  410. case LINEERR_CONFERENCEFULL: //(= &H80000007)
  411.             strErrorMsg = _T("Conference Full");
  412. break;
  413. case LINEERR_DIALBILLING: //(= &H80000008
  414.             strErrorMsg = _T("服务提供者不支持等待付费得音频$");
  415. break;
  416. case LINEERR_DIALDIALTONE: //(= &H80000009)
  417.             strErrorMsg = _T("服务提供者不支持等待拨号的音频W");
  418. break;
  419. case LINEERR_DIALPROMPT: //(= &H8000000A)
  420.             strErrorMsg = _T("服务提供者不支持等待提示符?");
  421. break;
  422. case LINEERR_DIALQUIET: //(= &H8000000B)
  423.             strErrorMsg = _T("服务提供者不支持等待静默@");
  424. break;
  425. case LINEERR_INCOMPATIBLEAPIVERSION: //(= &H8000000C)
  426.             strErrorMsg = _T("指定的版本号不兼容");
  427. break;
  428. case LINEERR_INCOMPATIBLEEXTVERSION: //(= &H8000000D
  429.             strErrorMsg = _T("指定的扩展号不兼容");
  430. break;
  431. case LINEERR_INIFILECORRUPT://(= &H8000000E)
  432.             strErrorMsg = _T("初始化文件错误");
  433. break;
  434. case LINEERR_INUSE: //(= &H8000000F)
  435.             strErrorMsg = _T("指定的线路正在使用");
  436. break;
  437. case LINEERR_INVALADDRESS: //(= &H80000010)
  438.             strErrorMsg = _T("指定的地址包含无效字符");
  439. break;
  440. case LINEERR_INVALADDRESSID: //(= &H80000011)
  441.             strErrorMsg = _T("指定的地址超出范围");
  442. break;
  443. case LINEERR_INVALADDRESSMODE: //(= &H80000012)
  444.             strErrorMsg = _T("无效的地址模式");
  445. break;
  446.     case LINEERR_INVALADDRESSSTATE: //(= &H80000013)
  447.             strErrorMsg = _T("无效的地址状态");
  448. break;
  449. case LINEERR_INVALAPPHANDLE: //(= &H80000014)
  450.             strErrorMsg = _T("指定的应用程序句柄失无效的");
  451. break;
  452. case LINEERR_INVALAPPNAME: //(= &H80000015)
  453.             strErrorMsg = _T("Invalid App Name");
  454. break;
  455. case LINEERR_INVALBEARERMODE: //(= &H80000016)
  456.             strErrorMsg = _T("Invalid Bearer Mode");
  457. break;
  458. case LINEERR_INVALCALLCOMPLMODE: //(= &H80000017)
  459.             strErrorMsg = _T("Invalid Call Completion Mode");
  460. break;
  461. case LINEERR_INVALCALLHANDLE: //(= &H80000018)
  462.             strErrorMsg = _T("Invalid Call Handle");
  463. break;
  464. case LINEERR_INVALCALLPARAMS: //(= &H80000019)
  465.      strErrorMsg = _T("Invalid Call Params");
  466.  break;
  467. case LINEERR_INVALCALLPRIVILEGE: //(= &H8000001A)
  468.             strErrorMsg = _T("Invalid Call Privilege");
  469. break;
  470. case LINEERR_INVALCALLSELECT: //(= &H8000001B)
  471.             strErrorMsg = _T("Invalid Call Select");
  472. break;
  473. case LINEERR_INVALCALLSTATE: //(= &H8000001C)
  474.             strErrorMsg = _T("指定的呼叫对请求动作来说未处于正确地呼叫状态");
  475. break;
  476. case LINEERR_INVALCALLSTATELIST: //(= &H8000001D)
  477.             strErrorMsg = _T("Invalid Call State List");
  478. break;
  479. case LINEERR_INVALCARD: //(= &H8000001E)
  480.             strErrorMsg = _T("Invalid Card");
  481. break;
  482. case LINEERR_INVALCOMPLETIONID: //(= &H8000001F)
  483.             strErrorMsg = _T("Invalid Completion ID");
  484. break;
  485. case LINEERR_INVALCONFCALLHANDLE: //(= &H80000020)
  486.             strErrorMsg = _T("Invalid Conf Call Handle");
  487. break;
  488. case LINEERR_INVALCONSULTCALLHANDLE: //(= &H80000021)
  489.             strErrorMsg = _T("Invalid Consult Call Handle");
  490. break;
  491. case LINEERR_INVALCOUNTRYCODE: //(= &H80000022)
  492.             strErrorMsg = _T("指定的国家代码是无效的");
  493. break;
  494. case LINEERR_INVALDEVICECLASS: //(= &H80000023)
  495.             strErrorMsg = _T("Invalid Device Class");
  496. break;
  497. case LINEERR_INVALDEVICEHANDLE: //(= &H80000024)
  498.             strErrorMsg = _T("Invalid Device Handle");
  499. break;
  500. case LINEERR_INVALDIGITLIST: //(= &H80000026)
  501.             strErrorMsg = _T("Invalid Digit List");
  502. break;
  503. case LINEERR_INVALDIGITMODE: //(= &H80000027)
  504.     strErrorMsg = _T("Invalid Digit Mode");
  505. break;
  506. case LINEERR_INVALDIGITS: //(= &H80000028)
  507.             strErrorMsg = _T("Invalid Digits");
  508. break;
  509. case LINEERR_INVALEXTVERSION: //(= &H80000029)
  510.             strErrorMsg = _T("Invalid Ext Version");
  511. break;
  512. case LINEERR_INVALGROUPID: //(= &H8000002A)
  513.             strErrorMsg = _T("Invalid Group ID");
  514. break;
  515. case LINEERR_INVALLINEHANDLE: //(= &H8000002B)
  516.             strErrorMsg = _T("指定的线路句柄无效");
  517. break;
  518. case LINEERR_INVALLINESTATE: //(= &H8000002C)
  519.             strErrorMsg = _T("Invalid Line State");
  520. break;
  521. case LINEERR_INVALLOCATION: //(= &H8000002D)
  522.             strErrorMsg = _T("Invalid Location");
  523. break;
  524. case LINEERR_INVALMEDIALIST: //(= &H8000002E)
  525.             strErrorMsg = _T("Invalid Media List");
  526. break;
  527. case LINEERR_INVALMEDIAMODE: //(= &H8000002F)
  528.             strErrorMsg = _T("指定的媒体模式无效");
  529. break;
  530. case LINEERR_INVALMESSAGEID: //(= &H80000030)
  531.             strErrorMsg = _T("Invalid Message ID");
  532. break;
  533. case LINEERR_INVALPARAM: //(= &H80000032)
  534.             strErrorMsg = _T("有一个参数已被确定为无效的");
  535. break;
  536. case LINEERR_INVALPARKID: //(= &H80000033)
  537.             strErrorMsg = _T("Invalid Park ID");
  538. break;
  539. case LINEERR_INVALPARKMODE: //(= &H80000034)
  540.             strErrorMsg = _T("Invalid Park Mode");
  541. break;
  542. case LINEERR_INVALPOINTER: //(= &H80000035)
  543.             strErrorMsg = _T("指针没有引用一个有效的内存位置");
  544. break;
  545. case LINEERR_INVALPRIVSELECT: //(= &H80000036)
  546.             strErrorMsg = _T("Invalid Priv Select");
  547. break;
  548. case LINEERR_INVALRATE: //(= &H80000037)
  549.             strErrorMsg = _T("Invalid Rate");
  550. break;
  551. case LINEERR_INVALREQUESTMODE: //(= &H80000038
  552.             strErrorMsg = _T("Invalid Request Mode");
  553. break;
  554. case LINEERR_INVALTERMINALID: //(= &H80000039
  555.             strErrorMsg = _T("Invalid Terminal ID");
  556. break;
  557. case LINEERR_INVALTERMINALMODE: //(= &H8000003A)
  558.             strErrorMsg = _T("Invalid Terminal Mode");
  559. break;
  560. case LINEERR_INVALTIMEOUT: //(= &H8000003B)
  561.             strErrorMsg = _T("Invalid Time Out");
  562. break;
  563. case LINEERR_INVALTONE: //(= &H8000003C)
  564.             strErrorMsg = _T("Invalid Tone");
  565. break;
  566. case LINEERR_INVALTONELIST: //(= &H8000003D)
  567.             strErrorMsg = _T("Invalid Tone List");
  568. break;
  569. case LINEERR_INVALTONEMODE: //(= &H8000003E)
  570.             strErrorMsg = _T("Invalid Tone Mode");
  571. break;
  572. case LINEERR_INVALTRANSFERMODE: //(= &H8000003F)
  573.             strErrorMsg = _T("Invalid Transfer Mode");
  574. break;
  575. case LINEERR_LINEMAPPERFAILED: //(= &H80000040)
  576.             strErrorMsg = _T("Line Mapper Failed");
  577. break;
  578. case LINEERR_NOCONFERENCE: //(= &H80000041)
  579.             strErrorMsg = _T("No Conference");
  580. break;
  581. case LINEERR_NODEVICE: //(= &H80000042)
  582.             strErrorMsg = _T("No Device");
  583. break;
  584. case LINEERR_NODRIVER: //(= &H80000043)
  585.             strErrorMsg = _T("服务提供者发现它的一个组件丢失了");
  586. break;
  587. case LINEERR_NOMEM: //(= &H80000044)
  588.             strErrorMsg = _T("没有足够的内存用于所请求的动作");
  589. break;
  590. case LINEERR_NOREQUEST: //(= &H80000045)
  591.             strErrorMsg = _T("No Request");
  592. break;
  593. case LINEERR_NOTOWNER: //(= &H80000046)
  594.             strErrorMsg = _T("所请求的动作被拒绝,因为应用程序并不拥有这个呼叫");
  595. break;
  596. case LINEERR_NOTREGISTERED: //(= &H80000047)
  597.             strErrorMsg = _T("Not Registered");
  598. break;
  599. case LINEERR_OPERATIONFAILED: //(= &H80000048)
  600.             strErrorMsg = _T("因不明原因,请求失败");
  601. break;
  602. case LINEERR_OPERATIONUNAVAIL: //(= &H80000049
  603.             strErrorMsg = _T("服务提供者不支持此请求");
  604. break;
  605. case LINEERR_RATEUNAVAIL: //(= &H8000004A)
  606.             strErrorMsg = "Rate Unavailable";
  607. break;
  608. case LINEERR_RESOURCEUNAVAIL: //(= &H8000004B)
  609.             strErrorMsg = _T("没有足够的资源完成此请求");
  610. break;
  611. case LINEERR_REQUESTOVERRUN: //(= &H8000004C)
  612.             strErrorMsg = _T("Request Overrun");
  613. break;
  614. case LINEERR_STRUCTURETOOSMALL: //(= &H8000004D)
  615.             strErrorMsg = _T("指定的结构太小而不能包含定长数据");
  616. break;
  617. case LINEERR_TARGETNOTFOUND: //(= &H8000004E)
  618.             strErrorMsg = _T("Target Not found");
  619. break;
  620.     case LINEERR_TARGETSELF: //(= &H8000004F)
  621.             strErrorMsg = _T("Target Self");
  622. break;
  623. case LINEERR_UNINITIALIZED: //(= &H80000050)
  624.             strErrorMsg = _T("Uninitialized");
  625. break;
  626. case LINEERR_USERUSERINFOTOOBIG: //(= &H80000051)
  627.             strErrorMsg = _T("UserUser Info Too Big");
  628. break;
  629. case LINEERR_REINIT: //(= &H80000052)
  630.             strErrorMsg = _T("Re-init");
  631. break;
  632. case LINEERR_ADDRESSBLOCKED: //(= &H80000053)
  633.             strErrorMsg = _T("Address Blocked");
  634. break;
  635. case LINEERR_BILLINGREJECTED: //(= &H80000054)
  636.             strErrorMsg = _T("Billing Rejected");
  637. break;
  638. case LINEERR_INVALFEATURE: //(= &H80000055)
  639.             strErrorMsg = _T("Invalid Feature");
  640. break;
  641. case LINEERR_NOMULTIPLEINSTANCE: //(= &H80000056)
  642.             strErrorMsg = _T("No Multiple Instance");
  643. break;
  644. default:
  645.             strErrorMsg = _T("未知错误"); // undefined
  646. break;
  647. }
  648. return strErrorMsg;
  649. }
  650. //回调函数,处理线路信息和状态改变信息
  651. void CTAPILine::LineCallbackProc(DWORD dwDevice,
  652.  DWORD dwMsg, 
  653.  DWORD dwCallbackInstance,
  654.  DWORD dwParam1, 
  655. DWORD dwParam2, DWORD dwParam3)
  656. {
  657. int i = TAPI_MAKECALLRESULT;
  658. switch(dwMsg)
  659. {
  660. //处理异步完成信息
  661. case LINE_REPLY:
  662. if(dwParam1 == myTAPILine->m_nRequestingCall)
  663. {
  664. myTAPILine->m_nRequestingCall = 0;
  665. //如果出错确认关闭线路
  666. if(dwParam2 != 0)
  667. myTAPILine->CloseLine();
  668. OutputDebugString("TAPI_MAKECALLRESULTn");
  669. }
  670. else if(dwParam1 == myTAPILine->m_nDroppingCall)
  671. {
  672. //异步呼叫
  673. myTAPILine->m_nDroppingCall = 0;
  674. OutputDebugString("TAPI_DROPCALLRESULTn");
  675. }
  676. break;
  677. //处理状态改变信息
  678. case LINE_CALLSTATE:
  679. switch(dwParam1)
  680. {
  681. case LINECALLSTATE_DISCONNECTED:
  682. //远端断开呼叫
  683. myTAPILine->DropCallAsynch();
  684. //产生断开事件
  685. OutputDebugString("TAPI_DISCONNECTED n");
  686. break;
  687. case LINECALLSTATE_IDLE:
  688. //不存在呼叫,空闲状态
  689. if(myTAPILine->m_hCall != 0)
  690. {
  691. lineDeallocateCall(myTAPILine->m_hCall);
  692. myTAPILine->CloseLine();
  693. }
  694. OutputDebugString("TAPI_IDLE n");
  695. break;
  696. case LINECALLSTATE_CONNECTED:
  697. OutputDebugString("TAPI_CONNECTED n");
  698. break;
  699. case LINECALLSTATE_BUSY:
  700. break;
  701. case LINECALLSTATE_DIALTONE:
  702. break;
  703. case LINECALLSTATE_RINGBACK:
  704. break;
  705. case LINECALLSTATE_DIALING:
  706. break;
  707. case LINECALLSTATE_PROCEEDING:
  708. break;
  709. case LINECALLSTATE_SPECIALINFO:
  710. break;
  711. default:
  712. break;
  713. }
  714. break;
  715. }
  716. }
  717. //获得线路状态字符串
  718. CString CTAPILine::GetLineStateString(DWORD state)
  719. {
  720. CString strMsg;
  721. switch(state)
  722. {
  723. case LINECALLSTATE_IDLE:
  724. strMsg = _T("呼叫变为空闲");
  725. break;
  726. case LINECALLSTATE_ACCEPTED:
  727. strMsg = _T("新的呼叫被接受");
  728. break;
  729. case LINECALLSTATE_DIALTONE:
  730. strMsg = _T("检测到一个拨号音频");
  731. break;
  732. case LINECALLSTATE_DIALING:
  733. strMsg = _T("传递给电话交换机的地址信息");
  734. break;
  735. case LINECALLSTATE_RINGBACK:
  736. strMsg = _T("检测到回铃信号");
  737. break;
  738. case LINECALLSTATE_BUSY:
  739. strMsg = _T("呼叫未能完成");
  740. break;
  741. case LINECALLSTATE_CONNECTED:
  742. strMsg = _T("呼叫已成功建立");
  743. break;
  744. case LINECALLSTATE_PROCEEDING:
  745. strMsg = _T("呼叫建立,正在进行交换处理");
  746. break;
  747. case LINECALLSTATE_ONHOLD:
  748. strMsg = _T("呼叫在掌握中");
  749. break;
  750. case LINECALLSTATE_CONFERENCED:
  751. strMsg = _T("呼叫是多方会议的一方");
  752. break;
  753. case LINECALLSTATE_ONHOLDPENDCONF:
  754. strMsg = _T("连接到多方会议");
  755. break;
  756. case LINECALLSTATE_DISCONNECTED:
  757. strMsg = _T("呼叫已经挂起或者中断");
  758. break;
  759. case LINECALLSTATE_UNKNOWN:
  760. strMsg = _T("未知的呼叫状态");
  761. break;
  762. default:
  763. strMsg = _T("其他未知状态");
  764. break;
  765. }
  766. return strMsg;
  767. }