Class1.h
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:12k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Class1.h,v 1.18 2008/11/24 06:17:59 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. #ifndef _CLASS1_
  27. #define _CLASS1_
  28. /*
  29.  * EIA/TIA-578 (Class 1) Modem Driver.
  30.  */
  31. #include "FaxModem.h"
  32. #include "FaxParams.h"
  33. class HDLCFrame;
  34. /*
  35.  * Class 1 modem capability (for sending/receiving).
  36.  */
  37. typedef struct {
  38.     int value; // Class 1 parameter value (e.g for +FRM)
  39.     u_char br; // Class 2 bit rate parameter
  40.     u_short sr; // T.30 DCS signalling rate
  41.     u_char mod; // modulation technique
  42.     bool ok; // true if modem is capable
  43.     u_short num; // distinct, incremental numbering
  44. } Class1Cap;
  45. #define HasShortTraining(c) 
  46.     ((c)->mod == V17 && ((c)->value & 1) && (c)[1].ok)
  47. class Class1Modem : public FaxModem {
  48. protected:
  49.     fxStr thCmd; // command for transmitting a frame
  50.     fxStr rhCmd; // command for receiving a frame
  51.     fxStr classCmd; // set class command
  52.     u_int serviceType; // modem service required
  53.     FaxParams dis_caps; // current remote DIS
  54.     u_int frameSize; // size of image frames
  55.     u_int signalRcvd; // last signal received in ECM protocol
  56.     fxStr frameRcvd; // last frame received from the remote
  57.     fxStr signalSent; // last signal sent to remote
  58.     u_int nonV34br; // modemParams.br without V.34
  59.     bool sendERR; // T.30-A send ERR instead of MCF
  60.     bool hadV34Trouble; // indicates failure due to V.34 restrictions
  61.     bool hadV17Trouble; // indicates failure due to V.17 problems
  62.     bool batchingError; // indicates failure due to batching protocol
  63.     bool jbigSupported; // whether or not JBIG is supported in this mode
  64.     bool senderHasV17Trouble; // whether or not a sender has trouble with V.17
  65.     bool senderSkipsV29; // whether or not a sender skips over V.29 usage
  66.     const u_char* frameRev; // HDLC frame bit reversal table
  67.     fxStr lid; // encoded local id string
  68.     fxStr pwd; // transmit password
  69.     fxStr sub; // transmit subaddress
  70.     Class1Cap xmitCaps[15]; // modem send capabilities
  71.     Class1Cap recvCaps[15]; // modem recv capabilities
  72.     u_int capsUsed; // which modulations+bitrates were used in the session
  73.     const Class1Cap* curcap; // capabilities being used
  74.     u_int discap; // DIS signalling rate capabilities
  75.     u_int prevPage; // count of previous pages received
  76.     u_int prevBlock; // count of previous blocks (of this page) received
  77.     bool pageGood; // quality of last page received
  78.     bool recvdDCN; // received DCN frame
  79.     bool messageReceived; // expect/don't expect message carrier
  80.     bool repeatPhaseB; // return to beginning of Phase B before next page
  81.     bool silenceHeard; // indicates whether the last command was +FRS
  82.     time_t lastMCF; // indicates the time of the last MCF signal
  83.     u_int lastPPM; // last PPM during receive
  84.     bool sendCFR; // received TCF was not confirmed
  85.     u_short ecmBitPos; // bit position to populate on ecmByte
  86.     u_int ecmByte; // pending byte to add to ecmBlock
  87.     u_short ecmOnes; // count of consecutive ones for adding zero bits
  88.     u_char* ecmFrame; // to hold outgoing frames as they are read from the file
  89.     u_int ecmFramePos; // fill pointer for ecmFrame
  90.     u_char* ecmBlock; // to hold 256 raw ecmFrames to send before MCF
  91.     u_long ecmBlockPos; // fill pointer for ecmBlock
  92.     u_char* ecmStuffedBlock; // to hold image block after adding transparent zeros and FCS bytes
  93.     u_long ecmStuffedBlockPos; // fill pointer for ecmStuffedBlockPos
  94.     u_int frameNumber; // frame sequence number of ecmFrame in ecmBlock
  95.     u_short blockNumber; // block sequence number of ecmBlock in page
  96.     int imagefd; // file descriptor for raw image
  97.     static const u_int modemPFMCodes[8];// map T.30 FCF to Class 2 PFM
  98.     static const u_int modemPPMCodes[8];// map T.30 FCF to Class 2 PPM
  99.     static const Class1Cap basicCaps[15];
  100.     static const char* rmCmdFmt;
  101.     static const char* tmCmdFmt;
  102.     enum { // modulation techniques
  103. V21   = 0, // v.21, ch 2 300 bits/sec
  104. V27FB = 1, // v.27ter fallback mode
  105. V27   = 2, // v.27ter, 4800, 2400
  106. V29   = 3, // v.29, 9600, 7200
  107. V17   = 4, // v.17, 14400, 12000, 9600, 7200
  108. V33   = 5  // v.33, 14400, 12000, 9600, 7200
  109.     };
  110.     static const char* modulationNames[6];
  111. // V.34 indicators
  112.     bool useV34; // whether or not V.8 handhaking was used
  113.     bool gotEOT; // V.34-fax heard EOT signal
  114.     bool gotCONNECT; // whether or not CONNECT was seen
  115.     bool gotCTRL; // current channel indicator
  116.     bool gotRTNC; // retrain control channel
  117.     u_short primaryV34Rate; // rate indication for primary channel
  118.     u_short controlV34Rate; // rate indication for control channel
  119.     fxStr ctrlFrameRcvd; // unexpected control channel frame received
  120. // modem setup stuff
  121.     virtual bool setupModem(bool isSend = true);
  122.     virtual bool setupClass1Parameters();
  123.     virtual bool setupFlowControl(FlowControl fc);
  124. // transmission support
  125.     bool sendPrologue(FaxParams& dcs_caps, const fxStr& tsi);
  126.     void checkReceiverDIS(Class2Params&);
  127.     bool dropToNextBR(Class2Params&);
  128.     bool raiseToNextBR(Class2Params&);
  129.     bool sendTraining(Class2Params&, int, fxStr& emsg);
  130.     bool sendTCF(const Class2Params&, u_int ms);
  131.     bool sendPage(TIFF* tif, Class2Params&, u_int, u_int, fxStr& emsg);
  132.     bool sendPageData(u_char* data, u_int cc, const u_char* bitrev, bool ecm, fxStr& emsg);
  133.     bool sendRTC(Class2Params params, u_int ppmcmd, uint32 rowsperstrip, fxStr& emsg);
  134.     bool sendPPM(u_int ppm, HDLCFrame& mcf, fxStr& emsg);
  135.     bool decodePPM(const fxStr& pph, u_int& ppm, fxStr& emsg);
  136. // reception support
  137.     const AnswerMsg* findAnswer(const char*);
  138.     bool recvIdentification(
  139.     u_int f1, const fxStr& pwd,
  140.     u_int f2, const fxStr& addr,
  141.     u_int f3, const fxStr& nsf,
  142.     u_int f4, const fxStr& id,
  143.     u_int f5, FaxParams& dics,
  144.     u_int timer, bool notransmit, fxStr& emsg);
  145.     bool recvDCSFrames(HDLCFrame& frame);
  146.     bool recvTraining();
  147.     bool recvPPM(int& ppm, fxStr& emsg);
  148.     bool recvPageData(TIFF*, fxStr& emsg);
  149.     bool raiseRecvCarrier(bool& dolongtrain, fxStr& emsg);
  150.     void recvData(TIFF*, u_char* buf, int n);
  151.     void processDCSFrame(const HDLCFrame& frame);
  152.     void processNewCapabilityUsage();
  153.     void abortPageRecv();
  154. // miscellaneous
  155.     enum { // Class 1-specific AT responses
  156. AT_FCERROR = 100,  // "+FCERROR"
  157. AT_FRH3 = 101 // "+FRH:3"
  158.     };
  159.     virtual ATResponse atResponse(char* buf, long ms = 30*1000);
  160.     virtual bool waitFor(ATResponse wanted, long ms = 30*1000);
  161.     virtual bool atCmd(const fxStr& cmd, ATResponse = AT_OK, long ms = 30*1000);
  162.     bool switchingPause(fxStr& emsg, u_int times = 1);
  163.     void encodeTSI(fxStr& binary, const fxStr& ascii);
  164.     void encodeNSF(fxStr& binary, const fxStr& ascii);
  165.     const fxStr& decodeTSI(fxStr& ascii, const HDLCFrame& binary);
  166.     void encodePWD(fxStr& binary, const fxStr& ascii);
  167.     const fxStr& decodePWD(fxStr& ascii, const HDLCFrame& binary);
  168.     const Class1Cap* findSRCapability(u_short sr, const Class1Cap[]);
  169.     const Class1Cap* findBRCapability(u_short br, const Class1Cap[]);
  170.     static bool isCapable(u_int sr, FaxParams& dis);
  171. // class 1 HDLC frame support
  172.     bool transmitFrame(fxStr& signal);
  173.     bool transmitFrame(u_char fcf, bool lastFrame = true);
  174.     bool transmitFrame(u_char fcf, FaxParams& dcs_caps, bool lastFrame = true);
  175.     bool transmitFrame(u_char fcf, const fxStr&, bool lastFrame=true);
  176.     bool transmitFrame(u_char fcf, const u_char* code, const fxStr&, bool lastFrame=true);
  177.     bool transmitData(int br, u_char* data, u_int cc,
  178.     const u_char* bitrev, bool eod);
  179.     bool sendFrame(u_char fcf, bool lastFrame = true);
  180.     bool sendFrame(u_char fcf, FaxParams& dcs_caps, bool lastFrame = true);
  181.     bool sendFrame(u_char fcf, const fxStr&, bool lastFrame = true);
  182.     bool sendFrame(u_char fcf, const u_char* code, const fxStr&, bool lastFrame = true);
  183.     bool sendRawFrame(HDLCFrame& frame);
  184.     bool sendClass1Data(const u_char* data, u_int cc, const u_char* bitrev, bool eod, long ms);
  185.     bool sendClass1ECMData(const u_char* data, u_int cc,
  186.      const u_char* bitrev, bool eod, u_int ppmcmd, fxStr& emsg);
  187.     bool recvFrame(HDLCFrame& frame, u_char dir, long ms = 10*1000, bool readPending = false, bool docrp = true, bool usehooksensitivity = true);
  188.     bool recvTCF(int br, HDLCFrame&, const u_char* bitrev, long ms);
  189.     bool recvRawFrame(HDLCFrame& frame);
  190.     bool recvECMFrame(HDLCFrame& frame);
  191.     bool        waitForDCEChannel(bool awaitctrl);
  192.     bool        renegotiatePrimary(bool constrain);
  193.     bool syncECMFrame();
  194.     void abortPageECMRecv(TIFF* tif, const Class2Params& params, u_char* block, u_int fcount, u_short seq, bool pagedataseen, fxStr& emsg);
  195.     bool recvPageECMData(TIFF* tif, const Class2Params& params, fxStr& emsg);
  196.     void blockData(u_int byte, bool flag);
  197.     bool blockFrame(const u_char* bitrev, bool lastframe, u_int ppmcmd, fxStr& emsg);
  198.     bool endECMBlock();
  199.     void abortReceive();
  200.     void traceHDLCFrame(const char* direction, const HDLCFrame& frame, bool isecm = false);
  201. // class 1 command support routines
  202.     bool class1Query(const fxStr& queryCmd, Class1Cap caps[]);
  203.     bool parseQuery(const char*, Class1Cap caps[]);
  204. public:
  205.     Class1Modem(FaxServer&, const ModemConfig&);
  206.     virtual ~Class1Modem();
  207.     void hangup();
  208. // send support
  209.     bool sendSetup(FaxRequest&, const Class2Params&, fxStr& emsg);
  210.     CallStatus dialResponse(fxStr& emsg);
  211.     FaxSendStatus getPrologue(Class2Params&, bool&, fxStr&, u_int&);
  212.     void sendBegin();
  213.     void sendSetupPhaseB(const fxStr& pwd, const fxStr& sub);
  214.     FaxSendStatus sendPhaseB(TIFF* tif, Class2Params&, FaxMachineInfo&,
  215.     fxStr& pph, fxStr& emsg, u_int& batched);
  216.     void sendEnd();
  217.     void sendAbort();
  218. // receive support
  219.     CallType answerCall(AnswerType, fxStr& emsg, const char* number);
  220.     FaxParams modemDIS() const;
  221.     bool setupReceive();
  222.     bool recvBegin(FaxSetup* setupinfo, fxStr& emsg);
  223.     bool recvEOMBegin(FaxSetup* setupinfo, fxStr& emsg);
  224.     bool recvPage(TIFF*, u_int& ppm, fxStr& emsg, const fxStr& id);
  225.     bool recvEnd(FaxSetup* setupinfo, fxStr& emsg);
  226.     void recvAbort();
  227.     void pokeConfig(bool isSend);
  228. // polling support
  229.     bool requestToPoll(fxStr&);
  230.     bool pollBegin(const fxStr& cig, const fxStr& sep, const fxStr& pwd,
  231.     fxStr& emsg);
  232. // miscellaneous
  233.     bool faxService(bool enableV34, bool enableV17); // switch to fax mode (send)
  234.     bool reset(long ms); // reset modem
  235.     bool ready(long ms); // ready modem for receive
  236.     void setLID(const fxStr& number); // set local id string
  237.     bool supportsPolling() const; // modem capability
  238. };
  239. #endif /* _CLASS1_ */