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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: SNPPClient.h,v 1.6 2008/03/12 05:43:09 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1995-1996 Sam Leffler
  4.  * Copyright (c) 1995-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 _SNPPClient_
  27. #define _SNPPClient_
  28. #include "Types.h"
  29. #include "Str.h"
  30. #include "FaxConfig.h"
  31. #include "SNPPJob.h"
  32. class SNPPClient : public FaxConfig {
  33. public:
  34.     enum { // command reply codes
  35. COMPLETE  = 2, // positive completion
  36. CONTINUE  = 3, // positive intermediate
  37. FATAL   = 4, // negative completion, connection terminated
  38. ERROR   = 5, // negative completion, but continue session
  39. ERROR2WAY = 7, // unsuccessfuly 2-way op, continue session
  40. COMPLETE2WAY = 8, // positive 2-way op, continue
  41. QUEUED   = 9 // successful queued 2-way op, continue
  42.     };
  43.     // NB: the S_ prefixes workaround a bug in the AIX xlC compiler
  44.     struct S_stringtag {
  45. const char*  name;
  46. fxStr SNPPClient::* p;
  47. const char*  def; // NULL is shorthand for ""
  48.     };
  49.     struct S_numbertag {
  50. const char*  name;
  51. u_int SNPPClient::*p;
  52. u_int  def;
  53.     };
  54. private:
  55.     SNPPJobArray* jobs; // job state information
  56.     SNPPJob jproto; // prototypical job
  57.     fxStr host; // server's host
  58.     fxStr modem; // server's modem
  59.     u_int state; // state flags
  60. #define SS_VERBOSE 0x0001 // print data as sent or received
  61. #define SS_LOGGEDIN 0x0002 // logged in on server
  62. #define SS_HASSITE 0x0004 // supports non-standard SITE command
  63.     fxStr userName; // sender's account name
  64.     fxStr senderName; // sender's full name (if available)
  65.     fxStr from; // from identity
  66.     FILE* fdIn; // control stream input handle
  67.     FILE* fdOut; // control stream output handle
  68.     char buf[1024]; // input buffer
  69.     int code; // code from last server repsonse
  70.     bool pasv; // whether or not to use passive mode
  71.     fxStr proto; // protocol to use for service query
  72.     fxStr lastResponse; // text message from last server response
  73.     u_int port; // server port to connect to
  74.     fxStr msgFile; // filename of message text
  75.     fxStr* msg; // 1-line message text string
  76.     static S_stringtag strings[];
  77.     static S_numbertag numbers[];
  78.     void init(void);
  79.     bool callInetServer(fxStr& emsg);
  80. protected:
  81.     SNPPClient();
  82.     SNPPClient(const fxStr& hostarg);
  83.     SNPPClient(const char* hostarg);
  84.     /*
  85.      * Derived classes can override these methods to
  86.      * provide more suitable feedback than the default
  87.      * ``print to the terminal'' work done by SNPPClient.
  88.      */
  89.     virtual void vprintError(const char* fmt, va_list ap);
  90.     virtual void vprintWarning(const char* fmt, va_list ap);
  91.     virtual void vtraceServer(const char* fmt, va_list ap);
  92.     /*
  93.      * Derived classes can override this method to capture
  94.      * job identifiers returned by the server when a job is
  95.      * submitted.  The default action is to print a message
  96.      * to the terminal identifying the jobid of the newly
  97.      * submitted job.
  98.      */
  99.     virtual void notifyNewJob(const SNPPJob& job);
  100.     void initServerState(void);
  101.     bool extract(u_int& pos, const char* pattern, fxStr& result);
  102.     virtual bool setupUserIdentity(fxStr& emsg);
  103.     void setupHostModem(const char*);
  104.     void setupHostModem(const fxStr&);
  105.     /*
  106.      * Miscellaneous stuff used by setupSenderIdentity.
  107.      */
  108.     void setBlankMailboxes(const fxStr&);
  109.     bool getNonBlankMailbox(fxStr&);
  110.     /*
  111.      * Configuration file support; derived classes may override
  112.      * these to implement application-specific config controls.
  113.      */
  114.     virtual void resetConfig(void);
  115.     virtual void setupConfig(void);
  116.     virtual bool setConfigItem(const char* tag, const char* value);
  117.     virtual void configError(const char* fmt ...);
  118.     virtual void configTrace(const char* fmt ...);
  119.     bool sendRawData(void* buf, int cc, fxStr& emsg);
  120.     void unexpectedResponse(fxStr& emsg);
  121.     void protocolBotch(fxStr& emsg, const char* fmt ...);
  122.     virtual void lostServer(void);
  123. public:
  124.     virtual ~SNPPClient();
  125. // prepare jobs for submission
  126.     virtual bool prepareForJobSubmissions(fxStr& emsg);
  127.     virtual bool submitJobs(fxStr& emsg); // submit documents & jobs
  128.     /*
  129.      * Sender identity controls.  There are two separate
  130.      * identities maintained, one for the actual user/account
  131.      * that submits the jobs and another for person identified
  132.      * as the sender on the outbound facsimile.  This distinction
  133.      * is used by proxy services such as email to pager gateways
  134.      * and for folks that submit jobs for other people.
  135.      */
  136.     bool setupSenderIdentity(fxStr& emsg); // identity associated with job
  137.     const fxStr& getSenderName() const;
  138.     void setFromIdentity(const char*); // identity associated with page
  139.     const fxStr& getFromIdentity() const;
  140.     // bookkeeping
  141.     void setHost(const fxStr&);
  142.     void setHost(const char*);
  143.     void setPort(int);
  144.     void setProtoName(const char*);
  145.     const fxStr& getHost() const;
  146.     void setModem(const fxStr&);
  147.     void setModem(const char*);
  148.     const fxStr& getModem(void) const;
  149.     virtual bool callServer(fxStr& emsg);
  150.     virtual bool hangupServer(void);
  151.     bool isConnected(void) const;
  152.     bool login(const char* user, const char* pass, fxStr& emsg);
  153.     virtual const char* getPasswd(const char* prompt);
  154.     bool isLoggedIn(void) const;
  155.     void setCtrlFds(int in, int out);
  156.     FILE* getCtrlFd(void) const;
  157.     void setVerbose(bool);
  158.     bool getVerbose(void) const;
  159.     bool hasSiteCmd(void) const; // server has SITE cmd support
  160.     int getPort(void) const;
  161.     const fxStr& getProtoName(void) const;
  162.     const fxStr& getUserName(void) const;
  163.     // output
  164.     int command(const char* fmt ...);
  165.     int vcommand(const char* fmt, va_list ap1, va_list ap2);
  166.     int getReply(bool expectEOF);
  167.     const fxStr& getLastResponse(void) const;
  168.     int getLastCode(void) const;
  169.     void setPagerMsg(const char*);
  170.     const fxStr* getPagerMsg() const;
  171.     void setPagerMsgFile(const char*);
  172.     const fxStr& getPagerMsgFile() const;
  173.     /*
  174.      * Job manipulation interfaces.
  175.      */
  176.     SNPPJob& addJob(void);
  177.     SNPPJob* findJob(const fxStr& pin);
  178.     void removeJob(const SNPPJob&);
  179.     u_int getNumberOfJobs() const;
  180.     SNPPJob& getProtoJob();
  181.     bool setHoldTime(u_int t);
  182.     bool setRetryTime(u_int t);
  183.     bool siteParm(const char* name, const fxStr& v);
  184.     bool siteParm(const char* name, u_int v);
  185.     bool newPage(const fxStr& pin, const fxStr& passwd,
  186. fxStr& jobid, fxStr& emsg);
  187.     bool sendData(int fd, fxStr& emsg);
  188.     bool sendData(const fxStr& filename, fxStr& emsg);
  189.     bool sendMsg(const char* msg, fxStr& emsg);
  190.     void printError(const char* fmt ...);
  191.     void printWarning(const char* fmt ...);
  192.     void traceServer(const char* fmt ...);
  193. };
  194. inline const fxStr& SNPPClient::getSenderName(void) const{ return senderName; }
  195. inline const fxStr& SNPPClient::getFromIdentity(void) const { return from; }
  196. inline const fxStr& SNPPClient::getUserName(void) const { return userName; }
  197. inline const fxStr& SNPPClient::getHost(void) const { return host; }
  198. inline const fxStr& SNPPClient::getModem(void) const { return modem; }
  199. inline const fxStr& SNPPClient::getProtoName() const { return proto; }
  200. inline bool SNPPClient::getVerbose(void) const
  201.     { return (state&SS_VERBOSE) != 0; }
  202. inline int SNPPClient::getPort(void) const { return port; }
  203. inline FILE* SNPPClient::getCtrlFd(void) const { return fdOut; }
  204. inline const fxStr& SNPPClient::getLastResponse(void) const
  205.     { return lastResponse; }
  206. inline int SNPPClient::getLastCode(void) const { return code; }
  207. inline bool SNPPClient::isLoggedIn(void) const
  208.     { return (state&SS_LOGGEDIN) != 0; }
  209. inline bool SNPPClient::isConnected(void) const { return fdIn != NULL; }
  210. inline bool SNPPClient::hasSiteCmd(void) const
  211.     { return (state&SS_HASSITE) != 0 ; }
  212. inline SNPPJob& SNPPClient::getProtoJob() { return jproto; }
  213. inline const fxStr* SNPPClient::getPagerMsg() const { return msg; }
  214. inline const fxStr& SNPPClient::getPagerMsgFile() const { return msgFile; }
  215. extern void fxFatal(const char* fmt, ...);
  216. #endif /* _SNPPClient_ */