FaxAPI.cpp
上传用户:glass0516
上传日期:2010-01-11
资源大小:104k
文件大小:17k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. * RelayFax Open Source Project
  3. * Copyright 1996-2004 Alt-N Technologies, Ltd.
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted only as authorized by the RelayFax Open 
  8. * Source License.  A copy of this license is available in file LICENSE 
  9. * in the top-level directory of the distribution.
  10. *
  11. * RelayFax is a registered trademark of Alt-N Technologies, Ltd.
  12. *
  13. * Individual files and/or contributed packages may be copyright by
  14. * other parties and subject to additional restrictions.
  15. *****************************************************************************/
  16. #include "stdafx.h"
  17. #include "FaxAPI.h"
  18. #include "ModemDetect.h"
  19. #include "ClassOne.h"
  20. #include "ClassOnePointZero.h"
  21. #include "ClassTwo.h"
  22. #include "ClassTwoPointZero.h"
  23. #include "ClassTwoPointOne.h"
  24. HINSTANCE g_Instance = NULL;
  25. //////////////////////////////////////////////////////////////////////
  26. // TiffWarningHandler
  27. //////////////////////////////////////////////////////////////////////
  28. static void TiffWarningHandler(const char* module, const char* fmt, va_list ap)
  29. {
  30. #ifdef DEBUG
  31. char buf[256] = {0};
  32. _vsnprintf( buf, sizeof(buf) - 1, fmt, ap);
  33. OutputDebugString( "Warning: " );
  34. OutputDebugString( buf );
  35. OutputDebugString( "n" );
  36. #endif
  37. }
  38. //////////////////////////////////////////////////////////////////////
  39. // TiffErrorHandler
  40. //////////////////////////////////////////////////////////////////////
  41. static void TiffErrorHandler(const char* module, const char* fmt, va_list ap)
  42. {
  43. #ifdef DEBUG
  44. char buf[256] = {0};
  45. _vsnprintf( buf, sizeof(buf) - 1, fmt, ap);
  46. OutputDebugString( "Error: " );
  47. OutputDebugString( buf );
  48. OutputDebugString( "n" );
  49. #endif
  50. }
  51. //////////////////////////////////////////////////////////////////////
  52. // DllMain
  53. //////////////////////////////////////////////////////////////////////
  54. BOOL APIENTRY DllMain( HANDLE hModule, 
  55.                        DWORD  dwReason, 
  56.                        LPVOID lpReserved
  57.  )
  58. {
  59. switch (dwReason)
  60. {
  61. case DLL_PROCESS_ATTACH:
  62. g_Instance = (HINSTANCE)hModule;
  63. CHiddenWindow::RegisterWindowClass( g_Instance );
  64. // set tiff error handlers
  65. TIFFSetErrorHandler( TiffErrorHandler );
  66. TIFFSetWarningHandler( TiffWarningHandler );
  67. break;
  68. case DLL_PROCESS_DETACH:
  69. CHiddenWindow::UnRegisterWindowClass();
  70. break;
  71. }
  72.     return TRUE;
  73. }
  74. //////////////////////////////////////////////////////////////////////
  75. // FaxApiGetModem - internal function
  76. //////////////////////////////////////////////////////////////////////
  77. CModem* FaxApiGetModem( FaxApiModem pModem )
  78. {
  79. // check the obvious
  80. if( pModem == NULL )
  81. return NULL;
  82. // and the not so obvious
  83. if( IsBadWritePtr( pModem, sizeof(CModem) ) )
  84. {
  85. return NULL;
  86. }
  87. // cast it
  88. return (CModem*) pModem;
  89. }
  90. //////////////////////////////////////////////////////////////////////
  91. // FaxApiCreateModem
  92. //////////////////////////////////////////////////////////////////////
  93. FaxApiModem FAXAPI_CALL FaxApiCreateModem( int nClass )
  94. {
  95. FaxApiModem pModem = NULL;
  96. CModem* pMdm;
  97. switch( nClass )
  98. {
  99. case FAXAPI_DETECT:
  100. pMdm = new CModemDetect;
  101. break;
  102. case FAXAPI_CLASS_1:
  103. pMdm = new CClassOne;
  104. break;
  105. case FAXAPI_CLASS_1_0:
  106. pMdm = new CClassOnePointZero;
  107. break;
  108. case FAXAPI_CLASS_2:
  109. pMdm = new CClassTwo;
  110. break;
  111. case FAXAPI_CLASS_2_0:
  112. pMdm = new CClassTwoPointZero;
  113. break;
  114. case FAXAPI_CLASS_2_1:
  115. pMdm = new CClassTwoPointOne;
  116. break;
  117. default:
  118. pMdm = NULL;
  119. break;
  120. }
  121. if( pMdm )
  122. {
  123. pModem = pMdm;
  124. }
  125. return pModem;
  126. }
  127. //////////////////////////////////////////////////////////////////////
  128. // FaxApiDeleteMessage
  129. //////////////////////////////////////////////////////////////////////
  130. int FAXAPI_CALL FaxApiDeleteMessage( MSG* pMsg )
  131. {
  132. // todo: check pMsg->cbm_cbSize
  133. if( pMsg == NULL )
  134. {
  135. return FAXAPI_ERROR_BAD_MSG;
  136. }
  137. if( pMsg->lParam == NULL )
  138. {
  139. return FAXAPI_ERROR_BAD_MSG;
  140. }
  141. switch( pMsg->lParam )
  142. {
  143. case FAXAPI_EVENT_DETECT_FINISHED:
  144. {
  145. FaxApiModemDetectMsg* pMMsg = (FaxApiModemDetectMsg*)pMsg->wParam;
  146. if( IsBadWritePtr( pMMsg, sizeof(FaxApiModemDetectMsg) ) )
  147. {
  148. return FAXAPI_ERROR_BAD_MSG;
  149. }
  150. delete pMMsg;
  151. }
  152. break;
  153. default:
  154. {
  155. FaxApiModemMsg* pMMsg = (FaxApiModemMsg*)pMsg->wParam;
  156. if( IsBadWritePtr( pMMsg, sizeof(FaxApiModemMsg) ) )
  157. {
  158. return FAXAPI_ERROR_BAD_MSG;
  159. }
  160. delete pMMsg;
  161. }
  162. }
  163. return FAXAPI_SUCCESS;
  164. }
  165. //////////////////////////////////////////////////////////////////////
  166. // FaxApiSetCommParam
  167. //////////////////////////////////////////////////////////////////////
  168. int FAXAPI_CALL FaxApiSetCommParam( FaxApiModem pModem, DWORD BaudRate, BYTE ByteSize, BYTE Parity, BYTE StopBits )
  169. {
  170. CModem* pMdm = FaxApiGetModem( pModem );
  171. if( pMdm == NULL )
  172. {
  173. return FAXAPI_ERROR_BAD_MODEM;
  174. }
  175. if( pMdm->ThreadStarted() )
  176. {
  177. // can't change the port once the thread is started.
  178. return FAXAPI_ERROR_THREAD_STARTED;
  179. }
  180. pMdm->SetCommParam( BaudRate, ByteSize, Parity, StopBits );
  181. return FAXAPI_SUCCESS;
  182. }
  183. //////////////////////////////////////////////////////////////////////
  184. // FaxApiSetFlowControl
  185. //////////////////////////////////////////////////////////////////////
  186. int FAXAPI_CALL FaxApiSetFlowControl( FaxApiModem pModem, bool bDSRFlowControl, bool bCTSFlowControl, bool bSoftFlowControl )
  187. {
  188. CModem* pMdm = FaxApiGetModem( pModem );
  189. if( pMdm == NULL )
  190. {
  191. return FAXAPI_ERROR_BAD_MODEM;
  192. }
  193. if( pMdm->ThreadStarted() )
  194. {
  195. // can't change the port once the thread is started.
  196. return FAXAPI_ERROR_THREAD_STARTED;
  197. }
  198. pMdm->SetFlowControl( bDSRFlowControl, bCTSFlowControl, bSoftFlowControl );
  199. return FAXAPI_SUCCESS;
  200. }
  201. //////////////////////////////////////////////////////////////////////
  202. // FaxApiSetPort
  203. //////////////////////////////////////////////////////////////////////
  204. int FAXAPI_CALL FaxApiSetPort( FaxApiModem pModem, char* szPort )
  205. {
  206. CModem* pMdm = FaxApiGetModem( pModem );
  207. if( pMdm == NULL )
  208. {
  209. return FAXAPI_ERROR_BAD_MODEM;
  210. }
  211. if( pMdm->ThreadStarted() )
  212. {
  213. // can't change the port once the thread is started.
  214. return FAXAPI_ERROR_THREAD_STARTED;
  215. }
  216. pMdm->SetPort( szPort );
  217. return FAXAPI_SUCCESS;
  218. }
  219. //////////////////////////////////////////////////////////////////////
  220. // FaxApiSetSpkrParams
  221. //////////////////////////////////////////////////////////////////////
  222. int FAXAPI_CALL FaxApiSetSpkrParams( FaxApiModem pModem, int nSpkrVol, int nSpkrMode )
  223. {
  224. CModem* pMdm = FaxApiGetModem( pModem );
  225. if( pMdm == NULL )
  226. {
  227. return FAXAPI_ERROR_BAD_MODEM;
  228. }
  229. if( pMdm->ThreadStarted() )
  230. {
  231. // can't change the port once the thread is started.
  232. return FAXAPI_ERROR_THREAD_STARTED;
  233. }
  234. pMdm->SetSpkrParams( nSpkrVol, nSpkrMode );
  235. return FAXAPI_SUCCESS;
  236. }
  237. //////////////////////////////////////////////////////////////////////
  238. // FaxApiSetDistinctiveRing
  239. //////////////////////////////////////////////////////////////////////
  240. int FAXAPI_CALL FaxApiSetDistinctiveRing( FaxApiModem pModem, LPCSTR szRingCodes )
  241. {
  242. CModem* pMdm = FaxApiGetModem( pModem );
  243. if( pMdm == NULL )
  244. {
  245. return FAXAPI_ERROR_BAD_MODEM;
  246. }
  247. if( pMdm->ThreadStarted() )
  248. {
  249. // can't change the port once the thread is started.
  250. return FAXAPI_ERROR_THREAD_STARTED;
  251. }
  252. pMdm->SetDistinctiveRing( szRingCodes );
  253. return FAXAPI_SUCCESS;
  254. }
  255. //////////////////////////////////////////////////////////////////////
  256. // FaxApiSetInitString
  257. //////////////////////////////////////////////////////////////////////
  258. int FAXAPI_CALL FaxApiSetInitString( FaxApiModem pModem, LPCSTR szString )
  259. {
  260. CModem* pMdm = FaxApiGetModem( pModem );
  261. if( pMdm == NULL )
  262. {
  263. return FAXAPI_ERROR_BAD_MODEM;
  264. }
  265. if( pMdm->ThreadStarted() )
  266. {
  267. // can't change the port once the thread is started.
  268. return FAXAPI_ERROR_THREAD_STARTED;
  269. }
  270. pMdm->SetInitString( szString );
  271. return FAXAPI_SUCCESS;
  272. }
  273. //////////////////////////////////////////////////////////////////////
  274. // FaxApiSetSendEncoding
  275. //////////////////////////////////////////////////////////////////////
  276. int FAXAPI_CALL FaxApiSetSendEncoding( FaxApiModem pModem, int nEncoding )
  277. {
  278. CModem* pMdm = FaxApiGetModem( pModem );
  279. if( pMdm == NULL )
  280. {
  281. return FAXAPI_ERROR_BAD_MODEM;
  282. }
  283. if( pMdm->ThreadStarted() )
  284. {
  285. // can't change the port once the thread is started.
  286. return FAXAPI_ERROR_THREAD_STARTED;
  287. }
  288. pMdm->SetSendEncoding( nEncoding );
  289. return FAXAPI_SUCCESS;
  290. }
  291. //////////////////////////////////////////////////////////////////////
  292. // FaxApiSetSendECM
  293. //////////////////////////////////////////////////////////////////////
  294. int FAXAPI_CALL FaxApiSetSendECM( FaxApiModem pModem, bool bECMSupported )
  295. {
  296. CModem* pMdm = FaxApiGetModem( pModem );
  297. if( pMdm == NULL )
  298. {
  299. return FAXAPI_ERROR_BAD_MODEM;
  300. }
  301. if( pMdm->ThreadStarted() )
  302. {
  303. // can't change the port once the thread is started.
  304. return FAXAPI_ERROR_THREAD_STARTED;
  305. }
  306. pMdm->SetSendECM( bECMSupported );
  307. return FAXAPI_SUCCESS;
  308. }
  309. //////////////////////////////////////////////////////////////////////
  310. // FaxApiSetSendFine
  311. //////////////////////////////////////////////////////////////////////
  312. int FAXAPI_CALL FaxApiSetSendFine( FaxApiModem pModem, bool bFineSupported )
  313. {
  314. CModem* pMdm = FaxApiGetModem( pModem );
  315. if( pMdm == NULL )
  316. {
  317. return FAXAPI_ERROR_BAD_MODEM;
  318. }
  319. if( pMdm->ThreadStarted() )
  320. {
  321. // can't change the port once the thread is started.
  322. return FAXAPI_ERROR_THREAD_STARTED;
  323. }
  324. pMdm->SetSendFine( bFineSupported );
  325. return FAXAPI_SUCCESS;
  326. }
  327. //////////////////////////////////////////////////////////////////////
  328. // FaxApiSetSendUnlimited
  329. //////////////////////////////////////////////////////////////////////
  330. int FAXAPI_CALL FaxApiSetSendUnlimited( FaxApiModem pModem, bool bUnlimitedSupported )
  331. {
  332. CModem* pMdm = FaxApiGetModem( pModem );
  333. if( pMdm == NULL )
  334. {
  335. return FAXAPI_ERROR_BAD_MODEM;
  336. }
  337. if( pMdm->ThreadStarted() )
  338. {
  339. // can't change the port once the thread is started.
  340. return FAXAPI_ERROR_THREAD_STARTED;
  341. }
  342. pMdm->SetSendUnlimited( bUnlimitedSupported );
  343. return FAXAPI_SUCCESS;
  344. }
  345. //////////////////////////////////////////////////////////////////////
  346. // FaxApiSetPulseDialing
  347. //////////////////////////////////////////////////////////////////////
  348. int FAXAPI_CALL FaxApiSetPulseDialing( FaxApiModem pModem, bool bPulseDialing )
  349. {
  350. CModem* pMdm = FaxApiGetModem( pModem );
  351. if( pMdm == NULL )
  352. {
  353. return FAXAPI_ERROR_BAD_MODEM;
  354. }
  355. if( pMdm->ThreadStarted() )
  356. {
  357. // can't change the port once the thread is started.
  358. return FAXAPI_ERROR_THREAD_STARTED;
  359. }
  360. pMdm->SetPulseDialing( bPulseDialing );
  361. return FAXAPI_SUCCESS;
  362. }
  363. //////////////////////////////////////////////////////////////////////
  364. // FaxApiEnableDebugLog
  365. //////////////////////////////////////////////////////////////////////
  366. int FAXAPI_CALL FaxApiEnableDebugLog( FaxApiModem pModem, bool bEnable, char* LogDirectory )
  367. {
  368. CModem* pMdm = FaxApiGetModem( pModem );
  369. if( pMdm == NULL )
  370. {
  371. return FAXAPI_ERROR_BAD_MODEM;
  372. }
  373. if( pMdm->ThreadStarted() )
  374. {
  375. // can't change the port once the thread is started.
  376. return FAXAPI_ERROR_THREAD_STARTED;
  377. }
  378. pMdm->EnableDebugLog( bEnable, LogDirectory );
  379. return FAXAPI_SUCCESS;
  380. }
  381. //////////////////////////////////////////////////////////////////////
  382. // FaxApiEnableDebugLog
  383. //////////////////////////////////////////////////////////////////////
  384. int FAXAPI_CALL FaxApiSetMaxPageRetries( FaxApiModem pModem, int nRetries )
  385. {
  386. CModem* pMdm = FaxApiGetModem( pModem );
  387. if( pMdm == NULL )
  388. {
  389. return FAXAPI_ERROR_BAD_MODEM;
  390. }
  391. if( pMdm->ThreadStarted() )
  392. {
  393. // can't change the port once the thread is started.
  394. return FAXAPI_ERROR_THREAD_STARTED;
  395. }
  396. pMdm->SetMaxPageRetries( nRetries );
  397. return FAXAPI_SUCCESS;
  398. }
  399. //////////////////////////////////////////////////////////////////////
  400. // FaxApiSetCSID
  401. //////////////////////////////////////////////////////////////////////
  402. int FAXAPI_CALL FaxApiSetCSID( FaxApiModem pModem, LPCSTR szString )
  403. {
  404. CModem* pMdm = FaxApiGetModem( pModem );
  405. if( pMdm == NULL )
  406. {
  407. return FAXAPI_ERROR_BAD_MODEM;
  408. }
  409. if( pMdm->ThreadStarted() )
  410. {
  411. pMdm->ChangeCSID( szString );
  412. return FAXAPI_SUCCESS;
  413. }
  414. pMdm->SetCSID( szString );
  415. return FAXAPI_SUCCESS;
  416. }
  417. //////////////////////////////////////////////////////////////////////
  418. // FaxApiSetSendBaud
  419. //////////////////////////////////////////////////////////////////////
  420. int FAXAPI_CALL FaxApiSetSendBaud( FaxApiModem pModem, int nBaud )
  421. {
  422. CModem* pMdm = FaxApiGetModem( pModem );
  423. if( pMdm == NULL )
  424. {
  425. return FAXAPI_ERROR_BAD_MODEM;
  426. }
  427. if( pMdm->ThreadStarted() )
  428. {
  429. // can't change the port once the thread is started.
  430. return FAXAPI_ERROR_THREAD_STARTED;
  431. }
  432. pMdm->SetSendBaud( nBaud );
  433. return FAXAPI_SUCCESS;
  434. }
  435. //////////////////////////////////////////////////////////////////////
  436. // FaxApiSetRecvBaud
  437. //////////////////////////////////////////////////////////////////////
  438. int FAXAPI_CALL FaxApiSetRecvBaud( FaxApiModem pModem, int nBaud )
  439. {
  440. CModem* pMdm = FaxApiGetModem( pModem );
  441. if( pMdm == NULL )
  442. {
  443. return FAXAPI_ERROR_BAD_MODEM;
  444. }
  445. if( pMdm->ThreadStarted() )
  446. {
  447. // can't change the port once the thread is started.
  448. return FAXAPI_ERROR_THREAD_STARTED;
  449. }
  450. pMdm->SetRecvBaud( nBaud );
  451. return FAXAPI_SUCCESS;
  452. }
  453. //////////////////////////////////////////////////////////////////////
  454. // FaxApiStartThread
  455. //////////////////////////////////////////////////////////////////////
  456. int FAXAPI_CALL FaxApiStartThread( FaxApiModem pModem, HANDLE hStop, DWORD faxThreadID )
  457. {
  458. CModem* pMdm = FaxApiGetModem( pModem );
  459. if( pMdm == NULL )
  460. {
  461. return FAXAPI_ERROR_BAD_MODEM;
  462. }
  463. if( pMdm->ThreadStarted() )
  464. {
  465. // can't change the port once the thread is started.
  466. return FAXAPI_ERROR_THREAD_STARTED;
  467. }
  468. pMdm->Initialize( hStop, faxThreadID );
  469. return FAXAPI_SUCCESS;
  470. }
  471. //////////////////////////////////////////////////////////////////////
  472. // FaxApiWaitForModemToExit
  473. //////////////////////////////////////////////////////////////////////
  474. int FAXAPI_CALL FaxApiWaitForModemToExit( FaxApiModem pModem )
  475. {
  476. CModem* pMdm = FaxApiGetModem( pModem );
  477. if( pMdm == NULL )
  478. {
  479. return FAXAPI_ERROR_BAD_MODEM;
  480. }
  481. if( pMdm->ThreadStarted() == false)
  482. {
  483. // can't wait for the modem if isn't started
  484. return FAXAPI_ERROR_THREAD_STARTED;
  485. }
  486. DWORD dwResult = WaitForSingleObject( pMdm->GetHandle(), 5000 );
  487. if( dwResult == WAIT_OBJECT_0 )
  488. {
  489. return FAXAPI_SUCCESS;
  490. }
  491. else
  492. {
  493. return FAXAPI_ERROR_BAD_MODEM;
  494. }
  495. }
  496. //////////////////////////////////////////////////////////////////////
  497. // FaxApiSendFax
  498. //////////////////////////////////////////////////////////////////////
  499. bool FAXAPI_CALL FaxApiSendFax( FaxApiModem pModem, char* szNumberToDial, char* szFaxFile )
  500. {
  501. CModem* pMdm = FaxApiGetModem( pModem );
  502. if( pMdm == NULL )
  503. {
  504. return false;
  505. }
  506. if( pMdm->ThreadStarted() == false)
  507. {
  508. // can't wait for the modem if isn't started
  509. return false;
  510. }
  511. return pMdm->SendFax( szNumberToDial, szFaxFile );
  512. }
  513. //////////////////////////////////////////////////////////////////////
  514. // FaxApiReceiveFax
  515. //////////////////////////////////////////////////////////////////////
  516. void FAXAPI_CALL FaxApiReceiveFax( FaxApiModem pModem, char* szFaxFile )
  517. {
  518. CModem* pMdm = FaxApiGetModem( pModem );
  519. if( pMdm == NULL )
  520. {
  521. return;
  522. }
  523. if( pMdm->ThreadStarted() == false)
  524. {
  525. // can't wait for the modem if isn't started
  526. return;
  527. }
  528. pMdm->RecvFax( szFaxFile );
  529. }
  530. //////////////////////////////////////////////////////////////////////
  531. // FaxApiAbortFax
  532. //////////////////////////////////////////////////////////////////////
  533. void FAXAPI_CALL FaxApiAbortFax( FaxApiModem pModem )
  534. {
  535. CModem* pMdm = FaxApiGetModem( pModem );
  536. if( pMdm == NULL )
  537. {
  538. return;
  539. }
  540. if( pMdm->ThreadStarted() == false)
  541. {
  542. // can't abort fax if the modem isn't started
  543. return;
  544. }
  545. pMdm->AbortFax();
  546. }
  547. //////////////////////////////////////////////////////////////////////
  548. // FaxApiDisconnect
  549. //////////////////////////////////////////////////////////////////////
  550. void FAXAPI_CALL FaxApiDisconnect( FaxApiModem pModem )
  551. {
  552. CModem* pMdm = FaxApiGetModem( pModem );
  553. if( pMdm == NULL )
  554. {
  555. return;
  556. }
  557. if( pMdm->ThreadStarted() == false)
  558. {
  559. // can't abort fax if the modem isn't started
  560. return;
  561. }
  562. pMdm->Disconnect();
  563. }
  564. //////////////////////////////////////////////////////////////////////
  565. // FaxApiClearRingCount
  566. //////////////////////////////////////////////////////////////////////
  567. void FAXAPI_CALL FaxApiClearRingCount( FaxApiModem pModem )
  568. {
  569. CModem* pMdm = FaxApiGetModem( pModem );
  570. if( pMdm == NULL )
  571. {
  572. return;
  573. }
  574. if( pMdm->ThreadStarted() == false)
  575. {
  576. return;
  577. }
  578. pMdm->ClearRingCount();
  579. }