1 // excerpts from http://code.google.com/p/muduo/
2 //
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the License file.
5 //
6 // Author: Shuo Chen (chenshuo at chenshuo dot com)
7 
8 #ifndef MUDUO_NET_CHANNEL_H
9 #define MUDUO_NET_CHANNEL_H
10 
11 #include <boost/function.hpp>
12 #include <boost/noncopyable.hpp>
13 
14 namespace muduo
15 {
16 
17 class EventLoop;
18 
19 ///
20 /// A selectable I/O channel.
21 ///
22 /// This class doesn't own the file descriptor.
23 /// The file descriptor could be a socket,
24 /// an eventfd, a timerfd, or a signalfd
25 class Channel : boost::noncopyable
26 {
27  public:
28   typedef boost::function<void()> EventCallback;
29 
30   Channel(EventLoop* loop, int fd);
31+  ~Channel();
32 
33   void handleEvent();
34   void setReadCallback(const EventCallback& cb)
35   { readCallback_ = cb; }
36   void setWriteCallback(const EventCallback& cb)
37   { writeCallback_ = cb; }
38   void setErrorCallback(const EventCallback& cb)
39   { errorCallback_ = cb; }
40+  void setCloseCallback(const EventCallback& cb)
41+  { closeCallback_ = cb; }
42 
43   int fd() const { return fd_; }
44   int events() const { return events_; }
45   void set_revents(int revt) { revents_ = revt; }
46   bool isNoneEvent() const { return events_ == kNoneEvent; }
47 
48   void enableReading() { events_ |= kReadEvent; update(); }
49   // void enableWriting() { events_ |= kWriteEvent; update(); }
50   // void disableWriting() { events_ &= ~kWriteEvent; update(); }
51!  void disableAll() { events_ = kNoneEvent; update(); }
52 
53   // for Poller
54   int index() { return index_; }
55   void set_index(int idx) { index_ = idx; }
56 
57   EventLoop* ownerLoop() { return loop_; }
58 
59  private:
60   void update();
61 
62   static const int kNoneEvent;
63   static const int kReadEvent;
64   static const int kWriteEvent;
65 
66   EventLoop* loop_;
67   const int  fd_;
68   int        events_;
69   int        revents_;
70   int        index_; // used by Poller.
71 
72+  bool eventHandling_;
73+
74   EventCallback readCallback_;
75   EventCallback writeCallback_;
76   EventCallback errorCallback_;
77+  EventCallback closeCallback_;
78 };
79 
80 }
81 #endif  // MUDUO_NET_CHANNEL_H
82