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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: FaxModem.h,v 1.16 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 _FAXMODEM_
  27. #define _FAXMODEM_
  28. /*
  29.  * Class 1, 2, and 2.0 Fax Modem Driver Interface.
  30.  */
  31. #include "ClassModem.h"
  32. #include "Class2Params.h"
  33. #include "tiffio.h"
  34. #include "G3Decoder.h"
  35. #include "FaxSendStatus.h"
  36. #include "NSF.h"
  37. #include "FaxParams.h"
  38. class FaxMachineInfo;
  39. class fxStackBuffer;
  40. class FaxFont;
  41. class FaxServer;
  42. // NB: these would be enums in the FaxModem class
  43. //     if there were a portable way to refer to them!
  44. typedef unsigned int RTNHandling;       // RTN signal handling method 
  45. typedef unsigned int BadPageHandling; // bad page (received) handling method 
  46. typedef unsigned int JBIGSupport; // JBIG support available
  47. typedef struct {
  48.     bool senderSkipsV29; // if sender skips V.29 usage
  49.     bool senderHasV17Trouble; // if we have trouble understanding sender's V.17
  50. } FaxSetup;
  51. /*
  52.  * This is an abstract class that defines the interface to
  53.  * the set of modem drivers.  Real drivers are derived from
  54.  * this and fill in the pure virtual methods to, for example,
  55.  * send specific commands to the modem.  The Class2Params
  56.  * structure defines the session parameters used/supported
  57.  * by this interface.  Class2Params is derived from the
  58.  * set of parameters supported by the Class 2 interface spec.
  59.  */
  60. class FaxModem : public ClassModem, public G3Decoder {
  61. private:
  62.     FaxServer& server; // server for getting to device
  63. // transmit tag line support
  64.     u_int pageNumber; // current transmit page number
  65.     u_int pageNumberOfJob;// current transmit page number of Job
  66.     u_int pageNumberOfCall;// current transmit page number of call
  67.     u_int noCountCoverPages; // number of no-count cover pages
  68.     FaxFont* tagLineFont; // font for imaging tag line
  69.     u_int tagLineSlop; // extra space reserved for tag line re-encoding
  70.     fxStr tagLine; // tag line formatted with transmit time
  71.     fxStr tagLineLocale; // locale setting for tagline
  72.     u_int tagLineFields; // number of fields in the tag line
  73.     void setupTagLine(const FaxRequest&, const fxStr& tagLineFmt, const fxStr& locale);
  74. // phase c data receive & copy quality checking
  75.     u_int cblc; // current count of consecutive bad lines
  76.     bool lastRowBad; // last decoded row was bad
  77.     u_long linesWereA4Width;// count of lines measuring 1728 pel
  78.     u_long recvEOLCount; // EOL count for received page
  79.     u_long recvBadLineCount;
  80.     u_long recvConsecutiveBadLineCount;
  81.     tstrip_t recvStrip; // current strip number during receive
  82.     u_char* recvRow; // current receive row raster
  83.     u_char* recvPageStart; // pointer to start of page buffer
  84.     u_long* savedWriteOff; // file offset at start of page data
  85.     u_long* savedStripByteCounts; // byte counts at start of page data
  86.     int decodedPixels; // number of pixels decoded with error
  87.     int decoderFd[2]; // file descriptors for the decoder pipe
  88.     int counterFd[2]; // file descriptors for the counter pipe
  89.     pid_t decoderPid; // process id for the decoding process
  90.     u_char parserBuf[16]; // buffer used for parsing JBIG and JPEG
  91.     u_long parserCount[3]; // counters used in parsing JBIG and JPEG
  92.     int imagefd; // file descriptor for image file
  93.     void flushEncodedData(TIFF*, tstrip_t, const u_char*, u_int, fxStr& emsg);
  94.     void flushRawData(TIFF*, tstrip_t, const u_char*, u_int, fxStr& emsg);
  95.     void invalidCode(const char* type, int x);
  96.     void badPixelCount(const char* type, int got, int expected);
  97.     void badDecodingState(const char* type, int x);
  98. // send/receive session state
  99.     u_int optFrames; // mask of optional frames received 
  100.     fxStr tsi; // received TSI/CSI
  101.     fxStr sub; // received subaddressing string
  102.     fxStr pwd; // received password string
  103.     NSF         nsf; // received nonstandard facilities
  104.     // NB: remaining session state is below (params) or maintained by subclass
  105. protected:
  106. // NB: these are defined protected for convenience (XXX)
  107.     Class2Params modemParams; // NOTE: these are masks of Class 2 codes
  108.     u_int minsp; // minimum required signalling rate
  109.     FaxRequest* curreq; // current job request being processed
  110.     int bytePending; // pending byte on recv
  111.     fxStackBuffer* recvBuf; // raw recv data for when copy quality disabled
  112.     uint32 group3opts; // for writing received TIFF
  113.     Class2Params params; // current session params
  114.     u_int       recvFillOrder;  // bit order of recvd data (ModemConfig & autodetected)
  115.     u_int       sendFillOrder;  // bit order of sent data (ModemConfig & autodetected)
  116.     const u_char* rtcRev;       // bit reversal table for RTC
  117.     bool pageStarted; // recvStartPage has been called
  118.     FaxModem(FaxServer&, const ModemConfig&);
  119. // miscellaneous
  120.     void countPage();
  121.     int getPageNumberOfCall();
  122.     void recvTrace(const char* fmt, ...);
  123.     void copyQualityTrace(const char* fmt, ...);
  124.     void traceModemParams();
  125.     void traceFCF(const char* dir, u_int fcf);
  126.     void parseJPEGStream(u_char c);
  127.     void fixupJPEG(TIFF* tif, fxStr& emsg);
  128.     void parseJBIGStream(u_char c);
  129.     void parseJBIGBIH(u_char* buf);
  130.     void clearSDNORMCount();
  131. // server-related stuff
  132.     bool getHDLCTracing();
  133.     bool getECMTracing();
  134.     FaxSendStatus sendSetupParams(TIFF*, Class2Params&,
  135.     FaxMachineInfo&, fxStr&);
  136.     void recvTSI(const fxStr&);
  137.     void recvPWD(const fxStr&);
  138.     void recvSUB(const fxStr&);
  139.     void recvNSF(const NSF&);
  140.     void recvCSI(const fxStr&);
  141.     void recvDCS(const Class2Params&);
  142.     void recvSetupTIFF(TIFF* tif, long group3opts, int fillOrder, const fxStr& id);
  143.     void recvStartPage(TIFF* tif);
  144.     void recvResetPage(TIFF* tif);
  145.     u_int decodePageChop(const fxStr& pph, const Class2Params&);
  146.     bool decodePPM(const fxStr& pph, u_int& ppm, fxStr& emsg);
  147.     void notifyPageSent(TIFF*);
  148. // phase c data receive & copy quality checking
  149.     bool recvPageDLEData(TIFF* tif, bool checkQuality,
  150.     const Class2Params& params, fxStr& emsg);
  151.     void setupStartPage(TIFF* tif, const Class2Params& params);
  152.     void recvEndPage(TIFF* tif, const Class2Params& params);
  153.     void writeECMData(TIFF*, u_char*, u_int, const Class2Params&, u_short, fxStr& emsg);
  154.     void resetLineCounts();
  155.     void initializeDecoder(const Class2Params&);
  156.     virtual void abortPageRecv() = 0;
  157.     virtual int nextByte();
  158.     bool checkQuality();
  159.     bool isQualityOK(const Class2Params&);
  160.     u_long getRecvEOLCount() const;
  161.     u_long getRecvBadLineCount() const;
  162.     u_long getRecvConsecutiveBadLineCount() const;
  163. // tag line support
  164.     bool setupTagLineSlop(const Class2Params&);
  165.     u_int getTagLineSlop() const;
  166.     u_char* imageTagLine(u_char* buf, u_int fillorder, const Class2Params&, u_long& totdata);
  167. /*
  168.  * Correct if neccessary Phase C (T.4/T.6) data (remove extra RTC/EOFB etc.)
  169.  */
  170.     void correctPhaseCData(u_char* buf, u_long& pBufSize,
  171.                                   u_int fillorder, const Class2Params& params, uint32& rows);
  172. /*
  173.  * Convert Phase C data...
  174.  */
  175.     u_char* convertPhaseCData(u_char* buf, u_long& totdata, u_int fillorder,
  176.                             const Class2Params& params, const Class2Params& newparams, uint32& rows);
  177. public:
  178.     enum { // FaxModem::RTNHandling
  179.         RTN_RETRANSMIT = 0,         // retransmit page after RTN until MCF/MPS
  180.         RTN_GIVEUP     = 1,         // immediately abort
  181.         RTN_IGNORE     = 2,         // ignore error and send next page
  182.         RTN_RETRANSMITIGNORE = 3    // retransmit but ignore error instead of hanging up
  183.     };
  184.     enum { // FaxModem::BadPageHandling
  185. BADPAGE_RTN     = 0, // send RTN, expect a retransmission
  186. BADPAGE_DCN     = 1, // send DCN, expect a disconnection
  187. BADPAGE_RTNSAVE = 2 // send RTN, but save the page
  188.     };
  189.     enum { // FaxModem::JBIGSupport
  190. JBIG_NONE = 0,     // no JBIG support
  191. JBIG_RECV = 1,     // receive-only JBIG support
  192. JBIG_SEND = 2,     // send-only JBIG support
  193. JBIG_FULL = 3     // full JBIG support
  194.     };
  195.     virtual ~FaxModem();
  196.     bool isFaxModem() const;
  197. // configuration controls
  198.     virtual void setLID(const fxStr& number) = 0;
  199.     u_int getCapabilities() const;
  200. // methods for querying modem capabilities
  201.     virtual bool supports2D() const;
  202.     virtual bool supportsMMR() const;
  203.     virtual bool supportsJBIG() const;
  204.     virtual bool supportsEOLPadding() const;
  205.     virtual bool supportsVRes(float res) const;
  206.     virtual bool supportsPageWidth(u_int w, u_int r) const;
  207.     virtual bool supportsPageLength(u_int l) const;
  208.     virtual bool supportsPolling() const;
  209.     virtual bool supportsECM(u_int ec = 0) const;
  210.     virtual int selectSignallingRate(int br) const;
  211.     u_int getBestSignallingRate() const;
  212.     u_int getBestScanlineTime() const;
  213.     virtual int selectScanlineTime(int st) const;
  214.     u_int getNoCountCoverPages();
  215.     u_int getVRes() const;
  216.     u_int getBestDataFormat() const;
  217.     u_int getBestPageWidth() const;
  218.     u_int getBestPageLength() const;
  219.     u_int getBestECM() const;
  220.     FaxParams modemDIS() const;
  221.     /*
  222.      * Fax send protocol.  The expected sequence is:
  223.      *
  224.      * if (faxService() && sendSetup(req, params, emsg) && dial(number, origin, emsg) == OK) {
  225.      *   sendBegin();
  226.      *   if (getPrologue() == send_ok and parameters acceptable) {
  227.      *      select send parameters
  228.      *      sendSetupPhaseB();
  229.      *      for (each file)
  230.      * if (!sendPhaseB()) break;
  231.      *   }
  232.      *   sendEnd();
  233.      * }
  234.      * hangup();
  235.      *
  236.      * The post page handling parameter to sendPhaseB enables the
  237.      * client to control whether successive files are lumped together
  238.      * as a single T.30 document or split apart.  This is important
  239.      * for doing things like keeping cover pages & documents in a
  240.      * single T.30 document.
  241.      */
  242.     virtual bool faxService(bool enableV34, bool enableV17) = 0;
  243.     virtual bool sendSetup(FaxRequest&, const Class2Params& dis, fxStr& emsg);
  244.     virtual void sendBegin();
  245.     virtual FaxSendStatus getPrologue(Class2Params&,
  246. bool& hasDoc, fxStr& emsg, u_int& batched) = 0;
  247.     virtual void sendSetupPhaseB(const fxStr& pwd, const fxStr& sub);
  248.     virtual FaxSendStatus sendPhaseB(TIFF*, Class2Params&, FaxMachineInfo&,
  249. fxStr& pph, fxStr& emsg, u_int& batched) = 0;
  250.     virtual void sendEnd();
  251.     virtual void sendAbort() = 0;
  252.     // query interfaces for optional state
  253.     virtual bool getSendCSI(fxStr&);
  254.     virtual bool getSendNSF(NSF&);
  255.     /*
  256.      * Fax receive protocol.  The expected sequence is:
  257.      *
  258.      * if (waitForRings(nrings, ctype)) { # wait before answering phone
  259.      *    case (answerCall(type, emsg)) {
  260.      *    CALLTYPE_FAX:
  261.      *     if (recvBegin()) {
  262.      *       do {
  263.      * TIFF* tif = TIFFOpen(..., "w");
  264.      * int ppm = PPM_EOP;
  265.      * do {
  266.      *     if (!recvPage(tif, ppm, emsg))
  267.      *         error during receive;
  268.      *         } while (ppm == PPM_MPS);
  269.      * deal with received file
  270.      *       } while (ppm != PPM_EOP);
  271.      *       recvEnd();
  272.      *     }
  273.      *     hangup();
  274.      *   CALLTYPE_DATA:
  275.      *     dataService();
  276.      *     do data kinds of things...
  277.      *   CALLTYPE_VOICE:
  278.      *     voiceService();
  279.      *     do voice kinds of things...
  280.      *    }
  281.      * }
  282.      */
  283.     virtual bool setupReceive() = 0;
  284.     virtual bool recvBegin(FaxSetup* setupinfo, fxStr& emsg);
  285.     virtual bool recvEOMBegin(FaxSetup* setupinfo, fxStr& emsg);
  286.     virtual bool recvPage(TIFF*, u_int& ppm, fxStr& em, const fxStr& id) = 0;
  287.     virtual bool recvEnd(FaxSetup* setupinfo, fxStr& emsg) = 0;
  288.     virtual void recvAbort() = 0;
  289.     virtual void recvSucceeded();
  290.     virtual void pokeConfig(bool isSend) = 0;
  291.     // query interfaces for optional state
  292.     virtual bool getRecvPWD(fxStr&);
  293.     virtual bool getRecvTSI(fxStr&);
  294.     virtual bool getRecvSUB(fxStr&);
  295.     virtual const Class2Params& getRecvParams() const;
  296.     /*
  297.      * Polling protocol (for polling a remote site).  This is done
  298.      * in conjunction with a send operation: first, before dialing,
  299.      * call requestToPoll(), then after sending any files, do:
  300.      *
  301.      * if (pollBegin(...)) {
  302.      *    do {
  303.      *     TIFF* tif = TIFFOpen(..., "w");
  304.      *     if (recvPhaseB(tif, ..., ppm, ...) deal with received file
  305.      *   } while (ppm != PPM_EOP);
  306.      *   recvEnd();
  307.      * }
  308.      *
  309.      * (i.e. it's just like a receive operation.)
  310.      */
  311.     virtual bool requestToPoll(fxStr& emsg) = 0;
  312.     virtual bool pollBegin(
  313. const fxStr& cig, const fxStr& sep, const fxStr& pwd,
  314. fxStr& emsg);
  315. };
  316. #endif /* _FAXMODEM_ */