10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004--2005, Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_P2P_BASE_TCPPORT_H_
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_P2P_BASE_TCPPORT_H_
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <list>
32cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <string>
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/port.h"
34cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/asyncpacketsocket.h"
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TCPConnection;
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Communicates using a local TCP port.
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This class is designed to allow subclasses to take advantage of the
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// connection management provided by this class.  A subclass should take of all
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// packet sending and preparation, but when a packet is received, it should
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// call this TCPPort::OnReadPacket (3 arg) to dispatch to a connection.
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TCPPort : public Port {
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
482a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  static TCPPort* Create(rtc::Thread* thread,
492a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                         rtc::PacketSocketFactory* factory,
502a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                         rtc::Network* network,
512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                         const rtc::IPAddress& ip,
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         int min_port, int max_port,
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         const std::string& username,
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         const std::string& password,
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         bool allow_listen) {
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TCPPort* port = new TCPPort(thread, factory, network,
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                ip, min_port, max_port,
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                username, password, allow_listen);
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!port->Init()) {
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      delete port;
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      port = NULL;
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return port;
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~TCPPort();
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual Connection* CreateConnection(const Candidate& address,
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                       CandidateOrigin origin);
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void PrepareAddress();
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  virtual int GetOption(rtc::Socket::Option opt, int* value);
732a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  virtual int SetOption(rtc::Socket::Option opt, int value);
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int GetError();
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
772a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  TCPPort(rtc::Thread* thread, rtc::PacketSocketFactory* factory,
782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          rtc::Network* network, const rtc::IPAddress& ip,
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          int min_port, int max_port, const std::string& username,
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          const std::string& password, bool allow_listen);
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool Init();
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Handles sending using the local TCP socket.
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int SendTo(const void* data, size_t size,
852a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                     const rtc::SocketAddress& addr,
862a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                     const rtc::PacketOptions& options,
87391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                     bool payload);
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Accepts incoming TCP connection.
902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnNewConnection(rtc::AsyncPacketSocket* socket,
912a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                       rtc::AsyncPacketSocket* new_socket);
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct Incoming {
952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::SocketAddress addr;
962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::AsyncPacketSocket* socket;
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::AsyncPacketSocket* GetIncoming(
1002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      const rtc::SocketAddress& addr, bool remove = false);
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Receives packet signal from the local TCP Socket.
1032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnReadPacket(rtc::AsyncPacketSocket* socket,
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                    const char* data, size_t size,
1052a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    const rtc::SocketAddress& remote_addr,
1062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    const rtc::PacketTime& packet_time);
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnReadyToSend(rtc::AsyncPacketSocket* socket);
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnAddressReady(rtc::AsyncPacketSocket* socket,
1112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                      const rtc::SocketAddress& address);
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // TODO: Is this still needed?
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool incoming_only_;
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool allow_listen_;
1162a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::AsyncPacketSocket* socket_;
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int error_;
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::list<Incoming> incoming_;
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  friend class TCPConnection;
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TCPConnection : public Connection {
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Connection is outgoing unless socket is specified
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TCPConnection(TCPPort* port, const Candidate& candidate,
1272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                rtc::AsyncPacketSocket* socket = 0);
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~TCPConnection();
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
130391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  virtual int Send(const void* data, size_t size,
1312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                   const rtc::PacketOptions& options);
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual int GetError();
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::AsyncPacketSocket* socket() { return socket_; }
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
1372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnConnect(rtc::AsyncPacketSocket* socket);
1382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnClose(rtc::AsyncPacketSocket* socket, int error);
1392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnReadPacket(rtc::AsyncPacketSocket* socket,
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                    const char* data, size_t size,
1412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    const rtc::SocketAddress& remote_addr,
1422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    const rtc::PacketTime& packet_time);
1432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnReadyToSend(rtc::AsyncPacketSocket* socket);
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::AsyncPacketSocket* socket_;
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int error_;
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  friend class TCPPort;
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif  // TALK_P2P_BASE_TCPPORT_H_
154