中间件标准版5.1git,去除基础模块

TapiLine.cpp 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. #include "StdAfx.h"
  2. #include "TapiLine.h"
  3. #include "TapiOpBase.h"
  4. CTapiLine::CTapiLine(DWORD DevID, HLINE Handle, DWORD ApiVersion, CString ExtID, HLINEAPP LineApp): m_DevID(DevID), m_Handle(Handle),
  5. m_ApiVersion(ApiVersion), m_ExtenID(ExtID), m_LineApp(LineApp), m_ActiveCall(NULL), m_PendingCall(NULL), m_HeldCall(NULL),
  6. m_DevLinkCallId(CONST_DEV_LINK_CALL_NULL), m_DevLinkHeldId(CONST_DEV_LINK_CALL_NULL), m_IsListener(false), m_LineStatus(INNER_STATE_FREE),
  7. m_pCurrTapiOp(NULL), m_InitTime(time(0))
  8. {
  9. // 事件过滤
  10. HRESULT hRet = ::lineSetStatusMessages(m_Handle, LINE_DEV_STATE_ALL, LINE_ADDRESS_STATE_ALL);
  11. ASSERT(hRet == 0);
  12. }
  13. CTapiLine::~CTapiLine(void)
  14. {
  15. }
  16. /*****************************************************************
  17. **【函数名称】 __onReply
  18. **【函数功能】 线路操作异步返回事件响应
  19. **【参数】
  20. **【返回值】
  21. ****************************************************************/
  22. void CTapiLine::__onReply( LONG RequestID, HRESULT Result )
  23. {
  24. CSingleLock locker(&m_LockSection, TRUE);
  25. if(m_pCurrTapiOp != NULL)
  26. m_pCurrTapiOp->onReply(this, RequestID, Result);
  27. }
  28. /*****************************************************************
  29. **【函数名称】 __onNewCall
  30. **【函数功能】 新呼叫生成事件响应
  31. **【参数】
  32. **【返回值】
  33. ****************************************************************/
  34. void CTapiLine::__onNewCall( DWORD AddressID, HCALL CallId, DWORD CallPrivilege )
  35. {
  36. }
  37. /*****************************************************************
  38. **【函数名称】 __onCallState
  39. **【函数功能】 呼叫状态变化事件响应
  40. **【参数】
  41. **【返回值】
  42. ****************************************************************/
  43. void CTapiLine::__onCallState( HCALL CallId, DWORD CallState, DWORD CallStateDetail, DWORD CallPrivilege )
  44. {
  45. // 更新相关呼叫句柄
  46. __updateHCall(CallId, CallState, CallStateDetail);
  47. // 线路初始化时提取设备的初始状态
  48. if((time(0) - m_InitTime) < CONST_LINE_INIT_TIME_LIMIT) // 3秒内认为初始化未结束
  49. {
  50. _procLineInitStatus(CallId, CallState, CallStateDetail, CallPrivilege);
  51. } // end if
  52. // 通知关联操作
  53. CSingleLock locker(&m_LockSection, TRUE);
  54. if(m_pCurrTapiOp != NULL)
  55. m_pCurrTapiOp->onCallState(this, CallId, CallState, CallStateDetail);
  56. }
  57. /*****************************************************************
  58. **【函数名称】 __onCallInfo
  59. **【函数功能】 呼叫信息变化事件响应
  60. **【参数】
  61. **【返回值】
  62. ****************************************************************/
  63. void CTapiLine::__onCallInfo( HCALL CallId, DWORD CallInfoState )
  64. {
  65. }
  66. /*****************************************************************
  67. **【函数名称】 loopLineGetCallInfo
  68. **【函数功能】 获取呼叫信息
  69. **【参数】 CallId 呼叫句柄
  70. **【返回值】 操作结果
  71. pCallInfo 呼叫信息
  72. ****************************************************************/
  73. HRESULT CTapiLine::__loopLineGetCallInfo( HCALL CallId, LINECALLINFO* &pCallInfo )
  74. {
  75. HRESULT hRet = S_OK;
  76. size_t nCurrentSize = 512; // Starting value - usually big enough
  77. for (;;)
  78. {
  79. // Allocate some memory for the call
  80. pCallInfo = (LINECALLINFO *) new BYTE[nCurrentSize];
  81. ZeroMemory(&pCallInfo[0], nCurrentSize);
  82. pCallInfo->dwTotalSize = nCurrentSize;
  83. // Ask TAPI for some information
  84. hRet = ::lineGetCallInfo(CallId, pCallInfo);
  85. // Cope with variable length structures
  86. if (hRet == LINEERR_STRUCTURETOOSMALL)
  87. {
  88. if (pCallInfo->dwNeededSize <= 0)
  89. break;
  90. nCurrentSize = pCallInfo->dwNeededSize;
  91. delete [] pCallInfo;
  92. pCallInfo = NULL;
  93. }
  94. else
  95. {
  96. break; // 获取成功,退出循环
  97. }
  98. } // end for
  99. return hRet;
  100. }
  101. /*****************************************************************
  102. **【函数名称】 __loopLineGetCallStatus
  103. **【函数功能】 获取呼叫状态
  104. **【参数】 CallId 呼叫句柄
  105. **【返回值】 操作结果
  106. pCallStatus 呼叫状态
  107. ****************************************************************/
  108. HRESULT CTapiLine::__loopLineGetCallStatus( HCALL CallId, DWORD& CallStatus )
  109. {
  110. HRESULT hRet = S_OK;
  111. size_t nCurrentSize = 512; // Starting value - usually big enough
  112. for (;;)
  113. {
  114. // Allocate some memory for the call
  115. LINECALLSTATUS * pCallStatus = (LINECALLSTATUS *) new BYTE[nCurrentSize];
  116. ZeroMemory(&pCallStatus[0], nCurrentSize);
  117. pCallStatus->dwTotalSize = nCurrentSize;
  118. // Ask TAPI for some information
  119. hRet = ::lineGetCallStatus(CallId, pCallStatus);
  120. // Cope with variable length structures
  121. if (hRet == LINEERR_STRUCTURETOOSMALL)
  122. {
  123. if (pCallStatus->dwNeededSize <= 0)
  124. break;
  125. nCurrentSize = pCallStatus->dwNeededSize;
  126. delete [] pCallStatus;
  127. pCallStatus = NULL;
  128. }
  129. else
  130. {
  131. CallStatus = pCallStatus->dwCallState;
  132. delete [] pCallStatus;
  133. pCallStatus = NULL;
  134. break; // 获取成功,退出循环
  135. }
  136. } // end for
  137. return hRet;
  138. }
  139. /*****************************************************************
  140. **【函数名称】 __updateHCall
  141. **【函数功能】 更新相关呼叫句柄(__onCallState子函数)
  142. **【参数】
  143. **【返回值】
  144. ****************************************************************/
  145. void CTapiLine::__updateHCall( HCALL CallId, DWORD CallState, DWORD CallStateDetail )
  146. {
  147. // 根据呼叫状态转换相关呼叫句柄
  148. if(CallState & LINECALLSTATE_IDLE) // 呼叫释放
  149. {
  150. HRESULT nRet = ::lineDeallocateCall(CallId);
  151. if(nRet == S_OK)
  152. {
  153. if(CallId == m_PendingCall) m_PendingCall = NULL;
  154. if(CallId == m_ActiveCall) m_ActiveCall = NULL;
  155. } // end if(nRet)
  156. }
  157. else if(CallState & LINECALLSTATE_DISCONNECTED) // 呼叫断开
  158. {
  159. ::lineDrop(CallId, NULL, 0);
  160. }
  161. else if(CallState & LINECALLSTATE_CONNECTED) // 呼叫建立
  162. {
  163. m_ActiveCall = CallId;
  164. if(CallId == m_PendingCall) m_PendingCall = NULL;
  165. }
  166. else if(CallState & (LINECALLSTATE_ONHOLDPENDTRANSFER | // 转移或会议或保持的中间过程
  167. LINECALLSTATE_ONHOLD |
  168. LINECALLSTATE_ONHOLDPENDCONF))
  169. {
  170. if(CallId == m_ActiveCall) m_ActiveCall = m_PendingCall;
  171. m_PendingCall = CallId;
  172. }
  173. else if(CallState & (LINECALLSTATE_OFFERING | // 其它状态
  174. LINECALLSTATE_DIALING |
  175. LINECALLSTATE_PROCEEDING |
  176. LINECALLSTATE_DIALTONE |
  177. LINECALLSTATE_RINGBACK |
  178. LINECALLSTATE_CONFERENCED))
  179. {
  180. m_ActiveCall = CallId;
  181. if(CallId == m_PendingCall) m_PendingCall = NULL;
  182. } // end if(CallState)
  183. }
  184. /*****************************************************************
  185. **【函数名称】 _mapTapiCallState
  186. **【函数功能】 将呼叫的设备状态定义转为CTI系统定义
  187. **【参数】 CallState 呼叫的设备状态
  188. **【返回值】
  189. ****************************************************************/
  190. INNER_STATE CTapiLine::_mapTapiCallState( DWORD CallState )
  191. {
  192. INNER_STATE nTmpState = INNER_STATE_FREE;
  193. if(CallState & LINECALLSTATE_IDLE ||
  194. CallState & LINECALLSTATE_DISCONNECTED) // 线路空闲
  195. {
  196. nTmpState = INNER_STATE_FREE;
  197. }
  198. else if(CallState & LINECALLSTATE_DIALTONE) // 摘机等待拨号
  199. {
  200. nTmpState = INNER_STATE_INIT;
  201. }
  202. else if(CallState & LINECALLSTATE_DIALING) // 正在拨号
  203. {
  204. nTmpState = INNER_STATE_DIALING;
  205. }
  206. else if(CallState & LINECALLSTATE_RINGBACK) // 对端振铃,等待接听
  207. {
  208. nTmpState = INNER_STATE_RING_BACK;
  209. }
  210. else if(CallState & LINECALLSTATE_OFFERING) // 来电振铃
  211. {
  212. nTmpState = INNER_STATE_ALERTING;
  213. }
  214. else if(CallState & LINECALLSTATE_CONNECTED ||
  215. CallState & LINECALLSTATE_CONFERENCED) // 通话中
  216. {
  217. nTmpState = INNER_STATE_TALKING;
  218. }
  219. return nTmpState;
  220. }
  221. /*****************************************************************
  222. **【函数名称】 getCallStatus
  223. **【函数功能】
  224. **【参数】 CallId 要读取信息的呼叫句柄
  225. **【返回值】 呼叫的物理状态
  226. ****************************************************************/
  227. DWORD CTapiLine::getCallStatus( const HCALL CallId )
  228. {
  229. DWORD CallStatus = 0;
  230. __loopLineGetCallStatus(CallId, CallStatus);
  231. return CallStatus;
  232. }
  233. /*****************************************************************
  234. **【函数名称】 isAssoDevLinkCallId
  235. **【函数功能】 DevLinkCallId是否与当前线路有关联
  236. **【参数】
  237. **【返回值】
  238. ****************************************************************/
  239. bool CTapiLine::isAssoDevLinkCallId( int DevLinkCallId )
  240. {
  241. if(DevLinkCallId == m_DevLinkCallId || DevLinkCallId == m_DevLinkHeldId)
  242. return true;
  243. else
  244. return false;
  245. }
  246. /*****************************************************************
  247. **【函数名称】 onTapiEvent
  248. **【函数功能】 Tapi事件入口主函数
  249. **【参数】
  250. **【返回值】
  251. ****************************************************************/
  252. void CTapiLine::onTapiEvent( DWORD nDevice, DWORD nMsg, DWORD Param1, DWORD Param2, DWORD Param3 )
  253. {
  254. switch(nMsg)
  255. {
  256. case LINE_REPLY: // Reply to an asynchronous TAPI function
  257. __onReply(Param1, Param2);
  258. break;
  259. case LINE_CLOSE: // A line has closed
  260. break;
  261. case LINE_ADDRESSSTATE: // The address state has changed
  262. break;
  263. case LINE_CALLINFO: // The call info has changed
  264. __onCallInfo((HCALL)nDevice, Param1);
  265. break;
  266. case LINE_CALLSTATE: // The call state has changed
  267. __onCallState((HCALL)nDevice, Param1, Param2, Param3);
  268. break;
  269. case LINE_LINEDEVSTATE: // The device state has changed
  270. break;
  271. case LINE_APPNEWCALL: // There is a new incoming call
  272. __onNewCall(Param1, (HCALL)Param2, Param3);
  273. break;
  274. case LINE_DEVSPECIFIC: // The device specific data has changed
  275. break;
  276. case LINE_DEVSPECIFICFEATURE: // The device specific features have changed
  277. break;
  278. case LINE_GATHERDIGITS: // A digit has been received
  279. break;
  280. case LINE_GENERATE: // A tone has been generated
  281. break;
  282. case LINE_MONITORDIGITS: // A digit has been received
  283. break;
  284. case LINE_MONITORMEDIA:
  285. break;
  286. case LINE_MONITORTONE: // A tone has been detected
  287. break;
  288. case LINE_REQUEST:
  289. break;
  290. } // end switch
  291. }
  292. /*****************************************************************
  293. **【函数名称】 onDevLinkEventS
  294. **【函数功能】 DEV Link S 事件响应
  295. **【参数】
  296. **【返回值】
  297. ****************************************************************/
  298. void CTapiLine::onDevLinkEventS( DevLinkInfoS* pInfoS )
  299. {
  300. CSingleLock locker(&m_LockSection, TRUE);
  301. _procDevLinkEventS(pInfoS);
  302. }
  303. /*****************************************************************
  304. **【函数名称】 onDevLinkEventA
  305. **【函数功能】 DEV Link A 事件响应
  306. **【参数】
  307. **【返回值】
  308. ****************************************************************/
  309. void CTapiLine::onDevLinkEventA( int DevLinkCallId )
  310. {
  311. CSingleLock locker(&m_LockSection, TRUE);
  312. if(m_pCurrTapiOp != NULL)
  313. m_pCurrTapiOp->onDevLinkEventA(this, DevLinkCallId);
  314. }
  315. /*****************************************************************
  316. **【函数名称】 onDevLinkEventD
  317. **【函数功能】 DEV Link D 事件响应
  318. **【参数】
  319. **【返回值】
  320. ****************************************************************/
  321. void CTapiLine::onDevLinkEventD( int DevLinkCallId )
  322. {
  323. CSingleLock locker(&m_LockSection, TRUE);
  324. _procDevLinkEventD(DevLinkCallId);
  325. }
  326. /*****************************************************************
  327. **【函数名称】 LineReopen
  328. **【函数功能】 线路重新打开
  329. **【参数】
  330. **【返回值】 操作是否成功
  331. ****************************************************************/
  332. bool CTapiLine::lineReopen( void )
  333. {
  334. ::lineClose(m_Handle);
  335. ::lineOpen(m_LineApp, m_DevID, &m_Handle, m_ApiVersion, 0, m_DevID, LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_INTERACTIVEVOICE, 0);
  336. LINEDEVCAPS* pDevCaps = (LINEDEVCAPS *) new BYTE[512];
  337. ZeroMemory(&pDevCaps[0], 512);
  338. pDevCaps->dwTotalSize = 512;
  339. ::lineGetDevCaps(m_LineApp, m_DevID, m_ApiVersion, 0, pDevCaps);
  340. ::lineSetStatusMessages(m_Handle, LINE_DEV_STATE_ALL, LINE_ADDRESS_STATE_ALL);
  341. delete[] pDevCaps; // 释放内存
  342. return true;
  343. }
  344. /*****************************************************************
  345. **【函数名称】 LineMakeCall
  346. **【函数功能】 呼出
  347. **【参数】 pszDest 被叫号码
  348. **【返回值】 bool 操作是否成功
  349. hWaitingCall 等待后续处理的呼叫句柄
  350. ****************************************************************/
  351. bool CTapiLine::lineMakeCall( LPCTSTR pszDest, HCALL& WaitingCall )
  352. {
  353. size_t cbDestAddress = strlen(pszDest) + 1;
  354. size_t cbCallParams = sizeof(LINECALLPARAMS) + cbDestAddress;
  355. LINECALLPARAMS* pCallParams = (LINECALLPARAMS*)(new BYTE[cbCallParams]);
  356. // Setup the parameters
  357. if (pCallParams)
  358. {
  359. ZeroMemory(pCallParams, cbCallParams);
  360. pCallParams->dwTotalSize = cbCallParams;
  361. pCallParams->dwBearerMode = LINEBEARERMODE_VOICE;
  362. pCallParams->dwMinRate = 0; // Use device default
  363. pCallParams->dwMaxRate = 0; // Use device default
  364. pCallParams->dwMediaMode = LINEMEDIAMODE_INTERACTIVEVOICE;
  365. pCallParams->dwCallParamFlags = 0; // No flags
  366. pCallParams->dwAddressMode = LINEADDRESSMODE_ADDRESSID;
  367. pCallParams->dwAddressID = 0; // Use the main (and only) line address
  368. // Variable length strings
  369. pCallParams->dwDisplayableAddressSize = cbDestAddress;
  370. pCallParams->dwDisplayableAddressOffset = sizeof(LINECALLPARAMS);
  371. char* pszDisplayableAddress = (char*)((BYTE*)pCallParams + sizeof(LINECALLPARAMS));
  372. lstrcpy(pszDisplayableAddress, pszDest);
  373. }
  374. // Ask TAPI to make the call
  375. HRESULT hRet = ::lineMakeCall(m_Handle, &WaitingCall, pszDest, 0, pCallParams);
  376. delete[] pCallParams;
  377. return hRet > 0 ? true : false;
  378. }
  379. /*****************************************************************
  380. **【函数名称】 lineAnswerCall
  381. **【函数功能】 应答呼叫
  382. **【参数】 要应答的呼叫句柄
  383. **【返回值】
  384. ****************************************************************/
  385. bool CTapiLine::lineAnswerCall( HCALL CallId )
  386. {
  387. HRESULT hRet = ::lineAnswer(CallId, NULL, 0);
  388. return hRet > 0;
  389. }
  390. /*****************************************************************
  391. **【函数名称】 lineDropCall
  392. **【函数功能】 终止呼叫
  393. **【参数】 要挂断的呼叫句柄
  394. **【返回值】
  395. ****************************************************************/
  396. bool CTapiLine::lineDropCall( HCALL CallId )
  397. {
  398. HRESULT hRet = ::lineDrop(CallId, NULL, 0);
  399. return hRet > 0;
  400. }
  401. /*****************************************************************
  402. **【函数名称】 lineHold
  403. **【函数功能】 呼叫保持
  404. **【参数】 要保持的呼叫句柄
  405. **【返回值】
  406. ****************************************************************/
  407. bool CTapiLine::lineHold( HCALL CallId )
  408. {
  409. HRESULT hRet = ::lineHold(CallId);
  410. return hRet > 0;
  411. }
  412. /*****************************************************************
  413. **【函数名称】 lineTakeBack
  414. **【函数功能】 呼叫接回
  415. **【参数】 要接回的呼叫句柄
  416. **【返回值】
  417. ****************************************************************/
  418. bool CTapiLine::lineTakeBack( HCALL CallId )
  419. {
  420. HRESULT hRet = ::lineUnhold(CallId);
  421. return hRet > 0;
  422. }
  423. /*****************************************************************
  424. **【函数名称】 lineListen
  425. **【函数功能】 监听
  426. **【参数】 监听的目的地址
  427. **【返回值】
  428. ****************************************************************/
  429. bool CTapiLine::lineListen( LPCTSTR pszDest )
  430. {
  431. TCHAR buffer[50];
  432. DWORD len = 0;
  433. buffer[0] = 9;
  434. buffer[1] = 100; // Listen
  435. lstrcpy(&(buffer[2]),pszDest);
  436. buffer[2 + _tcslen(pszDest)] = 0; // NULL terminate
  437. len = 3 + _tcslen(pszDest);
  438. HRESULT hRet = ::lineDevSpecific(m_Handle, 0, NULL, buffer, len);
  439. return hRet > 0;
  440. }
  441. /*****************************************************************
  442. **【函数名称】 lineDial
  443. **【函数功能】 在指定呼叫上开始呼叫操作
  444. **【参数】 CallId 执行Dial操作的呼叫句柄
  445. pszDest 被叫号码
  446. **【返回值】
  447. ****************************************************************/
  448. bool CTapiLine::lineDial( HCALL CallId, LPCTSTR pszDest )
  449. {
  450. HRESULT hRet = ::lineDial(CallId, pszDest, 0);
  451. return hRet > 0;
  452. }
  453. /*****************************************************************
  454. **【函数名称】 lineRedirectCall
  455. **【函数功能】 重定向呼叫
  456. **【参数】 pszDest 重定向的号码
  457. **【返回值】
  458. ****************************************************************/
  459. bool CTapiLine::lineRedirectCall( HCALL CallId, LPCTSTR pszDest )
  460. {
  461. HRESULT hRet = ::lineRedirect(CallId, pszDest, 0);
  462. return hRet > 0;
  463. }
  464. /*****************************************************************
  465. **【函数名称】 lineInsert
  466. **【函数功能】 强插
  467. **【参数】 强插的目的地址
  468. **【返回值】
  469. ****************************************************************/
  470. bool CTapiLine::lineInsert( LPCTSTR pszDest )
  471. {
  472. TCHAR buffer[50];
  473. DWORD len = 0;
  474. buffer[0] = 9;
  475. buffer[1] = 83; // Intrude
  476. lstrcpy(&(buffer[2]),pszDest);
  477. buffer[2 + _tcslen(pszDest)] = 0; // NULL terminate
  478. len = 3 + _tcslen(pszDest);
  479. HRESULT hRet = ::lineDevSpecific(m_Handle, 0, NULL, buffer, len);
  480. return hRet > 0;
  481. }
  482. /*****************************************************************
  483. **【函数名称】 linePickupCall
  484. **【函数功能】 代答
  485. **【参数】 pszDest 申请代接的号码
  486. **【返回值】
  487. ****************************************************************/
  488. bool CTapiLine::linePickupCall( LPHCALL lphWaitingCall, LPCTSTR pszDest )
  489. {
  490. HRESULT hRet = ::linePickup(m_Handle, 0, lphWaitingCall, pszDest, NULL);
  491. return hRet > 0;
  492. }
  493. /*****************************************************************
  494. **【函数名称】 lineSetupTransfer
  495. **【函数功能】 启动转移
  496. **【参数】
  497. **【返回值】
  498. ****************************************************************/
  499. bool CTapiLine::lineSetupTransfer( LPHCALL lphTransferCall )
  500. {
  501. HRESULT hRet = ::lineSetupTransfer(m_ActiveCall, lphTransferCall, 0);
  502. return hRet > 0;
  503. }
  504. /*****************************************************************
  505. **【函数名称】 lineCompleteTransfer
  506. **【函数功能】 完成转移
  507. **【参数】 HeldCall 被保持的呼叫
  508. TransferCall 新建立的呼叫
  509. **【返回值】
  510. ****************************************************************/
  511. bool CTapiLine::lineCompleteTransfer( HCALL HeldCall, HCALL TransferCall )
  512. {
  513. HRESULT hRet = ::lineCompleteTransfer(HeldCall, TransferCall, NULL, LINETRANSFERMODE_TRANSFER);
  514. return hRet > 0;
  515. }
  516. /*****************************************************************
  517. **【函数名称】 lineCompleteConference
  518. **【函数功能】 完成三方会议
  519. **【参数】 hHeldCall 被保持的呼叫
  520. hTransferCall 新建立的呼叫
  521. **【返回值】
  522. ****************************************************************/
  523. bool CTapiLine::lineCompleteConference( HCALL HeldCall, HCALL ConferenceCall )
  524. {
  525. HCALL hNewConfCall;
  526. HRESULT hRet = ::lineCompleteTransfer(HeldCall, ConferenceCall, &hNewConfCall, LINETRANSFERMODE_CONFERENCE);
  527. return hRet > 0;
  528. }
  529. /*****************************************************************
  530. **【函数名称】 lineGenerateDigit
  531. **【函数功能】 生成按键
  532. **【参数】 CallId 生成按键的呼叫句柄
  533. pszDigits 生成的按键
  534. **【返回值】
  535. ****************************************************************/
  536. bool CTapiLine::lineGenerateDigit( HCALL CallId, LPCTSTR pszDigits )
  537. {
  538. HRESULT hRet = ::lineGenerateDigits(CallId, LINEDIGITMODE_DTMF, pszDigits, 0);
  539. return hRet > 0;
  540. }
  541. /*****************************************************************
  542. **【函数名称】 lineReset
  543. **【函数功能】 线路重置
  544. **【参数】
  545. **【返回值】
  546. ****************************************************************/
  547. bool CTapiLine::lineReset( void )
  548. {
  549. m_DevLinkHeldId = CONST_DEV_LINK_CALL_NULL; // 关闭保持状态
  550. if(m_ActiveCall != NULL)
  551. lineDropCall(m_ActiveCall);
  552. if(m_HeldCall != NULL)
  553. lineDropCall(m_HeldCall);
  554. if(m_PendingCall != NULL)
  555. lineDropCall(m_PendingCall);
  556. return true;
  557. }
  558. /*****************************************************************
  559. **【函数名称】 linePark
  560. **【函数功能】 呼叫停靠
  561. **【参数】 CallId 正在通话的呼叫句柄
  562. pszAddress 停靠地址
  563. **【返回值】
  564. ****************************************************************/
  565. bool CTapiLine::linePark( HCALL CallId, LPCTSTR pszAddress )
  566. {
  567. HRESULT hRet = 0;
  568. if(pszAddress != NULL)
  569. {
  570. hRet = ::linePark(CallId, LINEPARKMODE_DIRECTED, pszAddress, NULL);
  571. }
  572. else
  573. {
  574. DWORD size = 512;
  575. VARSTRING* pAddress = (VARSTRING*) new char[size]; // This should be big enough
  576. ZeroMemory(&pAddress[0], size);
  577. pAddress->dwTotalSize = size;
  578. pAddress->dwStringFormat = STRINGFORMAT_ASCII;
  579. hRet = ::linePark(CallId, LINEPARKMODE_NONDIRECTED, NULL, pAddress);
  580. delete []pAddress;
  581. } // end if
  582. return hRet > 0;
  583. }
  584. /*****************************************************************
  585. **【函数名称】 lineUnPark
  586. **【函数功能】 停靠接回
  587. **【参数】 pszAddress 停靠地址
  588. **【返回值】
  589. ****************************************************************/
  590. bool CTapiLine::lineUnPark( HCALL& CallId, LPCTSTR pszAddress )
  591. {
  592. HRESULT hRet = ::lineUnpark(m_Handle, 0, &CallId, pszAddress);
  593. return hRet > 0;
  594. }