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