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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Job.c++,v 1.11 2007/04/06 22:46:40 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. #include "faxQueueApp.h"
  27. #include "FaxRequest.h"
  28. #include "Dispatcher.h"
  29. #include "TriggerRef.h"
  30. #include "Sys.h"
  31. #include "config.h"
  32. JobKillHandler::JobKillHandler(Job& j) : job(j) {}
  33. JobKillHandler::~JobKillHandler() {}
  34. void JobKillHandler::timerExpired(long, long)
  35.     { faxQueueApp::instance().timeoutJob(job); }
  36. JobTTSHandler::JobTTSHandler(Job& j) : job(j) {}
  37. JobTTSHandler::~JobTTSHandler() {}
  38. void JobTTSHandler::timerExpired(long, long)
  39.     { faxQueueApp::instance().runJob(job); }
  40. JobPrepareHandler::JobPrepareHandler(Job& j) : job(j) {}
  41. JobPrepareHandler::~JobPrepareHandler() {}
  42. void JobPrepareHandler::childStatus(pid_t, int status)
  43.     { faxQueueApp::instance().prepareJobDone(job, status); }
  44. JobSendHandler::JobSendHandler(Job& j) : job(j) {}
  45. JobSendHandler::~JobSendHandler() {}
  46. void JobSendHandler::childStatus(pid_t, int status)
  47.     { faxQueueApp::instance().sendJobDone(job, status); }
  48. fxIMPLEMENT_StrKeyPtrValueDictionary(JobDict, Job*)
  49. JobDict Job::registry;
  50. JobControlInfo Job::defJCI;
  51. Job::Job(const FaxRequest& req)
  52.     : killHandler(*this)
  53.     , ttsHandler(*this)
  54.     , prepareHandler(*this)
  55.     , sendHandler(*this)
  56.     , file(req.qfile)
  57.     , jobid(req.jobid)
  58. {
  59.     update(req);
  60.     start = 0;
  61.     pid = 0;
  62.     state = req.state;
  63.     jci = NULL;
  64.     dnext = NULL;
  65.     modem = NULL;
  66.     bprev = NULL;
  67.     bnext = NULL;
  68.     breq = NULL;
  69.     suspendPending = false;
  70.     registry[jobid] = this;
  71.     tod.reset();
  72. }
  73. Job::~Job()
  74. {
  75.     registry.remove(jobid);
  76.     stopKillTimer();
  77.     stopTTSTimer();
  78.     if (!triggers.isEmpty()) // purge trigger references
  79. TriggerRef::purge(triggers);
  80. }
  81. /*
  82.  * Update volatile job state from the job description
  83.  * file.  This propagates client-alterable state from
  84.  * on-disk to in-memory.  Note that we do not touch the
  85.  * job state since there are cases where the scheduler
  86.  * updates the in-memory state but does not save it to
  87.  * the description file (maybe this will change?).
  88.  */
  89. void
  90. Job::update(const FaxRequest& req)
  91. {
  92.     tts = (req.tts == 0 ? Sys::now() : req.tts);
  93.     killtime = req.killtime;
  94.     pri = req.pri;
  95.     // NB: state is not overwritten
  96.     pagewidth = req.pagewidth;
  97.     pagelength = req.pagelength;
  98.     resolution = req.resolution;
  99.     willpoll = (req.findItem(FaxRequest::send_poll) != fx_invalidArrayIndex);
  100.     device = req.modem;
  101.     tod.parse(req.timeofday);
  102. }
  103. /*
  104.  * Remove a job from a batch of jobs then let parent class do it's job.
  105.  */
  106. void
  107. Job::remove(void)
  108. {
  109.     if (bnext != NULL)
  110. bnext->bprev = bprev;
  111.     if (bprev != NULL)
  112. bprev->bnext = bnext;
  113.     bnext = NULL;
  114.     bprev = NULL;
  115.     breq = NULL;
  116.     QLink::remove();
  117. }
  118. Job*
  119. Job::getJobByID(const fxStr& id)
  120. {
  121.     Job** jpp = (Job**) registry.find(id);
  122.     return (jpp ? *jpp : (Job*) NULL);
  123. }
  124. void
  125. Job::startKillTimer(long sec)
  126. {
  127.     killtime = sec;
  128.     Dispatcher::instance().startTimer(sec - Sys::now(), 0, &killHandler);
  129. }
  130. void
  131. Job::stopKillTimer()
  132. {
  133.     Dispatcher::instance().stopTimer(&killHandler);
  134. }
  135. void
  136. Job::startTTSTimer(long sec)
  137. {
  138.     tts = sec;
  139.     Dispatcher::instance().startTimer(sec - Sys::now(), 0, &ttsHandler);
  140. }
  141. void
  142. Job::stopTTSTimer()
  143. {
  144.     Dispatcher::instance().stopTimer(&ttsHandler);
  145. }
  146. void
  147. Job::startPrepare(pid_t p)
  148. {
  149.     Dispatcher::instance().startChild(pid = p, &prepareHandler);
  150. }
  151. void
  152. Job::startSend(pid_t p)
  153. {
  154.     Dispatcher::instance().startChild(pid = p, &sendHandler);
  155. }
  156. fxStr
  157. Job::jobStatusName(const JobStatus status)
  158. {
  159.     static const char* names[] = {
  160. "no_status",
  161. "done",
  162. "requeued",
  163. "removed",
  164. "timedout",
  165. "no_formatter",
  166. "failed",
  167. "format_failed",
  168. "poll_rejected",
  169. "poll_no_document",
  170. "poll_failed",
  171. "killed",
  172. "blocked",
  173. "rejected",
  174.     };
  175. #define N(a) (sizeof (a) / sizeof (a[0]))
  176.     if ((u_int) status >= N(names)) {
  177.         return fxStr::format("status_%u", (u_int) status);
  178.     } else {
  179.         return fxStr(names[status]);
  180.     }
  181. }
  182. #undef N
  183. #include "JobExt.h"
  184. #include "StackBuffer.h"
  185. void
  186. Job::encode(fxStackBuffer& buf) const
  187. {
  188.     buf.put((const char*) &tts, sizeof (JobExtFixed));
  189.     buf.put(jobid,  jobid.length()+1);
  190.     buf.put(dest,   dest.length()+1);
  191.     buf.put(device, device.length()+1);
  192.     buf.put(commid, commid.length()+1);
  193. }
  194. Job*
  195. Job::bfirst()
  196. {
  197.     Job* j = this;
  198.     for (; j->bprev != NULL; j = j->bprev);
  199.     return j;
  200. }