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