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 #include <datetime/Timestamp.h> 15 16 namespace muduo 17 { 18 19 class EventLoop; 20 21 /// 22 /// A selectable I/O channel. 23 /// 24 /// This class doesn't own the file descriptor. 25 /// The file descriptor could be a socket, 26 /// an eventfd, a timerfd, or a signalfd 27 class Channel : boost::noncopyable 28 { 29 public: 30 typedef boost::function<void()> EventCallback; 31 typedef boost::function<void(Timestamp)> ReadEventCallback; 32 33 Channel(EventLoop* loop, int fd); 34 ~Channel(); 35 36 void handleEvent(Timestamp receiveTime); 37 void setReadCallback(const ReadEventCallback& cb) 38 { readCallback_ = cb; } 39 void setWriteCallback(const EventCallback& cb) 40 { writeCallback_ = cb; } 41 void setErrorCallback(const EventCallback& cb) 42 { errorCallback_ = cb; } 43 void setCloseCallback(const EventCallback& cb) 44 { closeCallback_ = cb; } 45 46 int fd() const { return fd_; } 47 int events() const { return events_; } 48 void set_revents(int revt) { revents_ = revt; } 49 bool isNoneEvent() const { return events_ == kNoneEvent; } 50 51 void enableReading() { events_ |= kReadEvent; update(); } 52! void enableWriting() { events_ |= kWriteEvent; update(); } 53! void disableWriting() { events_ &= ~kWriteEvent; update(); } 54 void disableAll() { events_ = kNoneEvent; update(); } 55+ bool isWriting() const { return events_ & kWriteEvent; } 56 57 // for Poller 58 int index() { return index_; } 59 void set_index(int idx) { index_ = idx; } 60 61 EventLoop* ownerLoop() { return loop_; } 62 63 private: 64 void update(); 65 66 static const int kNoneEvent; 67 static const int kReadEvent; 68 static const int kWriteEvent; 69 70 EventLoop* loop_; 71 const int fd_; 72 int events_; 73 int revents_; 74 int index_; // used by Poller. 75 76 bool eventHandling_; 77 78 ReadEventCallback readCallback_; 79 EventCallback writeCallback_; 80 EventCallback errorCallback_; 81 EventCallback closeCallback_; 82 }; 83 84 } 85 #endif // MUDUO_NET_CHANNEL_H 86