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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Job.h,v 1.5 2007/04/06 22:46:40 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1994-1996 Sam Leffler
  4.  * Copyright (c) 1994-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 _Job_
  27. #define _Job_
  28. /*
  29.  * Queue Manager Job.
  30.  */
  31. #include "IOHandler.h"
  32. #include "Dictionary.h"
  33. #include "QLink.h"
  34. #include "JobControl.h"
  35. #include "Str.h"
  36. typedef unsigned int JobStatus;
  37. class Modem;
  38. class Job;
  39. class FaxRequest;
  40. class fxStackBuffer;
  41. /*
  42.  * NB: These should be private nested classes but various
  43.  *     C++ compilers cannot grok it.
  44.  */
  45. class JobKillHandler : public IOHandler {
  46. private:
  47.     Job& job;
  48. public:
  49.     JobKillHandler(Job&);
  50.     ~JobKillHandler();
  51.     void timerExpired(long, long);
  52. };
  53. class JobTTSHandler : public IOHandler {
  54. private:
  55.     Job& job;
  56. public:
  57.     JobTTSHandler(Job&);
  58.     ~JobTTSHandler();
  59.     void timerExpired(long, long);
  60. };
  61. class JobPrepareHandler : public IOHandler {
  62. private:
  63.     Job& job;
  64. public:
  65.     JobPrepareHandler(Job&);
  66.     ~JobPrepareHandler();
  67.     void childStatus(pid_t, int);
  68. };
  69. class JobSendHandler : public IOHandler {
  70. private:
  71.     Job& job;
  72. public:
  73.     JobSendHandler(Job&);
  74.     ~JobSendHandler();
  75.     void childStatus(pid_t, int);
  76. };
  77. fxDECLARE_StrKeyDictionary(JobDict, Job*)
  78. /*
  79.  * Jobs represent outbound requests in the queue.
  80.  */
  81. class Job : public QLink {
  82. private:
  83.     JobKillHandler killHandler; // Dispatcher handler for kill timeout
  84.     JobTTSHandler ttsHandler; // Dispatcher handler for tts timeout
  85.     JobPrepareHandler prepareHandler; // Dispatcher handler for job prep work
  86.     JobSendHandler sendHandler; // Dispatcher handler for job send work
  87.     static JobDict registry;
  88.     static JobControlInfo defJCI;
  89. public:
  90.     enum {
  91. no_status = 0,
  92. done = 1, // job completed successfully
  93. requeued = 2, // job requeued after attempt
  94. removed = 3, // job removed by user command
  95. timedout = 4, // job kill time expired
  96. no_formatter = 5, // PostScript formatter not found
  97. failed = 6, // job completed w/o success
  98. format_failed = 7, // PostScript formatting failed
  99. poll_rejected = 8, // poll rejected by destination
  100. poll_no_document= 9, // poll found no documents
  101. poll_failed = 10, // poll failed for unknown reason
  102. killed = 11, // job killed by user command
  103. blocked = 12, // job waiting for resource or event
  104. rejected = 13 // job rejected before send attempted
  105.     };
  106.     // NB: members are aligned for quick encode/decode
  107.     time_t tts; // time to send job
  108.     time_t killtime; // time to kill job
  109.     time_t start; // time job passed to modem
  110.     int pri; // priority
  111.     pid_t pid; // pid of current subprocess
  112.     u_short state; // scheduling state
  113.     u_short pagewidth; // desired output page width (mm)
  114.     u_short pagelength; // desired output page length (mm)
  115.     u_short resolution; // desired vertical resolution (lpi) (normal/fine)
  116.     bool willpoll; // job has polling request
  117.     bool suspendPending; // suspend state change pending for job
  118.     fxStr file; // queue file name
  119.     fxStr jobid; // job identifier
  120.     fxStr dest; // canonical destination identity
  121.     fxStr device; // modem to be used
  122.     fxStr commid; // commid of last call
  123.     Job* dnext; // linked list by destination
  124.     Modem* modem; // modem/server currently assigned to job
  125.     QLink triggers; // waiting specifically on this job
  126.     TimeOfDay tod; // time of day restrictions
  127.     Job* bprev; // prev in batch
  128.     Job* bnext; // next in batch
  129.     FaxRequest* breq; // pointer to request used by batching support
  130.     JobControlInfo* jci; // Job control information
  131.     Job(const FaxRequest&);
  132.     void update(const FaxRequest& req);
  133.     ~Job();
  134.     void remove(void);
  135.     static Job* getJobByID(const fxStr& jobid);
  136.     static fxStr jobStatusName(const JobStatus);
  137.     void startKillTimer(long sec);
  138.     void stopKillTimer();
  139.     void startTTSTimer(long sec);
  140.     void stopTTSTimer();
  141.     void startControl(pid_t pid, int fd);
  142.     void startPrepare(pid_t pid);
  143.     void startSend(pid_t pid);
  144.     void encode(fxStackBuffer&) const; // encode in JobExt format
  145.     Job* bfirst(); // first job in batch
  146.     const JobControlInfo& getJCI (void) const;
  147. };
  148. inline const JobControlInfo& Job::getJCI (void) const
  149. {
  150.     return (jci ? *jci : defJCI);
  151. }
  152. /*
  153.  * Job iterator class for iterating over lists.
  154.  */
  155. class JobIter {
  156. private:
  157.     const QLink* head;
  158.     QLink* ql;
  159.     QLink* next;
  160. public:
  161.     JobIter(QLink& q) { head = &q; ql = q.next, next = ql->next; }
  162.     ~JobIter() {}
  163.     void operator=(QLink& q) { head = &q; ql = q.next; next = ql->next; }
  164.     void operator++() { ql = next, next = ql->next; }
  165.     void operator++(int) { ql = next, next = ql->next; }
  166.     operator Job&() const { return *(Job*)ql; }
  167.     operator Job*() const { return (Job*) ql; }
  168.     Job& job() const { return *(Job*)ql; }
  169.     bool notDone() { return ql != head; }
  170. };
  171. #endif /* _Job_ */