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

传真(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 "../src/FaxApi.h"
  18. HANDLE hStop = NULL;
  19. bool bUseClass2 = false;
  20. bool bUseClass20 = false;
  21. BOOL WINAPI ControlHandler ( DWORD dwCtrlType )
  22. {
  23.     switch( dwCtrlType )
  24.     {
  25.         case CTRL_BREAK_EVENT:  // use Ctrl+C or Ctrl+Break to simulate
  26.         case CTRL_C_EVENT:      // SERVICE_CONTROL_STOP in debug mode
  27. SetEvent( hStop );
  28.             return TRUE;
  29.             break;
  30.     }
  31.     return FALSE;
  32. }
  33. WORD Cls2ScanTimes_normal[8] = { 0, 5, 10, 10, 20, 20, 40, 40 };
  34. WORD Cls2ScanTimes_fine[8] = { 0, 5, 5, 10, 10, 20, 20, 40 };
  35. char* Cls2FaxParamResolutions[2] = { "Normal","Fine" };
  36. WORD  Cls2FaxParamBitRates[6] = { 2400, 4800, 7200, 9600, 12000, 14400 };
  37. WORD  Cls2FaxParamPageWidths[5] = { 1728, 2048, 2432, 1216, 864 };
  38. char* Cls2FaxParamPageLengths[3] = { "A4", "B4", "Unlimited" };
  39. char* Cls2FaxParamDataFormats[4] = { "1D", "2D", "Uncompressed", "T.6" };
  40. char* Cls2FaxParamErrorCheckings[3] = { "No", "Yes", "Yes" };
  41. void ShowParameters( FaxApiModemMsg* pMMsg )
  42. {
  43. printf( "(%d baud, w=%d, l=%s, %s, %s, ECM=%s, scan=%dms)n",
  44.     Cls2FaxParamBitRates[pMMsg->p.BitRate],
  45. Cls2FaxParamPageWidths[pMMsg->p.PageWidth],
  46. Cls2FaxParamPageLengths[pMMsg->p.PageLength],
  47.     Cls2FaxParamResolutions[pMMsg->p.VertRes],
  48. Cls2FaxParamDataFormats[pMMsg->p.DataFormat],
  49. Cls2FaxParamErrorCheckings[pMMsg->p.ECM],
  50. (pMMsg->p.VertRes == 0) ? 
  51. Cls2ScanTimes_normal[pMMsg->p.ScanTime] :
  52. Cls2ScanTimes_fine[pMMsg->p.ScanTime] );          
  53. }
  54. void ShowDetectionResults( FaxApiModemDetectMsg* pMsg )
  55. {
  56. printf( "Modem supports classes: %sn", pMsg->m_szClasses );
  57. printf( "Manufacturer: %sn", pMsg->m_szManufacturer );
  58. printf( "Model: %sn", pMsg->m_szModel );
  59. printf( "Product Code: %sn", pMsg->m_szProductCode );
  60. printf( "ID: %sn", pMsg->m_szIDCode );
  61. if( pMsg->m_bClass2 )
  62. {
  63. printf( "Class 2 capabilities: %s,%s,%sn", 
  64.  (pMsg->m_Class2Matrix[0][1]) ? "Fine" : "Normal",
  65.  (pMsg->m_Class2Matrix[4][3]) ? "2D Group 4" : ( pMsg->m_Class2Matrix[4][1] ? "2D Group 3" : "1D Group 3" ),
  66.  (pMsg->m_Class2Matrix[5][2]) ? "ECM" : "no ECM" );
  67. bUseClass2 = true;
  68. }
  69. if( pMsg->m_bClass2_0 )
  70. {
  71. printf( "Class 2.0 capabilities: %s,%s,%sn",
  72.  (pMsg->m_Class20Matrix[0][1]) ? "Fine" : "Normal",
  73.  (pMsg->m_Class20Matrix[4][3]) ? "2D Group 4" : ( pMsg->m_Class20Matrix[4][1] ? "2D Group 3" : "1D Group 3" ),
  74.  (pMsg->m_Class20Matrix[5][1]) ? "ECM" : "no ECM" );
  75. bUseClass20 = true;
  76. }
  77. }
  78. int MessageLoop( void )
  79. {
  80. int ret = -1;
  81. MSG msg;
  82. while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
  83. {
  84. if( msg.message == FAXAPI_MESSAGE )
  85. {
  86. FaxApiModemMsg* pMsg = (FaxApiModemMsg*) msg.wParam;
  87. switch( msg.lParam )
  88. {
  89. case FAXAPI_EVENT_ERROR:
  90. printf( "Modem Error: %sn", pMsg->sz );
  91. break;
  92. case FAXAPI_EVENT_IDLE:
  93. printf( "Modem is idlen" );
  94. break;
  95. case FAXAPI_EVENT_RING:
  96. printf( "RINGn" );
  97. break;
  98. case FAXAPI_EVENT_START_RECV:
  99. printf( "Starting to receiven" );
  100. break;
  101. case FAXAPI_EVENT_START_SEND:
  102. printf( "Starting to sendn" );
  103. break;
  104. case FAXAPI_EVENT_RECV_DIS:
  105. printf( "Received DISn" );
  106. ShowParameters( pMsg );
  107. break;
  108. case FAXAPI_EVENT_SENT_DIS:
  109. printf( "Sent DISn" );
  110. ShowParameters( pMsg );
  111. break;
  112. case FAXAPI_EVENT_RECV_DCS:
  113. printf( "Received DCSn" );
  114. ShowParameters( pMsg );
  115. break;
  116. case FAXAPI_EVENT_SENT_DCS:
  117. printf( "Sent DCSn" );
  118. ShowParameters( pMsg );
  119. break;
  120. case FAXAPI_EVENT_START_TRAINING:
  121. printf( "Trainingn" );
  122. break;
  123. case FAXAPI_EVENT_START_PAGE:
  124. printf( "Start Page: %dn", pMsg->t.nPages + 1 );
  125. break;
  126. case FAXAPI_EVENT_PAGE_DATA:
  127. printf( "%d%%n", pMsg->sz[0] );
  128. break;
  129. case FAXAPI_EVENT_GOT_REMOTEID:
  130. printf( "Received ID: %sn", pMsg->sz );
  131. break;
  132. case FAXAPI_EVENT_TERMINATE:
  133. if( pMsg->t.nSuccessful == 1 )
  134. {
  135. printf( "Fax successful.n" );
  136. }
  137. else
  138. {
  139. printf( "Fax failed. %sn", pMsg->sz );
  140. }
  141. break;
  142. case FAXAPI_EVENT_DISCONNECT:
  143. printf( "Modem is disconnectedn" );
  144. break;
  145. case FAXAPI_EVENT_CALLERID:
  146. printf( "CallerID: %s n", pMsg->sz );
  147. break;
  148. case FAXAPI_EVENT_INFO:
  149. printf( "%sn", pMsg->sz );
  150. break;
  151. case FAXAPI_EVENT_DETECT_FINISHED:
  152. printf( "Detection finishedn" );
  153. ShowDetectionResults( (FaxApiModemDetectMsg*)msg.wParam );
  154. break;
  155. default:
  156. printf( "received event %dn", msg.lParam );
  157. break;
  158. }
  159. ret = msg.lParam;
  160. FaxApiDeleteMessage( &msg );
  161. }
  162. else
  163. {
  164. TranslateMessage( &msg );
  165. DispatchMessage( &msg );
  166. }
  167. }
  168. return ret;
  169. }
  170. void printusage()
  171. {
  172. printf( "nNot enough parametersn" );
  173. printf( "usage:tFaxEngineCmd port command faxfile numbernn" );
  174. printf( "tport - com port, e.g.: COM1n" );
  175. printf( "tif command is send, you need both faxfile and numbern" );
  176. printf( "tif command is recv, you only need faxfilen" );
  177. printf( "tfaxfile - tiff file to read or createn" ); 
  178. }
  179. void ModemDetection( char* szPort )
  180. {
  181.   printf( "nDetecting modem on %sn", szPort );
  182. FaxApiModem pDetect = FaxApiCreateModem( FAXAPI_DETECT );
  183. if( pDetect == NULL )
  184. {
  185. printf( "FaxApiCreateModem failedn" );
  186. return;
  187. }
  188. FaxApiEnableDebugLog( pDetect, true, "" );
  189. FaxApiSetCommParam( pDetect, 19200, 8, NOPARITY, ONESTOPBIT );
  190. FaxApiSetFlowControl( pDetect, false, true, true );
  191. FaxApiSetPort( pDetect, szPort );
  192. hStop = CreateEvent( NULL, TRUE, FALSE, NULL );
  193. FaxApiStartThread( pDetect, hStop, GetCurrentThreadId() );
  194. bool bRun = true;
  195. while( bRun )
  196. {
  197. DWORD dwResult = MsgWaitForMultipleObjects( 1, &hStop, FALSE, INFINITE, QS_ALLINPUT );
  198. if( dwResult == WAIT_OBJECT_0 )
  199. {
  200. // we don't need to tell the modem to exit, since hStop is the exit signal
  201. FaxApiWaitForModemToExit( pDetect );
  202. bRun = false;
  203. }
  204. else if( dwResult == WAIT_OBJECT_0 + 1 )
  205. {
  206. int nEvent = MessageLoop();
  207. while( nEvent >= 0 )
  208. {
  209. if( nEvent == FAXAPI_EVENT_DISCONNECT )
  210. {
  211. FaxApiWaitForModemToExit( pDetect );
  212. bRun = false;
  213. pDetect = NULL; // the modem will delete itself
  214. }
  215. nEvent = MessageLoop();
  216. }
  217. }
  218. else
  219. {
  220. printf( "MsgWaitForMultipleObjects returned %d LastError=%dn", 
  221.   dwResult, GetLastError() );
  222. bRun = false;
  223. }
  224. }
  225. }
  226. int main(int argc, char* argv[])
  227. {
  228. int nSendCopies = 1;
  229. SetConsoleCtrlHandler( ControlHandler, TRUE );
  230. printf( "RelayFax Open Source Project version 1.0.0n" );
  231. printf( "Copyright 1996-2004 Alt-N Technologies, Ltd.n" );
  232.   printf( "All rights reserved.n" );
  233. if( argc < 4 )
  234. {
  235. printusage();
  236. return -1;
  237. }
  238. // get command-line parameters
  239. bool bSend = (strcmp( "send", argv[2] ) == 0);
  240. if( bSend && argc < 5 )
  241. {
  242. printusage();
  243. return -1;
  244. }
  245.   printf( "nHit Ctrl-C to exitn" );
  246. ModemDetection( argv[1] );
  247. if( bSend )
  248. {
  249. printf( "Connecting to %s to send %s to %sn", argv[1], argv[3], argv[4] );
  250. }
  251. else
  252. {
  253. printf( "Connecting to %s to receive %sn", argv[1], argv[3] );
  254. }
  255. ResetEvent( hStop );
  256. FaxApiModem pModem;
  257. if( bUseClass20 )
  258. {
  259. pModem = FaxApiCreateModem( FAXAPI_CLASS_2_0 );
  260. }
  261. else if ( bUseClass2 )
  262. {
  263. pModem = FaxApiCreateModem( FAXAPI_CLASS_2 );
  264. }
  265. else
  266. {
  267. pModem = FaxApiCreateModem( FAXAPI_CLASS_1 );
  268. }
  269. if( pModem == NULL )
  270. {
  271. printf( "FaxApiCreateModem failedn" );
  272. return -1;
  273. }
  274. FaxApiEnableDebugLog( pModem, true, "" );
  275. FaxApiSetCommParam( pModem, 19200, 8, NOPARITY, ONESTOPBIT );
  276. FaxApiSetFlowControl( pModem, false, true, true );
  277. FaxApiSetPort( pModem, argv[1] );
  278. FaxApiSetInitString( pModem, "AT&F&C1&D2S7=55S0=0" );
  279. FaxApiSetSpkrParams( pModem, FAXAPI_SPKRVOL_LOW, FAXAPI_SPKRMODE_ON );
  280. FaxApiSetDistinctiveRing( pModem, "" );
  281. FaxApiSetSendEncoding( pModem, FAXAPI_ENC_CCITT_T6 ); 
  282. FaxApiSetSendECM( pModem, true );
  283. FaxApiSetSendFine( pModem, true );
  284. FaxApiSetSendUnlimited( pModem, true );
  285. FaxApiSetPulseDialing( pModem, false );
  286. FaxApiSetCSID( pModem, "FAXENGTEST" );
  287. FaxApiSetSendBaud( pModem, FAXAPI_BAUD_14400 );
  288. FaxApiSetRecvBaud( pModem, FAXAPI_BAUD_14400 );
  289. FaxApiStartThread( pModem, hStop, GetCurrentThreadId() );
  290. bool bRun = true;
  291. while( bRun )
  292. {
  293. DWORD dwResult = MsgWaitForMultipleObjects( 1, &hStop, FALSE, INFINITE, QS_ALLINPUT );
  294. if( dwResult == WAIT_OBJECT_0 )
  295. {
  296. // we don't need to tell the modem to exit, since hStop is the exit signal
  297. FaxApiWaitForModemToExit( pModem );
  298. bRun = false;
  299. }
  300. else if( dwResult == WAIT_OBJECT_0 + 1 )
  301. {
  302. int nEvent = MessageLoop();
  303. while( nEvent >= 0 )
  304. {
  305. if( nEvent == FAXAPI_EVENT_IDLE )
  306. {
  307. if( bSend && nSendCopies > 0 ) 
  308. {
  309. FaxApiSendFax( pModem, argv[4], argv[3] );
  310. nSendCopies--;
  311. }
  312. }
  313. if( nEvent == FAXAPI_EVENT_RING )
  314. {
  315. if( !bSend )
  316. {
  317. FaxApiReceiveFax( pModem, argv[3] );
  318. }
  319. }
  320. if( nEvent == FAXAPI_EVENT_DISCONNECT )
  321. {
  322. FaxApiWaitForModemToExit( pModem );
  323. bRun = false;
  324. pModem = NULL; // the modem will delete itself
  325. }
  326. nEvent = MessageLoop();
  327. }
  328. }
  329. else
  330. {
  331. printf( "MsgWaitForMultipleObjects returned %d LastError=%dn", 
  332.   dwResult, GetLastError() );
  333. bRun = false;
  334. }
  335. }
  336. MessageLoop();
  337. printf( "RelayFax Open Source Fax Engine exittingn" );
  338. return 0;
  339. }