// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // This file defines the interface for peer-to-peer transport. There // are two types of transport: StreamTransport and DatagramTransport. // They must both be created using TransportFactory instances and they // provide the same interface, except that one should be used for // reliable stream connection and the other one for unreliable // datagram connection. The Transport interface itself doesn't provide // methods to send/receive data. Instead it creates an instance of // P2PDatagramSocket which provides access to the data channel. After a // new transport is Initialize()'ed the Connect() method must be called. // Connect() starts asynchronous creation and initialization of the // connection socket that can be used later to send and receive data. // The socket is passed to the callback specified in the Connect() call. // The Transport object must exist during the whole lifetime of the // connection socket. Later deletion of the connection socket causes // teardown of the corresponding Transport object. #ifndef REMOTING_PROTOCOL_TRANSPORT_H_ #define REMOTING_PROTOCOL_TRANSPORT_H_ #include #include "base/basictypes.h" #include "base/callback_forward.h" #include "base/memory/scoped_ptr.h" #include "base/threading/non_thread_safe.h" #include "net/base/ip_endpoint.h" namespace cricket { class Candidate; } // namespace cricket namespace remoting { namespace protocol { class ChannelAuthenticator; class P2PDatagramSocket; enum class TransportRole { SERVER, CLIENT, }; struct TransportRoute { enum RouteType { DIRECT, STUN, RELAY, }; // Helper method to get string representation of the type. static std::string GetTypeString(RouteType type); TransportRoute(); ~TransportRoute(); RouteType type; net::IPEndPoint remote_address; net::IPEndPoint local_address; }; class Transport : public base::NonThreadSafe { public: class EventHandler { public: EventHandler() {}; virtual ~EventHandler() {}; // Called to pass ICE credentials to the session. Used only for STANDARD // version of ICE, see SetIceVersion(). virtual void OnTransportIceCredentials(Transport* transport, const std::string& ufrag, const std::string& password) = 0; // Called when the transport generates a new candidate that needs // to be passed to the AddRemoteCandidate() method on the remote // end of the connection. virtual void OnTransportCandidate(Transport* transport, const cricket::Candidate& candidate) = 0; // Called when transport route changes. Can be called even before // the transport is connected. virtual void OnTransportRouteChange(Transport* transport, const TransportRoute& route) = 0; // Called when when the transport has failed to connect or reconnect. virtual void OnTransportFailed(Transport* transport) = 0; // Called when the transport is about to be deleted. virtual void OnTransportDeleted(Transport* transport) = 0; }; typedef base::Callback)> ConnectedCallback; Transport() {} virtual ~Transport() {} // Connects the transport and calls the |callback| after that. virtual void Connect(const std::string& name, Transport::EventHandler* event_handler, const ConnectedCallback& callback) = 0; // Sets remote ICE credentials. virtual void SetRemoteCredentials(const std::string& ufrag, const std::string& password) = 0; // Adds |candidate| received from the peer. virtual void AddRemoteCandidate(const cricket::Candidate& candidate) = 0; // Name of the channel. It is used to identify the channel and // disambiguate candidates it generates from candidates generated by // parallel connections. virtual const std::string& name() const = 0; // Returns true if the channel is already connected. virtual bool is_connected() const = 0; private: DISALLOW_COPY_AND_ASSIGN(Transport); }; class TransportFactory { public: TransportFactory() { } virtual ~TransportFactory() { } // Called to notify transport factory that a new transport might be created // soon, e.g. when a new session is being created. Implementation may use it // to start asynchronous preparation, e.g. fetch a new relay token if // necessary while the session is being authenticated. virtual void PrepareTokens() = 0; virtual scoped_ptr CreateTransport() = 0; private: DISALLOW_COPY_AND_ASSIGN(TransportFactory); }; } // namespace protocol } // namespace remoting #endif // REMOTING_PROTOCOL_TRANSPORT_H_