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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: faxQueueApp.h,v 1.13 2008/09/14 10:33:13 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 _faxQueueApp_
  27. #define _faxQueueApp_
  28. /*
  29.  * HylaFAX Queue Manager Application.
  30.  */
  31. #include "faxApp.h"
  32. #include "FaxConfig.h"
  33. #include "IOHandler.h"
  34. #include "Job.h"
  35. #include "DestInfo.h"
  36. #include "JobControl.h"
  37. #include "StrDict.h"
  38. typedef struct tiff TIFF;
  39. class Class2Params;
  40. class DialStringRules;
  41. class UUCPLock;
  42. class FaxItem;
  43. class Modem;
  44. class Trigger;
  45. /*
  46.  * This class represents a thread of control that manages the
  47.  * job queue, deals with system-related notification (sends
  48.  * complete, facsimile received, errors), and delivers external
  49.  * commands passed in through the command FIFOs.  This class is
  50.  * also responsible for preparing documents for sending by
  51.  * doing formatting tasks such as converting PostScript to TIFF.
  52.  */
  53. class faxQueueApp : public FaxConfig, public faxApp, public IOHandler {
  54. public:
  55.     struct stringtag {
  56. const char*  name;
  57. fxStr faxQueueApp::* p;
  58. const char*  def; // NULL is shorthand for ""
  59.     };
  60.     struct numbertag {
  61. const char*  name;
  62. u_int faxQueueApp::*p;
  63. u_int  def;
  64.     };
  65. private:
  66.     time_t lastCall; // time of last call
  67.     class SchedTimeout : public IOHandler {
  68.     private:
  69. bool started;
  70. bool pending;
  71. time_t lastRun; // time of last scheduler run
  72.     public:
  73. SchedTimeout();
  74. ~SchedTimeout();
  75. void timerExpired(long, long);
  76. void start(u_short s = 0);
  77.     };
  78. // configuration stuff
  79.     fxStr configFile; // configuration filename
  80.     fxStr contCoverPageTemplate; // continuation cover page template
  81.     u_int postscriptTimeout; // timeout on PostScript imager calls
  82.     u_int maxBatchJobs; // max jobs in a batch
  83.     u_int maxConcurrentCalls; // max parallel jobs to a destination
  84.     u_int maxSendPages; // max pages in a send job
  85.     u_int maxDials; // max times to dial the phone for a job
  86.     u_int maxTries; // max transmits tried for a job
  87.     TimeOfDay tod; // time of day restrictions on sends
  88.     fxStr longDistancePrefix; // prefix str for long distance dialing
  89.     fxStr internationalPrefix; // prefix str for international dialing
  90.     fxStr areaCode; // local area code
  91.     fxStr countryCode; // local country code
  92.     DialStringRules* dialRules; // dial string rules
  93.     fxStr uucpLockType; // UUCP lock file type
  94.     fxStr uucpLockDir; // UUCP lock file directory
  95.     mode_t uucpLockMode; // UUCP lock file creation mode
  96.     u_int uucpLockTimeout; // UUCP stale lock file timeout
  97.     u_int pollLockWait; // polling interval in lock wait state
  98.     u_int staggerCalls; // time to wait between initiating calls
  99.     u_int tracingLevel; // tracing level w/o session
  100.     u_int tracingMask; // tracing level control mask
  101.     fxStr logFacility; // syslog facility to direct trace msgs
  102.     u_int requeueInterval; // job requeue interval
  103.     bool use2D; // ok to use 2D-encoded data
  104.     bool useUnlimitedLN; // ok to use unlimited page length
  105.     bool allowIgnoreModemBusy; // to allow job to ignore modem busy status
  106.     u_int pageChop; // default page chop handling
  107.     float pageChopThreshold; // minimum space before page chop
  108.     fxStr notifyCmd; // external command for notification
  109.     fxStr ps2faxCmd; // external command for ps imager
  110.     fxStr pdf2faxCmd; // external command for pdf imager
  111.     fxStr pcl2faxCmd; // external command for pcl imager
  112.     fxStr tiff2faxCmd; // external command for TIFF converter
  113.     fxStr coverCmd; // external command for cont cover pages
  114.     fxStr sendFaxCmd; // external command for fax transmits
  115.     fxStr sendPageCmd; // external command for page transmits
  116.     fxStr sendUUCPCmd; // external command for UUCP calls
  117.     fxStr wedgedCmd; // external command for wedged modems
  118.     fxStr jobCtrlCmd; // external command for JobControl
  119.     static stringtag strings[];
  120.     static numbertag numbers[];
  121. // runtime state
  122.     bool timeout; // timeout occurred
  123.     bool abortPrepare; // job preparation should be aborted
  124.     bool quit; // terminate server
  125.     int fifo; // fifo job queue interface
  126. #define NQHASH 16
  127.     QLink runqs[NQHASH]; // jobs ready to run
  128.     QLink sleepq; // jobs waiting for time-to-send
  129.     QLink activeq; // jobs actively being processed
  130.     QLink deadq; // jobs waiting to be reaped
  131.     QLink suspendq; // jobs suspending from scheduling
  132.     SchedTimeout schedTimeout; // timeout for running scheduler
  133.     DestInfoDict destJobs; // jobs organized by destination
  134.     fxStrDict pendingDocs; // documents waiting for removal
  135.     bool inSchedule; // indicates processing of runScheduler
  136.     static faxQueueApp* _instance;
  137.     static const fxStr sendDir; // sendq directory name
  138.     static const fxStr docDir; // docq directory name
  139.     static const fxStr clientDir; // client directory name
  140.     friend class JobTTSHandler; // for access to runJob
  141.     friend class JobKillHandler; // for acccess to timeoutJob
  142.     friend class JobPrepareHandler; // for acccess to prepareJobDone
  143.     friend class JobSendHandler; // for acccess to sendJobDone
  144.     friend class JobCtrlHandler; // for acccess to ctrlJobDone
  145.     friend class faxQueueApp::SchedTimeout;// for access to runScheduler
  146.     friend class ModemLockWaitHandler; // for access to pollForModemLock
  147. // configuration support
  148.     void setupConfig();
  149.     void resetConfig();
  150.     bool setConfigItem(const char* tag, const char* value);
  151.     void configError(const char* fmt, ...);
  152.     void configTrace(const char* fmt, ...);
  153.     void setDialRules(const char* name);
  154.     fxStr canonicalizePhoneNumber(const fxStr& ds);
  155. // modem support
  156.     void scanForModems();
  157.     bool assignModem(Job& job, bool ignorebusy);
  158.     void releaseModem(Job& job);
  159.     void notifyModemWedged(Modem&);
  160.     void pollForModemLock(Modem& modem);
  161. // diagnostic and tracing interfaces
  162.     void traceServer(const char* fmt ...);
  163.     void vtraceServer(const char* fmt, va_list ap);
  164.     void jobError(const Job& job, const char* fmt ...);
  165.     void traceQueue(const Job&, const char* fmt ...);
  166.     void traceJob(const Job&, const char* fmt ...);
  167.     void traceQueue(const char* fmt ...);
  168.     void traceModem(const Modem&, const char* fmt ...);
  169. // miscellaneous stuff
  170.     void startTimeout(long ms);
  171.     void stopTimeout(const char* whichdir);
  172.     const fxStr& pickCmd(const FaxRequest& req);
  173.     void blockSignals();
  174.     void releaseSignals();
  175. // FIFO-related stuff
  176.     void childStatus(pid_t, int); // Dispatcher hook
  177.     int inputReady(int); // Dispatcher hook
  178.     void openFIFOs();
  179.     void closeFIFOs();
  180.     void FIFOMessage(const char*);
  181.     void FIFOMessage(char cmd, const fxStr& id, const char* args);
  182.     void FIFOModemMessage(const fxStr& devid, const char* msg);
  183.     void FIFOJobMessage(const fxStr& jobid, const char* msg);
  184.     void FIFORecvMessage(const fxStr& devid, const char* msg);
  185.     void scanClientDirectory();
  186. // qfile request stuff
  187.     void scanQueueDirectory();
  188.     FaxRequest* readRequest(Job&);
  189.     void updateRequest(FaxRequest& req, Job& job);
  190.     void deleteRequest(Job&, FaxRequest* req, JobStatus why,
  191.     bool force, const char* duration = "");
  192.     void deleteRequest(Job&, FaxRequest& req, JobStatus why,
  193.     bool force, const char* duration = "");
  194.     void notifySender(Job&, JobStatus, const char* = "");
  195. // job management interfaces
  196.     void processJob(Job& job);
  197.     void processJob(Job&, FaxRequest* req, DestInfo& di);
  198.     void sendJobStart(Job&, FaxRequest*);
  199.     void sendJobDone(Job& job, int status);
  200.     void sendJobDone(Job& job, FaxRequest* req);
  201.     void blockJob(Job&, FaxRequest&, const char*);
  202.     void delayJob(Job&, FaxRequest&, const char*, time_t);
  203.     void rejectJob(Job& job, FaxRequest& req, const fxStr& reason);
  204.     bool submitJob(const fxStr& jobid, bool checkState = false, bool nascent = false);
  205.     bool suspendJob(const fxStr& jobid, bool abortActive);
  206.     void rejectSubmission(Job&, FaxRequest&, const fxStr& reason);
  207.     bool areBatchable(FaxRequest& reqa, FaxRequest& reqb, Job& job, Job& cjob);
  208.     void setReadyToRun(Job& job, bool wait);
  209.     void setSleep(Job& job, time_t tts);
  210.     void setDead(Job& job);
  211.     void setActive(Job& job);
  212.     void setSuspend(Job& job);
  213.     bool submitJob(FaxRequest&, bool checkState = false);
  214.     bool submitJob(Job& job, FaxRequest& req, bool checkState = false);
  215.     bool suspendJob(Job& job, bool abortActive);
  216.     bool terminateJob(const fxStr& filename, JobStatus why);
  217.     void queueAccounting(Job& job, FaxRequest&, const char* type);
  218.     void timeoutJob(Job& job);
  219.     void timeoutJob(Job& job, FaxRequest&);
  220.     void runJob(Job& job);
  221.     void removeDestInfoJob(Job& job);
  222.     void        unblockDestJobs(DestInfo& di);
  223.     bool scheduling();
  224.     void runScheduler();
  225.     void pokeScheduler(u_short s = 0);
  226. // job control stuff
  227.     void ctrlJobDone(Job& job, int status);
  228. // job preparation stuff
  229.     bool prepareJobNeeded(Job&, FaxRequest&, JobStatus&);
  230.     static void prepareCleanup(int s);
  231.     bool prepareJobStart(Job&, FaxRequest*,
  232.     FaxMachineInfo&);
  233.     void prepareJobDone(Job&, int status);
  234.     JobStatus prepareJob(Job& job, FaxRequest& req,
  235.     const FaxMachineInfo&);
  236.     JobStatus convertDocument(Job&,
  237.     const FaxItem& input, const fxStr& outFile,
  238.     const Class2Params& params,
  239.     fxStr& emsg);
  240.     JobStatus runConverter(Job& job, const char* app, char* const* argv,
  241.     fxStr& emsg);
  242.     bool runConverter1(Job& job, int fd, fxStr& output);
  243.     bool makeCoverPage(Job&, FaxRequest&, const Class2Params&);
  244.     bool preparePageHandling(Job&, FaxRequest&,
  245.     const FaxMachineInfo&, fxStr& emsg);
  246.     void preparePageChop(const FaxRequest&,
  247.     TIFF*, const Class2Params&, fxStr&);
  248.     void setupParams(TIFF*, Class2Params&, const FaxMachineInfo&);
  249. // document reference counting support
  250.     void unrefDoc(const fxStr& file);
  251. public:
  252.     faxQueueApp();
  253.     ~faxQueueApp();
  254.     static faxQueueApp& instance();
  255.     void initialize(int argc, char** argv);
  256.     void open();
  257.     void showDebugState();
  258.     // NB: public for use by Modem class
  259.     UUCPLock* getUUCPLock(const fxStr& deviceName);
  260.     // used by JobControlInfo for default values
  261.     u_int getTracingLevel() const;
  262.     u_int getMaxConcurrentCalls() const;
  263.     u_int getMaxSendPages() const;
  264.     u_int getMaxDials() const;
  265.     u_int getMaxTries() const;
  266.     time_t nextTimeToSend(time_t) const;
  267. };
  268. #endif