libiqxmlrpc  0.12.4
 All Classes Namespaces Files Functions Typedefs Enumerations
reactor.h
1 // Libiqxmlrpc - an object-oriented XML-RPC solution.
2 // Copyright (C) 2011 Anton Dedov
3 
4 #ifndef _libiqnet_reactor_h_
5 #define _libiqnet_reactor_h_
6 
7 #include "lock.h"
8 #include "net_except.h"
9 #include "socket.h"
10 
11 #include <list>
12 
13 namespace iqnet
14 {
15 
17 class LIBIQXMLRPC_API Event_handler {
18 public:
19  virtual ~Event_handler() {}
20 
22  virtual bool is_stopper() const { return false; }
23 
24  virtual void handle_input( bool& /* terminate */) {}
25  virtual void handle_output( bool& /* terminate */) {}
26 
29  virtual void finish() {};
30 
32  virtual bool catch_in_reactor() const { return false; }
34  virtual void log_exception( const std::exception& ) {};
36  virtual void log_unknown_exception() {};
37 
38  virtual Socket::Handler get_handler() const = 0;
39 };
40 
44 class LIBIQXMLRPC_API Reactor_base {
45 public:
47  public:
48  No_handlers():
49  network_error( "iqnet::Reactor: no handlers given.", false ) {}
50  };
51 
52  enum Event_mask { INPUT=1, OUTPUT=2 };
53 
54  struct HandlerState {
55  Socket::Handler fd;
56  short mask;
57  short revents;
58 
59  HandlerState( Socket::Handler fd_ = 0 ):
60  fd(fd_), mask(0), revents(0) {}
61 
62  HandlerState( Socket::Handler fd_, Event_mask m ):
63  fd(fd_), mask(m), revents(0) {}
64 
65  bool operator ==(const HandlerState& hs)
66  {
67  return fd == hs.fd;
68  }
69  };
70 
71  typedef std::list<HandlerState> HandlerStateList;
72  typedef int Timeout;
73 
74  virtual ~Reactor_base() {};
75 
76  virtual void register_handler( Event_handler*, Event_mask ) = 0;
77  virtual void unregister_handler( Event_handler*, Event_mask ) = 0;
78  virtual void unregister_handler( Event_handler* ) = 0;
79  virtual void fake_event( Event_handler*, Event_mask ) = 0;
80 
82 
83  virtual bool handle_events( Timeout ms = -1 ) = 0;
84 };
85 
86 } // namespace iqnet
87 
88 #endif