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#ifndef REMOTING_PROTOCOL_LIBJINGLE_TRANSPORT_FACTORY_H_
6#define REMOTING_PROTOCOL_LIBJINGLE_TRANSPORT_FACTORY_H_
7
8#include <list>
9
10#include "base/callback_forward.h"
11#include "remoting/jingle_glue/network_settings.h"
12#include "remoting/protocol/transport.h"
13
14namespace cricket {
15class HttpPortAllocatorBase;
16class PortAllocator;
17}  // namespace cricket
18
19namespace net {
20class URLRequestContextGetter;
21}  // namespace net
22
23namespace talk_base {
24class NetworkManager;
25class PacketSocketFactory;
26class SocketAddress;
27}  // namespace talk_base
28
29namespace remoting {
30
31class SignalStrategy;
32class JingleInfoRequest;
33
34namespace protocol {
35
36class LibjingleTransportFactory : public TransportFactory {
37 public:
38  // |signal_strategy| must outlive LibjingleTransportFactory. Need to use
39  // cricket::HttpPortAllocatorBase pointer for the |port_allocator|, so that it
40  // is possible to configure |port_allocator| with STUN/Relay addresses.
41  LibjingleTransportFactory(
42      SignalStrategy* signal_strategy,
43      scoped_ptr<cricket::HttpPortAllocatorBase> port_allocator,
44      const NetworkSettings& network_settings);
45
46  virtual ~LibjingleTransportFactory();
47
48  // TransportFactory interface.
49  virtual void PrepareTokens() OVERRIDE;
50  virtual scoped_ptr<StreamTransport> CreateStreamTransport() OVERRIDE;
51  virtual scoped_ptr<DatagramTransport> CreateDatagramTransport() OVERRIDE;
52
53 private:
54  void EnsureFreshJingleInfo();
55  void OnJingleInfo(const std::string& relay_token,
56                    const std::vector<std::string>& relay_hosts,
57                    const std::vector<talk_base::SocketAddress>& stun_hosts);
58
59  SignalStrategy* signal_strategy_;
60  scoped_ptr<cricket::HttpPortAllocatorBase> port_allocator_;
61  NetworkSettings network_settings_;
62
63  base::TimeTicks last_jingle_info_update_time_;
64  scoped_ptr<JingleInfoRequest> jingle_info_request_;
65
66  // When there is an active |jingle_info_request_| stores list of callbacks to
67  // be called once the |jingle_info_request_| is finished.
68  std::list<base::Closure> on_jingle_info_callbacks_;
69
70  DISALLOW_COPY_AND_ASSIGN(LibjingleTransportFactory);
71};
72
73}  // namespace protocol
74}  // namespace remoting
75
76#endif  // REMOTING_PROTOCOL_LIBJINGLE_TRANSPORT_FACTORY_H_
77