Modem.h
上传用户: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. ////////////////////////////////////////////////////////////////////////////////
  17. //
  18. // The purpose of CModem build the message loop of an independent thread
  19. // into CCommPort and handle communication with other threads.
  20. //
  21. ////////////////////////////////////////////////////////////////////////////////
  22. #ifndef MODEM_H
  23. #define MODEM_H
  24. #include "FaxApi.h"
  25. #include "CommPort.h"
  26. #include "Thread.h"
  27. #include "HiddenWindow.h"
  28. #include "FaxFile.h"
  29. #define WM_MODEM_CONNECT WM_USER+1
  30. #define WM_MODEM_DISCONNECT WM_USER+2
  31. #define WM_MODEM_SENDFAX WM_USER+3
  32. #define WM_MODEM_RECVFAX WM_USER+4
  33. #define WM_MODEM_ABORTFAX WM_USER+5
  34. #define WM_MODEM_CLEARRINGCNT WM_USER+6
  35. #define WM_MODEM_SETID WM_USER+7
  36. #define WM_MODEM_MESSAGE WM_USER+423
  37. #define  XMT_FCF(c) (c|0x01)
  38. #define  RCV_FCF(c) (c)
  39. // Initial identification
  40. #define     DIS 0x80
  41. #define CSI 0x40
  42. #define     NSF 0x20
  43. // Command to send
  44. #define DCS 0x82
  45. #define TSI 0x42
  46. #define     NSS 0x22
  47. // Phase B responses
  48. #define     CFR 0x84
  49. #define     FTT 0x44
  50. // Post-message commands
  51. #define     EOM 0x8e
  52. #define     MPS 0x4e
  53. #define     EOP 0x2e
  54. // Post-mesage responses
  55. #define     MCF 0x8c
  56. #define     RTP 0xcc
  57. #define     PIP 0xac
  58. #define     RTN 0x4c
  59. #define     PIN 0x2c
  60. // Other signals
  61. #define     DCN 0xfa
  62. #define     CRP 0x1a
  63. // ECM frames
  64. #define     FCD 0x06
  65. #define     RCP 0x86
  66. #define     PPS 0xbe
  67. #define     PPR 0xbc
  68. #define RNR 0xec
  69. #define RR 0x6e
  70. #define     CTC 0x12
  71. #define     CTR 0xc4
  72. #define     EOR 0xce
  73. #define     ERR 0x1c
  74. #define     HDLC_FLAG 0x7e
  75. struct InternalModemMsg
  76. {
  77. char szFile[MAX_PATH];
  78. char szNumber[MAX_PATH];
  79. };
  80. typedef union 
  81. {
  82. FaxApiParameters p;
  83. int n[8];
  84. } CommandParameters;
  85. class CModem : 
  86. public CThread, 
  87. public CHiddenWindow,
  88. public CCommPort  
  89. {
  90. public:
  91. CModem();
  92. virtual ~CModem();
  93. enum CommandIDs { COMMAND_NONE, 
  94.   COMMAND_INIT, 
  95.   COMMAND_SETUP_STRING,
  96.   COMMAND_DISABLE_ECHO, 
  97.   COMMAND_SET_SPKR_VOL, 
  98.   COMMAND_SET_SPKR_MODE, 
  99.   COMMAND_SET_FCLASS_1,
  100.   COMMAND_SET_FCLASS_1_0,
  101.   COMMAND_SET_FCLASS_2,
  102.   COMMAND_SET_FCLASS_2_0,
  103.   COMMAND_SET_FCLASS_2_1,
  104.   COMMAND_QUERY_SEND_SPEEDS,
  105.   COMMAND_QUERY_RECEIVE_SPEEDS,
  106.   COMMAND_SET_LOCAL_ID,
  107.   COMMAND_SET_RECV,
  108.   COMMAND_SET_BIT_ORDER,
  109.   COMMAND_SET_FLOW_CONTROL,
  110.   COMMAND_SET_HDLC_REPORTING,
  111.   COMMAND_SET_FAX_PARAMS,
  112.   COMMAND_DIAL,
  113.   COMMAND_HANGUP,
  114.   COMMAND_ANSWER,
  115.   COMMAND_QUERY_FCLASS,
  116.   COMMAND_QUERY_PRODUCT_CODE,
  117.   COMMAND_QUERY_MANUFACTURER,
  118.   COMMAND_QUERY_CLASS2_CAP,
  119.   COMMAND_QUERY_CLASS2_MANUFACT,
  120.   COMMAND_QUERY_CLASS2_MODEL,
  121.   COMMAND_QUERY_CLASS2_0_CAP,
  122.   COMMAND_QUERY_CLASS2_0_MANUFACT,
  123.   COMMAND_QUERY_CLASS2_0_MODEL,
  124.   COMMAND_COUNT };
  125. enum States { STATE_NONE, 
  126.   STATE_INIT, 
  127.   STATE_IDLE,
  128.   STATE_PHASE_A,
  129.                   STATE_PHASE_B,
  130.                   STATE_PHASE_C,
  131.   STATE_PHASE_D,
  132.                   STATE_PHASE_E,
  133.                   STATE_RINGING,
  134.   STATE_HANGUP, // not used
  135.   STATE_DISCONNECT };
  136. enum Events { EVENT_ERROR,
  137.               EVENT_IDLE,
  138.   EVENT_RING,
  139.   EVENT_START_RECV,
  140.   EVENT_START_SEND,
  141.   EVENT_RECV_DIS,
  142.   EVENT_SENT_DIS,
  143.   EVENT_RECV_DCS,
  144.   EVENT_SENT_DCS,
  145.   EVENT_START_TRAINING,
  146.   EVENT_START_PAGE,
  147.   EVENT_PAGE_DATA,
  148.   EVENT_GOT_REMOTEID,
  149.   EVENT_TERMINATE,
  150.   EVENT_DISCONNECT,
  151.   EVENT_CALLERID,
  152.   EVENT_INFO,
  153. };
  154. enum TimerIDs { TIMER_COMMAND, TIMER_HDLC_RECV, TIMER_TRAINING, TIMER_MAXPAGERETRIES };
  155. static char* s_CommonCmds[COMMAND_COUNT];
  156. // These functions call be called by other threads
  157. void Initialize( HANDLE hStop, DWORD faxThreadID );
  158. void SetPort( char* szPort );
  159. void Disconnect(void);
  160. void RecvFax( char* szFaxFile );
  161. void AbortFax(void);
  162. bool IsConnected(void) { return m_bConnected; }
  163. void SetSpkrParams( int nSpkrVol, int nSpkrMode );
  164. void SetDistinctiveRing( LPCSTR szRingCodes ) { m_sRingCodes.assign( szRingCodes ); };
  165. void SetInitString( LPCSTR szString );
  166. void SetSendEncoding( int nEncoding ) { m_nSendEncoding = nEncoding; m_FaxFile.SetSendEncoding( nEncoding ); }; 
  167. void SetSendECM( bool bECMSupported ) { m_bECMSupported = bECMSupported; };
  168. void SetSendFine( bool bFineSupported ) { m_bFineSupported = bFineSupported; };
  169. void SetSendUnlimited( bool bUnlimitedSupported ) { m_bUnlimitedSupported = bUnlimitedSupported; };
  170. void SetMaxPageRetries( int nRetries ) { m_nMaxPageRetries = nRetries; };
  171. void SetPulseDialing( bool bPulseDialing ) { m_bPulseDialing = bPulseDialing; };
  172. void SetCSID( LPCSTR szString );
  173. void ChangeCSID( LPCSTR szString );
  174. void SetSendBaud( int nBaud ) { m_nSendBaud = nBaud; };
  175. void SetRecvBaud( int nBaud ) { m_nRecvBaud = nBaud; };
  176. int GetSendBaud(void) { return m_nSendBaud; };
  177. int GetRecvBaud(void) { return m_nRecvBaud; };
  178. bool SendFax( char* szNumberToDial, char* szFaxFile );
  179. void SetFaxFile( LPCSTR szFaxFile ) { m_FaxFile.SetFileName( szFaxFile ); };
  180. LPCSTR GetLastError( void ) { return m_sLastError.c_str(); }
  181. bool IsReceiving(void) { return m_bReceiving; };
  182. unsigned int GetPageCount(void) { return m_FaxFile.GetPageCount(); };
  183. bool WasSuccessful(void) { return m_bSuccessful; };
  184. bool GetCapParam( int nIndex, int nValue );
  185. LPCSTR GetEIAClass(void) { return m_sEIAClass.c_str(); };
  186. // LPCSTR GetRemoteID(void) { return m_sRemoteCSID.c_str(); };
  187. void ClearRingCount(void);
  188. void SetMaxPageRetriesTimer(void);
  189. bool ThreadStarted(void) { return m_FaxThreadID != 0; };
  190. // Overridden methods of CThread
  191. virtual bool OnStartup(void);
  192. virtual void OnShutdown(void);
  193. virtual bool OnEvent( int nIndex );
  194. virtual bool OnWaitTimeout( void );
  195. virtual bool OnMsg( MSG* pMsg );
  196. virtual void OnRead(void);
  197. // Overridden methods of CHiddenWindow
  198. virtual LRESULT HandleMsg( UINT msg, WPARAM wParam, LPARAM lParam );
  199. // Methods overridden by derived classes
  200. virtual void OnHDLCFrame(void);
  201. virtual void OnPartialHDLCFrame(void);
  202. virtual void OnTimer( UINT nID );
  203. virtual void Abort( bool bUserCancelled );
  204. virtual void CheckTimeouts( DWORD dwInActive );
  205. protected:
  206. bool IsHexDigit( char digit );
  207. bool IsHex( char digit );
  208. void PurgeOutput( void );
  209. void PurgeWriteQueue( void );
  210. void DoHangup( void );
  211. void PhaseHangup(void);
  212. void PhaseDisconnect(void);
  213. void Terminate( void );   // terminates xfer
  214. bool OkToAnswer( void );
  215. bool IsRing(void);
  216. // Message handlers
  217. virtual void OnConnectMsg(void);
  218. virtual void OnDisconnectMsg(void);
  219. virtual void OnSendFaxMsg( MSG* pMsg );
  220. virtual void OnRecvFaxMsg( MSG* pMsg );
  221. virtual void OnAbortFaxMsg(void);
  222. void SendCommand( int nCommand, char* szCmdString = NULL );
  223. void SignalEvent( int nEvent, char info = 0 );
  224. void SignalEventString( int nEvent, LPCSTR szMsg );
  225. void SendModemMessage( int nEvent, FaxApiModemMsg* pMsg );
  226. void ErrorUnexpectedResponse( void );
  227. void ErrorConnectResponse( void );
  228. void ProcSupportedSpeeds( LPSTR lpSpeeds, bool bSend );
  229. int ParseFaxParams( int nMaxParams, int* pParams );
  230. void ProcCapabilities( LPSTR lpCaps );
  231. void ProcCapValue( LPSTR lpValue, int nIndex );
  232. int ProcCapValueIndex( LPSTR lpValue, int nIndex, bool bComma, bool bDash, int nLast );
  233. void ExitAndDelete(void);
  234. // Used by SendCommand
  235. int m_nLastCommand;
  236. string m_LastCommandString;
  237. // int m_nLastCommandTickCount;
  238. string m_sLastError;
  239. int m_nState;
  240. DWORD m_FaxThreadID;
  241. bool m_bConnected;
  242. int m_nSpkrVol;
  243. int m_nSpkrMode;
  244. string m_sInitString;
  245. string m_sEIAClass;
  246. string m_sLocalCSID;
  247. string m_sRemoteCSID;
  248. string m_sRingCodes;
  249. // fax params
  250. string m_sNumberToDial;
  251. CFaxFile m_FaxFile;
  252. bool m_bRecvSupported[MAX_CLS1SPEEDS];
  253. bool m_bSendSupported[MAX_CLS1SPEEDS];
  254. bool m_bECMSupported;
  255. bool m_bFineSupported;
  256. bool m_bUnlimitedSupported;
  257. int m_nSendEncoding;
  258. bool m_ParamMatrix[FAXAPI_MAXPARAMETERS][FAXAPI_MAXPARAMVALUE];
  259. bool m_bEnableReceive;
  260. int m_nRingCount;
  261. int m_nAnswerOnRing;
  262. bool m_bReceiving;
  263. bool m_bSuccessful;
  264. void InitHDLC(void) { m_nHDLCBuffPtr = 0; m_bGotDLE = false; m_bHDLCMode = true; 
  265.                       m_bEolFlag = true; m_bFinalHDLCFrame = false; };
  266. unsigned char m_szHDLCBuff[READBUF_SIZE];
  267. int m_nHDLCBuffPtr;
  268. bool m_bGotDLE;
  269. bool m_bHDLCMode;
  270. bool m_bFinalHDLCFrame;
  271. bool m_bGotOK;
  272. bool m_bGotConnect;
  273. CommandParameters m_DISParams;
  274. CommandParameters m_DCSParams;
  275. unsigned int m_nPageBytes;
  276. int m_nSendBaud;
  277. int m_nRecvBaud;
  278. int m_nMaxSendBaud;
  279. int m_nMaxRecvBaud;
  280. DWORD m_dwActivityTimer;
  281. bool m_bPulseDialing;
  282. int m_nMaxPageRetries;
  283. int m_nMaxPageRetriesPageNo;
  284. bool m_bTerminated;
  285. bool m_bLastPageGood;
  286. };
  287. #endif // MODEM_H