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