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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: DestInfo.c++,v 1.2 2007/05/04 22:34:36 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 "DestInfo.h"
  27. #include "Job.h"
  28. #include "Str.h"
  29. DestInfo::DestInfo()
  30. {
  31.     activeCount = 0;
  32.     callCount = 0;
  33.     blockedCount = 0;
  34.     running = NULL;
  35. }
  36. DestInfo::DestInfo(const DestInfo& other)
  37.     : QLink(other)
  38.     , info(other.info)
  39. {
  40.     activeCount = other.activeCount;
  41.     callCount = other.callCount;
  42.     blockedCount = other.blockedCount;
  43.     running = other.running;
  44. }
  45. DestInfo::~DestInfo() 
  46. {
  47.     if (isOnList())
  48. remove();
  49. }
  50. FaxMachineInfo&
  51. DestInfo::getInfo(const fxStr& number)
  52. {
  53.     info.updateConfig(number); // update as necessary
  54.     return info;
  55. }
  56. void
  57. DestInfo::updateConfig()
  58. {
  59.     info.writeConfig(); // update as necessary
  60. }
  61. bool
  62. DestInfo::isActive(Job& job) const
  63. {
  64.     if (running == NULL)
  65. return (false);
  66.     else if (running == &job)
  67. return (true);
  68.     else {
  69. for (Job* jp = running->dnext; jp != NULL; jp = jp->dnext)
  70.     if (jp == &job)
  71. return (true);
  72. return (false);
  73.     }
  74. }
  75. /*
  76.  * Not all equipment out there supports our batching protocol using
  77.  * EOM.  So SupportsBatching in the info file is flagged if we have
  78.  * encountered specific batching trouble in the past.
  79.  */
  80. bool
  81. DestInfo::supportsBatching()
  82. {
  83.     return info.getSupportsBatching();
  84. }
  85. void
  86. DestInfo::active(Job& job)
  87. {
  88.     if (running == NULL) { // list empty
  89. running = &job;
  90. job.dnext = NULL;
  91. activeCount++;
  92.     } else if (running == &job) { // job on list already
  93. return;
  94.     } else { // general case
  95. Job* jp;
  96. Job** jpp;
  97. for (jpp = &running->dnext; (jp = *jpp) != NULL; jpp = &jp->dnext)
  98.     if (jp == &job)
  99. return;
  100. *jpp = &job;
  101. job.dnext = NULL;
  102. activeCount++;
  103.     }
  104. }
  105. void
  106. DestInfo::done(Job& job)
  107. {
  108.     if (running == &job) { // job at head of list
  109. running = job.dnext;
  110. job.dnext = NULL;
  111. activeCount--;
  112.     } else if (running == NULL) { // list empty
  113. return;
  114.     } else { // general case
  115. Job* jp;
  116. for (Job** jpp = &running->dnext; (jp = *jpp) != NULL; jpp = &jp->dnext)
  117.     if (jp == &job) {
  118. *jpp = job.dnext;
  119. job.dnext = NULL;
  120. activeCount--;
  121. break;
  122.     }
  123.     }
  124. }
  125. void
  126. DestInfo::block(Job& job)
  127. {
  128.     /*
  129.      * Insert job in blocked queue maintaining
  130.      * priority order so that when the job is
  131.      * removed and placed back on the ready-to-run
  132.      * queue the priority ordering will be preserved.
  133.      */
  134.     JobIter iter(*this);
  135.     while (iter.notDone() && iter.job().pri <= job.pri)
  136. iter++;
  137.     job.insert(iter.job());
  138.     blockedCount++;
  139. }
  140. Job*
  141. DestInfo::nextBlocked()
  142. {
  143.     if (next != this) {
  144. Job* job = (Job*) next;
  145. job->remove();
  146. blockedCount--;
  147. return (job);
  148.     } else
  149. return (NULL);
  150. }
  151. void
  152. DestInfo::unblock(const Job& job)
  153. {
  154.     // XXX this is for gcc which is too stupid to do it automatically
  155.     if (next != & *(const QLink*) &job) {
  156. for (JobIter iter(*this); iter.notDone(); iter++)
  157.     if (&iter.job() == &job) {
  158. blockedCount--;
  159. break;
  160.     }
  161.     } else
  162. blockedCount--;
  163. }
  164. fxIMPLEMENT_StrKeyObjValueDictionary(DestInfoDict, DestInfo)