1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4// 5// This file defines the interface for peer-to-peer transport. There 6// are two types of transport: StreamTransport and DatagramTransport. 7// They must both be created using TransportFactory instances and they 8// provide the same interface, except that one should be used for 9// reliable stream connection and the other one for unreliable 10// datagram connection. The Transport interface itself doesn't provide 11// methods to send/receive data. Instead it creates an instance of 12// net::Socket or net::SocketStream which provides access to the data 13// channel. After a new transport is Initialize()'ed the Connect() 14// method must be called. Connect() starts asynchronous creation and 15// initialization of the connection socket that can be used later to 16// send and receive data. The socket is passed to the callback 17// specified in the Connect() call. The Transport object must exist 18// during the whole lifetime of the connection socket. Later deletion 19// of the connection socket causes teardown of the corresponding 20// Transport object. 21 22#ifndef REMOTING_PROTOCOL_TRANSPORT_H_ 23#define REMOTING_PROTOCOL_TRANSPORT_H_ 24 25#include <string> 26 27#include "base/basictypes.h" 28#include "base/callback_forward.h" 29#include "base/memory/scoped_ptr.h" 30#include "base/threading/non_thread_safe.h" 31#include "net/base/ip_endpoint.h" 32 33namespace cricket { 34class Candidate; 35} // namespace cricket 36 37namespace net { 38class Socket; 39class StreamSocket; 40} // namespace net 41 42namespace remoting { 43namespace protocol { 44 45class ChannelAuthenticator; 46 47struct TransportRoute { 48 enum RouteType { 49 DIRECT, 50 STUN, 51 RELAY, 52 }; 53 54 // Helper method to get string representation of the type. 55 static std::string GetTypeString(RouteType type); 56 57 TransportRoute(); 58 ~TransportRoute(); 59 60 RouteType type; 61 net::IPEndPoint remote_address; 62 net::IPEndPoint local_address; 63}; 64 65class Transport : public base::NonThreadSafe { 66 public: 67 class EventHandler { 68 public: 69 EventHandler() {}; 70 virtual ~EventHandler() {}; 71 72 // Called when the transport generates a new candidate that needs 73 // to be passed to the AddRemoteCandidate() method on the remote 74 // end of the connection. 75 virtual void OnTransportCandidate(Transport* transport, 76 const cricket::Candidate& candidate) = 0; 77 78 // Called when transport route changes. Can be called even before 79 // the transport is connected. 80 virtual void OnTransportRouteChange(Transport* transport, 81 const TransportRoute& route) = 0; 82 83 // Called when when the transport has failed to connect or reconnect. 84 virtual void OnTransportFailed(Transport* transport) = 0; 85 86 // Called when the transport is about to be deleted. 87 virtual void OnTransportDeleted(Transport* transport) = 0; 88 }; 89 90 typedef base::Callback<void(scoped_ptr<net::Socket>)> ConnectedCallback; 91 92 Transport() {} 93 virtual ~Transport() {} 94 95 // Connects the transport and calls the |callback| after that. 96 virtual void Connect(const std::string& name, 97 Transport::EventHandler* event_handler, 98 const ConnectedCallback& callback) = 0; 99 100 // Adds |candidate| received from the peer. 101 virtual void AddRemoteCandidate(const cricket::Candidate& candidate) = 0; 102 103 // Name of the channel. It is used to identify the channel and 104 // disambiguate candidates it generates from candidates generated by 105 // parallel connections. 106 virtual const std::string& name() const = 0; 107 108 // Returns true if the channel is already connected. 109 virtual bool is_connected() const = 0; 110 111 private: 112 DISALLOW_COPY_AND_ASSIGN(Transport); 113}; 114 115class TransportFactory { 116 public: 117 TransportFactory() { } 118 virtual ~TransportFactory() { } 119 120 // Called to notify transport factory that a new transport might be created 121 // soon, e.g. when a new session is being created. Implementation may use it 122 // to start asynchronous preparation, e.g. fetch a new relay token if 123 // necessary while the session is being authenticated. 124 virtual void PrepareTokens() = 0; 125 126 virtual scoped_ptr<Transport> CreateTransport() = 0; 127 128 private: 129 DISALLOW_COPY_AND_ASSIGN(TransportFactory); 130}; 131 132} // namespace protocol 133} // namespace remoting 134 135#endif // REMOTING_PROTOCOL_TRANSPORT_H_ 136