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