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

传真(Fax)编程

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 1987-1991 Stanford University
  3.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  4.  * HylaFAX is a trademark of Silicon Graphics
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Stanford and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Stanford and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  *
  18.  * IN NO EVENT SHALL STANFORD OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. /*
  26.  * Wait on multiple file descriptors until a condition occurs.
  27.  */
  28. #ifndef dp_dispatcher_h
  29. #define dp_dispatcher_h
  30. #ifdef HAS_SELECT_H
  31. #include <sys/select.h>
  32. #endif
  33. #include "Types.h"
  34. class IOHandler;
  35. class TimerQueue;
  36. class ChildQueue;
  37. struct timeval;
  38. class Dispatcher {
  39. public:
  40.     enum DispatcherMask {
  41. ReadMask,
  42. WriteMask,
  43. ExceptMask
  44.     };
  45.     Dispatcher();
  46.     virtual ~Dispatcher();
  47.     virtual void link(int fd, DispatcherMask, IOHandler*);
  48.     virtual IOHandler* handler(int fd, DispatcherMask) const;
  49.     virtual void unlink(int fd);
  50.     virtual void startTimer(long sec, long usec, IOHandler*);
  51.     virtual void stopTimer(IOHandler*);
  52.     virtual void startChild(pid_t pid, IOHandler*);
  53.     virtual void stopChild(IOHandler*);
  54.     virtual bool setReady(int fd, DispatcherMask);
  55.     virtual void dispatch();
  56.     virtual bool dispatch(long& sec, long& usec);
  57.     static Dispatcher& instance();
  58.     static void instance(Dispatcher*);
  59. protected:
  60.     virtual void attach(int fd, DispatcherMask, IOHandler*);
  61.     virtual void detach(int fd);
  62.     virtual bool dispatch(timeval*);
  63.     virtual bool anyReady();
  64.     virtual int fillInReady(fd_set&, fd_set&, fd_set&);
  65.     virtual int waitFor(fd_set&, fd_set&, fd_set&, timeval*);
  66.     virtual void notify(int, fd_set&, fd_set&, fd_set&);
  67.     virtual timeval* calculateTimeout(timeval*) const;
  68.     virtual bool handleError();
  69.     virtual void checkConnections();
  70. protected:
  71.     u_int _nfds;
  72.     u_int _max_fds;
  73.     fd_set _rmask;
  74.     fd_set _wmask;
  75.     fd_set _emask;
  76.     fd_set _rmaskready;
  77.     fd_set _wmaskready;
  78.     fd_set _emaskready;
  79.     IOHandler** _rtable;
  80.     IOHandler** _wtable;
  81.     IOHandler** _etable;
  82.     TimerQueue* _queue;
  83.     ChildQueue* _cqueue;
  84. private:
  85.     static Dispatcher* _instance;
  86.     static void sigCLD(int);
  87. private:
  88.     /* deny access since member-wise won't work */
  89.     Dispatcher(const Dispatcher&);
  90.     Dispatcher& operator =(const Dispatcher&);
  91. };
  92. #endif