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_TCPCONNECTION_H 9 #define MUDUO_NET_TCPCONNECTION_H 10 11 #include "Callbacks.h" 12 #include "InetAddress.h" 13 14 #include <boost/any.hpp> 15 #include <boost/enable_shared_from_this.hpp> 16 #include <boost/noncopyable.hpp> 17 #include <boost/scoped_ptr.hpp> 18 #include <boost/shared_ptr.hpp> 19 20 namespace muduo 21 { 22 23 class Channel; 24 class EventLoop; 25 class Socket; 26 27 /// 28 /// TCP connection, for both client and server usage. 29 /// 30 class TcpConnection : boost::noncopyable, 31 public boost::enable_shared_from_this<TcpConnection> 32 { 33 public: 34 /// Constructs a TcpConnection with a connected sockfd 35 /// 36 /// User should not create this object. 37 TcpConnection(EventLoop* loop, 38 const std::string& name, 39 int sockfd, 40 const InetAddress& localAddr, 41 const InetAddress& peerAddr); 42 ~TcpConnection(); 43 44 EventLoop* getLoop() const { return loop_; } 45 const std::string& name() const { return name_; } 46 const InetAddress& localAddress() { return localAddr_; } 47 const InetAddress& peerAddress() { return peerAddr_; } 48 bool connected() const { return state_ == kConnected; } 49 50 void setConnectionCallback(const ConnectionCallback& cb) 51 { connectionCallback_ = cb; } 52 53 void setMessageCallback(const MessageCallback& cb) 54 { messageCallback_ = cb; } 55 56 /// Internal use only. 57+ void setCloseCallback(const CloseCallback& cb) 58+ { closeCallback_ = cb; } 59 60 // called when TcpServer accepts a new connection 61 void connectEstablished(); // should be called only once 62+ // called when TcpServer has removed me from its map 63+ void connectDestroyed(); // should be called only once 64 65 private: 66! enum StateE { kConnecting, kConnected, kDisconnected, }; 67 68 void setState(StateE s) { state_ = s; } 69 void handleRead(); 70+ void handleWrite(); 71+ void handleClose(); 72+ void handleError(); 73 74 EventLoop* loop_; 75 std::string name_; 76 StateE state_; // FIXME: use atomic variable 77 // we don't expose those classes to client. 78 boost::scoped_ptr<Socket> socket_; 79 boost::scoped_ptr<Channel> channel_; 80 InetAddress localAddr_; 81 InetAddress peerAddr_; 82 ConnectionCallback connectionCallback_; 83 MessageCallback messageCallback_; 84+ CloseCallback closeCallback_; 85 }; 86 87 typedef boost::shared_ptr<TcpConnection> TcpConnectionPtr; 88 89 } 90 91 #endif // MUDUO_NET_TCPCONNECTION_H 92