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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: FaxClient.h,v 1.10 2009/09/29 10:56:42 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 _FaxClient_
  27. #define _FaxClient_
  28. #include "Types.h"
  29. #include "Str.h"
  30. #include "FaxConfig.h"
  31. class Transport;
  32. class FaxClient : public FaxConfig {
  33. public:
  34.     enum { // command reply codes
  35.         PRELIM   = 1, // positive preliminary
  36.         COMPLETE  = 2, // positive completion
  37.         CONTINUE  = 3, // positive intermediate
  38.         TRANSIENT = 4, // transient negative completion
  39.         ERROR   = 5 // permanent negative completion
  40.     };
  41.     enum { // data transfer TYPEs
  42.         TYPE_A = 1, // ASCII
  43.         TYPE_E = 2, // EBCDIC
  44.         TYPE_I = 3, // image
  45.         TYPE_L = 4 // local byte size
  46.     };
  47.     enum { // data transfer file STRUctures
  48.         STRU_F = 1, // file (no record structure)
  49.         STRU_R = 2, // record structure
  50.         STRU_P = 3, // page structure
  51.         STRU_T = 4 // multi-IFD TIFF
  52.     };
  53.     enum { // data transfer MODEs
  54.         MODE_S = 1, // stream
  55.         MODE_B = 2, // block
  56.         MODE_C = 3, // run-length compressed
  57.         MODE_Z = 4 // zlib compressed
  58.     };
  59.     enum { // data file FORMats
  60.         FORM_UNKNOWN = 0, // unknown, initial setting
  61.         FORM_PS   = 1, // PostScript Level I
  62.         FORM_PS2  = 2, // PostScript Level II
  63.         FORM_TIFF = 3, // TIFF
  64.         FORM_PCL  = 4, // HP PCL5
  65.         FORM_PDF  = 5 // Portable Document Format
  66.     };
  67.     enum {
  68.         TZ_GMT   = 1, // use GMT timezone for time values
  69.         TZ_LOCAL  = 2 // use local timezone for time values
  70.     };
  71.     // NB: the F_ prefixes workaround a bug in the AIX xlC compiler
  72.     struct F_stringtag {
  73.         const char*  name;
  74.         fxStr FaxClient::* p;
  75.         const char*  def; // NULL is shorthand for ""
  76.     };
  77.     struct F_numbertag {
  78.         const char*  name;
  79.         u_int FaxClient::*p;
  80.         u_int  def;
  81.     };
  82.     struct FaxParam {
  83.         const char* cmd;
  84.         const char** parmNames;
  85.         u_int NparmNames;
  86.         u_int FaxClient::*pv;
  87.     };
  88.     struct FaxFmtHeader {
  89.         char fmt; // format character used by server
  90.         const char* title; // column title to use
  91.     };
  92. private:
  93.     Transport* transport; // underlying transport protocol support
  94.     fxStr host; // server's host
  95.     fxStr modem; // server's modem
  96.     u_int state; // state flags
  97. #define FS_VERBOSE 0x0001 // print data as sent or received
  98. #define FS_LOGGEDIN 0x0002 // logged in on server
  99. #define FS_TZPEND 0x0004 // tzone setting pending
  100. #define FS_JFMTPEND 0x0008 // job status format string pending
  101. #define FS_RFMTPEND 0x0010 // job status format string pending
  102. #define FS_MFMTPEND 0x0020 // modem status format string pending
  103. #define FS_FFMTPEND 0x0040 // file status format string pending
  104.     fxStr userName; // sender's account name
  105.     fxStr senderName; // sender's full name (if available)
  106.     FILE* fdIn; // control stream input handle
  107.     FILE* fdOut; // control stream output handle
  108.     int fdData; // data transfer connection
  109.     char buf[1024]; // input buffer
  110.     int code; // code from last server repsonse
  111.     bool pasv; // use of passive mode
  112.     fxStr proto; // protocol to use for service query
  113.     fxStr lastResponse; // text message from last server response
  114.     fxStr lastContinuation; // continuation message from last server response
  115.     u_int port; // server port to connect to
  116.     u_int type; // data transfer type
  117.     u_int stru; // file structure
  118.     u_int mode; // data transfer mode
  119.     u_int format; // document format
  120.     u_int tzone; // use GMT or local timezone for time values
  121.     fxStr curjob; // current job's ID
  122.     fxStr jobFmt; // job status format string
  123.     fxStr recvFmt; // recv queue status format string
  124.     fxStr modemFmt; // modem status format string
  125.     fxStr fileFmt; // file status format string
  126.     static F_stringtag strings[];
  127.     static F_numbertag numbers[];
  128.     static FaxParam typeParam;
  129.     static FaxParam modeParam;
  130.     static FaxParam struParam;
  131.     static FaxParam formParam;
  132.     static FaxParam tzoneParam;
  133.     void init(void);
  134.     bool sendRawData(void* buf, int cc, fxStr& emsg);
  135.     bool setCommon(FaxParam&, u_int);
  136. protected:
  137.     FaxClient();
  138.     FaxClient(const fxStr& hostarg);
  139.     FaxClient(const char* hostarg);
  140.     ~FaxClient();
  141.     virtual void vprintError(const char* fmt, va_list ap);
  142.     virtual void vprintWarning(const char* fmt, va_list ap);
  143.     virtual void vtraceServer(const char* fmt, va_list ap);
  144.     void initServerState(void);
  145.     bool jobOp(const char* op, const char* jobid);
  146.     bool extract(u_int& pos, const char* pattern, fxStr& result,
  147.         const char* cmd, fxStr& emsg);
  148.     bool storeUnique(const char* cmd, fxStr& docname, fxStr& emsg);
  149.     const fxStr& getStatusFormat(u_int flag, const char* cmd, fxStr& fmt);
  150.     bool setStatusFormat(const char* cmd, u_int flag, fxStr&, const char*);
  151.     void makeHeader(const char* fmt, const FaxFmtHeader fmts[], fxStr& header);
  152.     virtual bool setupUserIdentity(fxStr& emsg);
  153.     void setupHostModem(const char*);
  154.     void setupHostModem(const fxStr&);
  155.     virtual void resetConfig(void);
  156.     virtual void setupConfig(void);
  157.     virtual bool setConfigItem(const char* tag, const char* value);
  158.     virtual void configError(const char* fmt ...);
  159.     virtual void configTrace(const char* fmt ...);
  160.     void unexpectedResponse(fxStr& emsg);
  161.     void protocolBotch(fxStr& emsg, const char* fmt ...);
  162.     virtual void lostServer(void);
  163. public:
  164.     void printError(const char* fmt ...);
  165.     void printWarning(const char* fmt ...);
  166.     void traceServer(const char* fmt ...);
  167.     // bookkeeping
  168.     void setHost(const fxStr&);
  169.     void setHost(const char*);
  170.     void setPort(int);
  171.     void setProtoName(const char*);
  172.     const fxStr& getHost() const;
  173.     void setModem(const fxStr&);
  174.     void setModem(const char*);
  175.     const fxStr& getModem(void) const;
  176.     virtual bool callServer(fxStr& emsg);
  177.     virtual bool hangupServer(void);
  178.     bool isConnected(void) const;
  179.     bool isPassive(void) const;
  180.     bool login(const char* user, const char* pass, fxStr& emsg);
  181.     bool admin(const char* pass, fxStr& emsg);
  182.     virtual const char* getPasswd(const char* prompt);
  183.     bool isLoggedIn(void) const;
  184.     void setCtrlFds(int in, int out);
  185.     FILE* getCtrlFd(void) const;
  186.     virtual bool initDataConn(fxStr& emsg);
  187.     virtual bool openDataConn(fxStr& emsg);
  188.     virtual void closeDataConn(void);
  189.     virtual bool abortDataConn(fxStr& emsg);
  190.     void setDataFd(int fd);
  191.     int getDataFd(void) const;
  192.     void setVerbose(bool);
  193.     bool getVerbose(void) const;
  194.     int getPort(void) const;
  195.     const fxStr& getProtoName(void) const;
  196.     const fxStr& getSenderName(void) const;
  197.     const fxStr& getUserName(void) const;
  198.     // output
  199.     int command(const char* fmt ...);
  200.     int vcommand(const char* fmt, va_list ap1, va_list ap2);
  201.     int getReply(bool expectEOF);
  202.     const fxStr& getLastResponse(void) const;
  203.     const fxStr& getLastContinuation(void) const;
  204.     int getLastCode(void) const;
  205.     /*
  206.      * Job control support.
  207.      */
  208.     const fxStr& getCurrentJob(void) const;
  209.     bool setCurrentJob(const char* jobid);
  210.     bool newJob(fxStr& jobid, fxStr& groupid, fxStr& emsg);
  211.     bool jobSubmit(const char* jobid);
  212.     bool jobSuspend(const char* jobid);
  213.     bool jobKill(const char* jobid);
  214.     bool jobDelete(const char* jobid);
  215.     bool jobWait(const char* jobid);
  216.     /*
  217.      * Set various job parameters.
  218.      */
  219.     bool jobParm(const char* name, const fxStr& value);
  220.     bool jobParm(const char* name, const char* value);
  221.     bool jobParm(const char* name, bool b);
  222.     bool jobParm(const char* name, u_int v);
  223.     bool jobParm(const char* name, float v);
  224.     bool jobSendTime(const struct tm tm);
  225.     bool jobLastTime(u_long);
  226.     bool jobRetryTime(u_long);
  227.     bool jobCover(const char* docname);
  228.     bool jobDocument(const char* docname);
  229.     bool jobPollRequest(const char* sep, const char* pwd);
  230.     /*
  231.      * Job group control support.
  232.      */
  233.     bool jgrpSubmit(const char* jgrpid);
  234.     bool jgrpSuspend(const char* jgrpid);
  235.     bool jgrpKill(const char* jgrpid);
  236.     bool jgrpWait(const char* jgrpid);
  237.     /*
  238.      * Query/set transfer state parameters.
  239.      */
  240.     u_int getType(void) const;
  241.     bool setType(u_int);
  242.     u_int getMode(void) const;
  243.     bool setMode(u_int);
  244.     u_int getStruct(void) const;
  245.     bool setStruct(u_int);
  246.     u_int getFormat(void) const;
  247.     bool setFormat(u_int);
  248.     u_int getTimeZone(void) const;
  249.     bool setTimeZone(u_int);
  250.     /*
  251.      * Send documents to the server.
  252.      */
  253.     bool storeUnique(fxStr& docname, fxStr& emsg); // STOU
  254.     bool storeTemp(fxStr& docname, fxStr& emsg); // STOT
  255.     bool storeFile(fxStr&, fxStr& emsg); // STOR
  256.     bool sendData(int fd, bool (FaxClient::*store)(fxStr&, fxStr&),
  257. fxStr& docname, fxStr& emsg);
  258.     bool sendZData(int fd, bool (FaxClient::*store)(fxStr&, fxStr&),
  259. fxStr& docname, fxStr& emsg);
  260.     /*
  261.      * Retrieve information from the server.
  262.      */
  263.     bool recvData(bool (*f)(void*, const char*, int, fxStr&),
  264.     void* arg, fxStr& emsg, u_long restart, const char* fmt, ...);
  265.     bool recvZData(bool (*f)(void*, const char*, int, fxStr&),
  266.     void* arg, fxStr& emsg, u_long restart, const char* fmt, ...);
  267.     /*
  268.      * Job scripting support.
  269.      */
  270.     bool runScript(const char* filename, fxStr& emsg);
  271.     bool runScript(FILE*, const char* filename, fxStr& emsg);
  272.     bool runScript(const char* script, u_long scriptLen,
  273.         const char* filename, fxStr& emsg);
  274.     /*
  275.      * Status query support.
  276.      */
  277.     static const FaxFmtHeader jobFormats[];
  278.     static const FaxFmtHeader recvFormats[];
  279.     static const FaxFmtHeader modemFormats[];
  280.     static const FaxFmtHeader fileFormats[];
  281.     bool setJobStatusFormat(const char*);
  282.     const fxStr& getJobStatusFormat(void);
  283.     bool setRecvStatusFormat(const char*);
  284.     const fxStr& getRecvStatusFormat(void);
  285.     bool setModemStatusFormat(const char*);
  286.     const fxStr& getModemStatusFormat(void);
  287.     bool setFileStatusFormat(const char*);
  288.     const fxStr& getFileStatusFormat(void);
  289.     void getJobStatusHeader(fxStr& header);
  290.     void getRecvStatusHeader(fxStr& header);
  291.     void getModemStatusHeader(fxStr& header);
  292.     void getFileStatusHeader(fxStr& header);
  293. };
  294. inline const fxStr& FaxClient::getSenderName(void) const{ return senderName; }
  295. inline const fxStr& FaxClient::getUserName(void) const { return userName; }
  296. inline const fxStr& FaxClient::getHost(void) const { return host; }
  297. inline const fxStr& FaxClient::getModem(void) const { return modem; }
  298. inline const fxStr& FaxClient::getProtoName() const { return proto; }
  299. inline bool FaxClient::getVerbose(void) const
  300.     { return (state&FS_VERBOSE) != 0; }
  301. inline int FaxClient::getPort(void) const { return port; }
  302. inline FILE* FaxClient::getCtrlFd(void) const { return fdOut; }
  303. inline int FaxClient::getDataFd(void) const { return fdData; }
  304. inline const fxStr& FaxClient::getLastResponse(void) const
  305.     { return lastResponse; }
  306. inline const fxStr& FaxClient::getLastContinuation(void) const
  307.     { return lastContinuation; }
  308. inline int FaxClient::getLastCode(void) const { return code; }
  309. inline bool FaxClient::isLoggedIn(void) const
  310.     { return (state&FS_LOGGEDIN) != 0; }
  311. inline bool FaxClient::isConnected(void) const { return fdIn != NULL; }
  312. inline bool FaxClient::isPassive(void) const { return pasv; }
  313. inline u_int FaxClient::getType(void) const { return type; }
  314. inline u_int FaxClient::getStruct(void) const { return stru; }
  315. inline u_int FaxClient::getMode(void) const { return mode; }
  316. inline u_int FaxClient::getFormat(void) const { return format; }
  317. inline u_int FaxClient::getTimeZone(void) const { return tzone; }
  318. inline const fxStr& FaxClient::getCurrentJob(void) const{ return curjob; }
  319. extern void fxFatal(const char* fmt, ...);
  320. #endif /* _FaxClient_ */