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