TcpConnection.h revision e54e5389
1e54e5389SShuo Chen// excerpts from http://code.google.com/p/muduo/ 2e54e5389SShuo Chen// 3e54e5389SShuo Chen// Use of this source code is governed by a BSD-style license 4e54e5389SShuo Chen// that can be found in the License file. 5e54e5389SShuo Chen// 6e54e5389SShuo Chen// Author: Shuo Chen (chenshuo at chenshuo dot com) 7e54e5389SShuo Chen 8e54e5389SShuo Chen#ifndef MUDUO_NET_TCPCONNECTION_H 9e54e5389SShuo Chen#define MUDUO_NET_TCPCONNECTION_H 10e54e5389SShuo Chen 11e54e5389SShuo Chen#include "Callbacks.h" 12e54e5389SShuo Chen#include "InetAddress.h" 13e54e5389SShuo Chen 14e54e5389SShuo Chen#include <boost/any.hpp> 15e54e5389SShuo Chen#include <boost/enable_shared_from_this.hpp> 16e54e5389SShuo Chen#include <boost/noncopyable.hpp> 17e54e5389SShuo Chen#include <boost/scoped_ptr.hpp> 18e54e5389SShuo Chen#include <boost/shared_ptr.hpp> 19e54e5389SShuo Chen 20e54e5389SShuo Chennamespace muduo 21e54e5389SShuo Chen{ 22e54e5389SShuo Chen 23e54e5389SShuo Chenclass Channel; 24e54e5389SShuo Chenclass EventLoop; 25e54e5389SShuo Chenclass Socket; 26e54e5389SShuo Chen 27e54e5389SShuo Chen/// 28e54e5389SShuo Chen/// TCP connection, for both client and server usage. 29e54e5389SShuo Chen/// 30e54e5389SShuo Chenclass TcpConnection : boost::noncopyable, 31e54e5389SShuo Chen public boost::enable_shared_from_this<TcpConnection> 32e54e5389SShuo Chen{ 33e54e5389SShuo Chen public: 34e54e5389SShuo Chen /// Constructs a TcpConnection with a connected sockfd 35e54e5389SShuo Chen /// 36e54e5389SShuo Chen /// User should not create this object. 37e54e5389SShuo Chen TcpConnection(EventLoop* loop, 38e54e5389SShuo Chen const std::string& name, 39e54e5389SShuo Chen int sockfd, 40e54e5389SShuo Chen const InetAddress& localAddr, 41e54e5389SShuo Chen const InetAddress& peerAddr); 42e54e5389SShuo Chen ~TcpConnection(); 43e54e5389SShuo Chen 44e54e5389SShuo Chen EventLoop* getLoop() const { return loop_; } 45e54e5389SShuo Chen const std::string& name() const { return name_; } 46e54e5389SShuo Chen const InetAddress& localAddress() { return localAddr_; } 47e54e5389SShuo Chen const InetAddress& peerAddress() { return peerAddr_; } 48e54e5389SShuo Chen bool connected() const { return state_ == kConnected; } 49e54e5389SShuo Chen 50e54e5389SShuo Chen void setConnectionCallback(const ConnectionCallback& cb) 51e54e5389SShuo Chen { connectionCallback_ = cb; } 52e54e5389SShuo Chen 53e54e5389SShuo Chen void setMessageCallback(const MessageCallback& cb) 54e54e5389SShuo Chen { messageCallback_ = cb; } 55e54e5389SShuo Chen 56e54e5389SShuo Chen /// Internal use only. 57e54e5389SShuo Chen void setCloseCallback(const CloseCallback& cb) 58e54e5389SShuo Chen { closeCallback_ = cb; } 59e54e5389SShuo Chen 60e54e5389SShuo Chen // called when TcpServer accepts a new connection 61e54e5389SShuo Chen void connectEstablished(); // should be called only once 62e54e5389SShuo Chen 63e54e5389SShuo Chen private: 64e54e5389SShuo Chen enum StateE { kDisconnected, kConnecting, kConnected, kDisconnecting }; 65e54e5389SShuo Chen 66e54e5389SShuo Chen void setState(StateE s) { state_ = s; } 67e54e5389SShuo Chen void handleRead(); 68e54e5389SShuo Chen 69e54e5389SShuo Chen EventLoop* loop_; 70e54e5389SShuo Chen std::string name_; 71e54e5389SShuo Chen StateE state_; // FIXME: use atomic variable 72e54e5389SShuo Chen // we don't expose those classes to client. 73e54e5389SShuo Chen boost::scoped_ptr<Socket> socket_; 74e54e5389SShuo Chen boost::scoped_ptr<Channel> channel_; 75e54e5389SShuo Chen InetAddress localAddr_; 76e54e5389SShuo Chen InetAddress peerAddr_; 77e54e5389SShuo Chen ConnectionCallback connectionCallback_; 78e54e5389SShuo Chen MessageCallback messageCallback_; 79e54e5389SShuo Chen CloseCallback closeCallback_; 80e54e5389SShuo Chen}; 81e54e5389SShuo Chen 82e54e5389SShuo Chentypedef boost::shared_ptr<TcpConnection> TcpConnectionPtr; 83e54e5389SShuo Chen 84e54e5389SShuo Chen} 85e54e5389SShuo Chen 86e54e5389SShuo Chen#endif // MUDUO_NET_TCPCONNECTION_H 87