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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Trigger.h,v 1.3 2007/03/09 22:25:54 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 _Trigger_
  27. #define _Trigger_
  28. /*
  29.  * HylaFAX Trigger Support.
  30.  */
  31. #include "Str.h"
  32. #include "Dictionary.h"
  33. #include "QLink.h"
  34. #define TRIGGER_MAXTID 1024 // at most 1024 triggers can exist at one time
  35. #define TRIGGER_BPW 32 // we assume 8*sizeof (u_int) >= 32
  36. #define TRIGGER_MAXWDS ((TRIGGER_MAXTID+TRIGGER_BPW-1)/TRIGGER_BPW)
  37. typedef struct {
  38.     char magic; // ``!''
  39.     char reserved; // reserved for future use
  40.     u_short seqnum; // per-client message sequence number
  41.     u_short length; // message length in bytes, including header
  42.     u_short event; // event number
  43.     time_t tstamp; // time message was crafted
  44. } TriggerMsgHeader;
  45. typedef unsigned int TriggerEvent;
  46. typedef unsigned int trid_t;
  47. class HylaClient;
  48. class Job;
  49. class Modem;
  50. class fxStackBuffer;
  51. /*
  52.  * Triggers represent client interest for events
  53.  * that occur within central scheduler (or which
  54.  * are passed back from subprocesses for distribution).
  55.  *
  56.  * Events are broken into classes and interest can
  57.  * be specified for specific events or for any events
  58.  * within a class.  Similarly, interest can be constrained
  59.  * to be specific to a particlar job or modem or for
  60.  * any job or modem.
  61.  *
  62.  * Clients create triggers and receive notification
  63.  * messages through FIFO special files whenever events
  64.  * occur that match the event interests specified.
  65.  */
  66. class Trigger {
  67. public:
  68.     enum {
  69. #define JOB_BASE 0
  70. JOB_CREATE = JOB_BASE+0, // creation
  71. JOB_SUSPEND = JOB_BASE+1, // suspended
  72. JOB_READY = JOB_BASE+2, // ready to send
  73. JOB_SLEEP = JOB_BASE+3, // sleeping awaiting time-to-send
  74. JOB_DEAD = JOB_BASE+4, // marked dead
  75. JOB_PROCESS = JOB_BASE+5, // processed by scheduler
  76. JOB_REAP = JOB_BASE+6, // corpus reaped
  77. JOB_ACTIVE = JOB_BASE+7, // activated
  78. JOB_REJECT = JOB_BASE+8, // rejected
  79. JOB_KILL = JOB_BASE+9, // killed
  80. JOB_BLOCKED = JOB_BASE+10, // blocked by other job
  81. JOB_DELAYED = JOB_BASE+11, // delayed by tod restriction or similar
  82. JOB_ALTERED = JOB_BASE+12, // parameters altered
  83. JOB_TIMEDOUT = JOB_BASE+13, // kill timer expired
  84. JOB_PREP_BEGIN = JOB_BASE+14, // preparation started
  85. JOB_PREP_END = JOB_BASE+15, // preparation finished
  86. #define SEND_BASE 16
  87. SEND_BEGIN = SEND_BASE+0, // fax, send attempt started
  88. SEND_CALL = SEND_BASE+1, // fax, call placed
  89. SEND_CONNECTED = SEND_BASE+2, // fax, call answered by fax
  90. SEND_PAGE = SEND_BASE+3, // fax, page done
  91. SEND_DOC = SEND_BASE+4, // fax, document done
  92. SEND_POLLRCVD = SEND_BASE+5, // fax, document retrieved by poll op
  93. SEND_POLLDONE = SEND_BASE+6, // fax, poll op complete
  94. SEND_END = SEND_BASE+7, // fax, send attempt finished
  95. SEND_REFORMAT = SEND_BASE+8, // fax, job being reformatted
  96. SEND_REQUEUE = SEND_BASE+9, // fax, job requeued
  97. SEND_DONE = SEND_BASE+10, // fax, send job done
  98. #define RECV_BASE 32
  99. RECV_BEGIN = RECV_BASE+0, // fax, inbound call started
  100. RECV_START = RECV_BASE+1, // fax, session started
  101. RECV_PAGE = RECV_BASE+2, // fax, page done
  102. RECV_DOC = RECV_BASE+3, // fax, document done
  103. RECV_END = RECV_BASE+4, // fax, inbound call finished
  104. #define MODEM_BASE 48
  105. MODEM_ASSIGN = MODEM_BASE+0, // modem assigned to job
  106. MODEM_RELEASE = MODEM_BASE+1, // modem released by job
  107. MODEM_DOWN = MODEM_BASE+2, // modem marked down
  108. MODEM_READY = MODEM_BASE+3, // modem marked ready
  109. MODEM_BUSY = MODEM_BASE+4, // modem marked busy
  110. MODEM_WEDGED = MODEM_BASE+5, // modem considered wedged
  111. MODEM_INUSE = MODEM_BASE+6, // modem inuse for outbound work
  112. MODEM_DATA_BEGIN= MODEM_BASE+7, // inbound data call begun
  113. MODEM_DATA_END = MODEM_BASE+8, // inbound data call finished
  114. MODEM_VOICE_BEGIN= MODEM_BASE+9,// inbound voice call begun
  115. MODEM_VOICE_END = MODEM_BASE+10,// inbound voice call finished
  116. MODEM_CID = MODEM_BASE+11,// inbound caller-ID information
  117. MODEM_EXEMPT = MODEM_BASE+12 // modem marked exempt
  118.     };
  119. #define TRIGGER_MAXEVENT (MODEM_BASE+16)
  120. private:
  121.     trid_t tid; // trigger ID
  122.     u_int refs; // count of references
  123.     u_short interests[TRIGGER_MAXEVENT>>4];// bitmask of event interests
  124.     HylaClient* client; // reference to client
  125.     static Trigger* triggers[TRIGGER_MAXTID];
  126.     static QLink wildcards[TRIGGER_MAXEVENT>>4];// for wildcard matches
  127.     static u_int tidFree[TRIGGER_MAXWDS];
  128.     static u_int tidRotor;
  129.     static trid_t tidNextFree();
  130.     static u_short hookInterests[TRIGGER_MAXEVENT>>4]; // bitmask of hook interests
  131.     static fxStr hookCmd;
  132.     friend class TriggerRef; // for access to reference count
  133.     Trigger(trid_t, const fxStr& fifoName);
  134.     bool parse(const char*); // parse trigger spec
  135.     static void syntaxError(const char* spec, const char* msg);
  136.     void purgeWildRefs(); // purge all wildcard references
  137.     bool cancel();
  138.     static void post(TriggerEvent, const QLink&, const QLink&, fxStackBuffer&);
  139.     void send(const char* fmt ...);
  140.     static void hook (TriggerEvent, const char* id, const char* info);
  141. public:
  142.     ~Trigger();
  143.     static void purgeClient(HylaClient*);// purge all triggers for client
  144.     static void create(const fxStr& id, const char* spec);
  145.     static bool cancel(const char* tid);
  146.     static void post(TriggerEvent, const Job&, const char* = NULL);
  147.     static void post(TriggerEvent, const Modem&, const char* = NULL);
  148.     static bool setTriggerHook (const char* prg, const char* spec);
  149. };
  150. #endif /* _Trigger_ */