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