OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/protocol/libjingle_transport_factory.h" | 5 #include "remoting/protocol/libjingle_transport_factory.h" |
6 | 6 |
7 #include "base/message_loop_proxy.h" | 7 #include "base/message_loop_proxy.h" |
8 #include "jingle/glue/channel_socket_adapter.h" | 8 #include "jingle/glue/channel_socket_adapter.h" |
9 #include "jingle/glue/pseudotcp_adapter.h" | 9 #include "jingle/glue/pseudotcp_adapter.h" |
10 #include "jingle/glue/utils.h" | 10 #include "jingle/glue/utils.h" |
11 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" |
12 #include "remoting/base/constants.h" | 12 #include "remoting/base/constants.h" |
13 #include "remoting/protocol/channel_authenticator.h" | 13 #include "remoting/protocol/channel_authenticator.h" |
14 #include "remoting/protocol/transport_config.h" | 14 #include "remoting/protocol/transport_config.h" |
15 #include "third_party/libjingle/source/talk/base/basicpacketsocketfactory.h" | 15 #include "third_party/libjingle/source/talk/base/basicpacketsocketfactory.h" |
16 #include "third_party/libjingle/source/talk/base/network.h" | 16 #include "third_party/libjingle/source/talk/base/network.h" |
17 #include "third_party/libjingle/source/talk/p2p/base/p2ptransportchannel.h" | 17 #include "third_party/libjingle/source/talk/p2p/base/p2ptransportchannel.h" |
18 #include "third_party/libjingle/source/talk/p2p/client/basicportallocator.h" | 18 #include "third_party/libjingle/source/talk/p2p/client/basicportallocator.h" |
19 #include "third_party/libjingle/source/talk/p2p/client/httpportallocator.h" | |
19 | 20 |
20 namespace remoting { | 21 namespace remoting { |
21 namespace protocol { | 22 namespace protocol { |
22 | 23 |
23 namespace { | 24 namespace { |
24 | 25 |
25 // Value is choosen to balance the extra latency against the reduced | 26 // Value is choosen to balance the extra latency against the reduced |
26 // load due to ACK traffic. | 27 // load due to ACK traffic. |
27 const int kTcpAckDelayMilliseconds = 10; | 28 const int kTcpAckDelayMilliseconds = 10; |
28 | 29 |
29 // Values for the TCP send and receive buffer size. This should be tuned to | 30 // Values for the TCP send and receive buffer size. This should be tuned to |
30 // accomodate high latency network but not backlog the decoding pipeline. | 31 // accomodate high latency network but not backlog the decoding pipeline. |
31 const int kTcpReceiveBufferSize = 256 * 1024; | 32 const int kTcpReceiveBufferSize = 256 * 1024; |
32 const int kTcpSendBufferSize = kTcpReceiveBufferSize + 30 * 1024; | 33 const int kTcpSendBufferSize = kTcpReceiveBufferSize + 30 * 1024; |
33 | 34 |
34 class LibjingleStreamTransport : public StreamTransport, | 35 class LibjingleStreamTransport : public StreamTransport, |
35 public sigslot::has_slots<> { | 36 public sigslot::has_slots<> { |
36 public: | 37 public: |
37 LibjingleStreamTransport(cricket::PortAllocator* port_allocator, | 38 LibjingleStreamTransport(cricket::PortAllocator* port_allocator, |
38 bool incoming_only); | 39 bool incoming_only); |
39 virtual ~LibjingleStreamTransport(); | 40 virtual ~LibjingleStreamTransport(); |
40 | 41 |
41 // StreamTransport interface. | 42 // StreamTransport interface. |
42 virtual void Initialize( | 43 virtual void Initialize( |
43 const std::string& name, | 44 const std::string& name, |
44 const TransportConfig& config, | |
45 Transport::EventHandler* event_handler, | 45 Transport::EventHandler* event_handler, |
46 scoped_ptr<ChannelAuthenticator> authenticator) OVERRIDE; | 46 scoped_ptr<ChannelAuthenticator> authenticator) OVERRIDE; |
47 virtual void Connect( | 47 virtual void Connect( |
48 const StreamTransport::ConnectedCallback& callback) OVERRIDE; | 48 const StreamTransport::ConnectedCallback& callback) OVERRIDE; |
49 virtual void AddRemoteCandidate(const cricket::Candidate& candidate) OVERRIDE; | 49 virtual void AddRemoteCandidate(const cricket::Candidate& candidate) OVERRIDE; |
50 virtual const std::string& name() const OVERRIDE; | 50 virtual const std::string& name() const OVERRIDE; |
51 virtual bool is_connected() const OVERRIDE; | 51 virtual bool is_connected() const OVERRIDE; |
52 | 52 |
53 private: | 53 private: |
54 void OnRequestSignaling(cricket::TransportChannelImpl* channel); | 54 void OnRequestSignaling(cricket::TransportChannelImpl* channel); |
55 void OnCandidateReady(cricket::TransportChannelImpl* channel, | 55 void OnCandidateReady(cricket::TransportChannelImpl* channel, |
56 const cricket::Candidate& candidate); | 56 const cricket::Candidate& candidate); |
57 void OnRouteChange(cricket::TransportChannel* channel, | 57 void OnRouteChange(cricket::TransportChannel* channel, |
58 const cricket::Candidate& candidate); | 58 const cricket::Candidate& candidate); |
59 | 59 |
60 void OnTcpConnected(int result); | 60 void OnTcpConnected(int result); |
61 void OnAuthenticationDone(net::Error error, | 61 void OnAuthenticationDone(net::Error error, |
62 scoped_ptr<net::StreamSocket> socket); | 62 scoped_ptr<net::StreamSocket> socket); |
63 | 63 |
64 void OnChannelDestroyed(); | 64 void OnChannelDestroyed(); |
65 | 65 |
66 void NotifyConnected(scoped_ptr<net::StreamSocket> socket); | 66 void NotifyConnected(scoped_ptr<net::StreamSocket> socket); |
67 void NotifyConnectFailed(); | 67 void NotifyConnectFailed(); |
68 | 68 |
69 cricket::PortAllocator* port_allocator_; | 69 cricket::PortAllocator* port_allocator_; |
70 bool incoming_only_; | 70 bool incoming_only_; |
71 | 71 |
72 std::string name_; | 72 std::string name_; |
73 TransportConfig config_; | |
74 EventHandler* event_handler_; | 73 EventHandler* event_handler_; |
75 StreamTransport::ConnectedCallback callback_; | 74 StreamTransport::ConnectedCallback callback_; |
76 scoped_ptr<ChannelAuthenticator> authenticator_; | 75 scoped_ptr<ChannelAuthenticator> authenticator_; |
77 | 76 |
78 scoped_ptr<cricket::P2PTransportChannel> channel_; | 77 scoped_ptr<cricket::P2PTransportChannel> channel_; |
79 | 78 |
80 // We own |socket_| until it is connected. | 79 // We own |socket_| until it is connected. |
81 scoped_ptr<jingle_glue::PseudoTcpAdapter> socket_; | 80 scoped_ptr<jingle_glue::PseudoTcpAdapter> socket_; |
82 | 81 |
83 DISALLOW_COPY_AND_ASSIGN(LibjingleStreamTransport); | 82 DISALLOW_COPY_AND_ASSIGN(LibjingleStreamTransport); |
(...skipping 14 matching lines...) Expand all Loading... | |
98 DCHECK(!is_connected() || socket_.get() == NULL); | 97 DCHECK(!is_connected() || socket_.get() == NULL); |
99 | 98 |
100 if (channel_.get()) { | 99 if (channel_.get()) { |
101 base::MessageLoopProxy::current()->DeleteSoon( | 100 base::MessageLoopProxy::current()->DeleteSoon( |
102 FROM_HERE, channel_.release()); | 101 FROM_HERE, channel_.release()); |
103 } | 102 } |
104 } | 103 } |
105 | 104 |
106 void LibjingleStreamTransport::Initialize( | 105 void LibjingleStreamTransport::Initialize( |
107 const std::string& name, | 106 const std::string& name, |
108 const TransportConfig& config, | |
109 Transport::EventHandler* event_handler, | 107 Transport::EventHandler* event_handler, |
110 scoped_ptr<ChannelAuthenticator> authenticator) { | 108 scoped_ptr<ChannelAuthenticator> authenticator) { |
111 DCHECK(CalledOnValidThread()); | 109 DCHECK(CalledOnValidThread()); |
112 | 110 |
113 DCHECK(!name.empty()); | 111 DCHECK(!name.empty()); |
114 DCHECK(event_handler); | 112 DCHECK(event_handler); |
115 | 113 |
116 // Can be initialized only once. | 114 // Can be initialized only once. |
117 DCHECK(name_.empty()); | 115 DCHECK(name_.empty()); |
118 | 116 |
119 name_ = name; | 117 name_ = name; |
120 config_ = config; | |
121 event_handler_ = event_handler; | 118 event_handler_ = event_handler; |
122 authenticator_ = authenticator.Pass(); | 119 authenticator_ = authenticator.Pass(); |
123 } | 120 } |
124 | 121 |
125 void LibjingleStreamTransport::Connect( | 122 void LibjingleStreamTransport::Connect( |
126 const StreamTransport::ConnectedCallback& callback) { | 123 const StreamTransport::ConnectedCallback& callback) { |
127 DCHECK(CalledOnValidThread()); | 124 DCHECK(CalledOnValidThread()); |
128 | 125 |
129 callback_ = callback; | 126 callback_ = callback; |
130 | 127 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
287 authenticator_.reset(); | 284 authenticator_.reset(); |
288 | 285 |
289 NotifyConnected(scoped_ptr<net::StreamSocket>(NULL)); | 286 NotifyConnected(scoped_ptr<net::StreamSocket>(NULL)); |
290 } | 287 } |
291 | 288 |
292 } // namespace | 289 } // namespace |
293 | 290 |
294 LibjingleTransportFactory::LibjingleTransportFactory( | 291 LibjingleTransportFactory::LibjingleTransportFactory( |
295 scoped_ptr<talk_base::NetworkManager> network_manager, | 292 scoped_ptr<talk_base::NetworkManager> network_manager, |
296 scoped_ptr<talk_base::PacketSocketFactory> socket_factory, | 293 scoped_ptr<talk_base::PacketSocketFactory> socket_factory, |
297 scoped_ptr<cricket::PortAllocator> port_allocator, | 294 scoped_ptr<cricket::HttpPortAllocatorBase> port_allocator, |
298 bool incoming_only) | 295 bool incoming_only) |
299 : network_manager_(network_manager.Pass()), | 296 : network_manager_(network_manager.Pass()), |
300 socket_factory_(socket_factory.Pass()), | 297 socket_factory_(socket_factory.Pass()), |
298 http_port_allocator_(port_allocator.get()), | |
301 port_allocator_(port_allocator.Pass()), | 299 port_allocator_(port_allocator.Pass()), |
302 incoming_only_(incoming_only) { | 300 incoming_only_(incoming_only) { |
303 } | 301 } |
304 | 302 |
305 LibjingleTransportFactory::LibjingleTransportFactory() | 303 LibjingleTransportFactory::LibjingleTransportFactory() |
306 : network_manager_(new talk_base::BasicNetworkManager()), | 304 : network_manager_(new talk_base::BasicNetworkManager()), |
307 socket_factory_(new talk_base::BasicPacketSocketFactory()), | 305 socket_factory_(new talk_base::BasicPacketSocketFactory()), |
306 http_port_allocator_(NULL), | |
308 port_allocator_(new cricket::BasicPortAllocator( | 307 port_allocator_(new cricket::BasicPortAllocator( |
309 network_manager_.get(), socket_factory_.get())) { | 308 network_manager_.get(), socket_factory_.get())) { |
310 } | 309 } |
311 | 310 |
312 LibjingleTransportFactory::~LibjingleTransportFactory() { | 311 LibjingleTransportFactory::~LibjingleTransportFactory() { |
313 // This method may be called in response to a libjingle signal, so | 312 // This method may be called in response to a libjingle signal, so |
314 // libjingle objects must be deleted asynchronously. | 313 // libjingle objects must be deleted asynchronously. |
315 base::MessageLoopProxy::current()->DeleteSoon( | 314 base::MessageLoopProxy::current()->DeleteSoon( |
316 FROM_HERE, port_allocator_.release()); | 315 FROM_HERE, port_allocator_.release()); |
317 base::MessageLoopProxy::current()->DeleteSoon( | 316 base::MessageLoopProxy::current()->DeleteSoon( |
318 FROM_HERE, socket_factory_.release()); | 317 FROM_HERE, socket_factory_.release()); |
319 base::MessageLoopProxy::current()->DeleteSoon( | 318 base::MessageLoopProxy::current()->DeleteSoon( |
320 FROM_HERE, network_manager_.release()); | 319 FROM_HERE, network_manager_.release()); |
321 } | 320 } |
322 | 321 |
322 void LibjingleTransportFactory::SetConfig(const TransportConfig& config) { | |
323 if (http_port_allocator_) { | |
324 std::vector<talk_base::SocketAddress> stun_hosts; | |
325 talk_base::SocketAddress stun_address; | |
326 if (stun_address.FromString(config.stun_server)) { | |
327 stun_hosts.push_back(talk_base::SocketAddress()); | |
Wez
2012/04/27 23:49:15
Don't you mean to push |stun_address|?
Sergey Ulanov
2012/04/28 00:18:19
Done.
| |
328 http_port_allocator_->SetStunHosts(stun_hosts); | |
Wez
2012/04/27 23:49:15
Doesn't this mean we have only a single STUN host?
Sergey Ulanov
2012/04/28 00:18:19
Yes. Even if we provide more than one STUN host he
| |
329 } else { | |
330 LOG(ERROR) << "Failed to parse stun server address: " | |
331 << config.stun_server; | |
332 } | |
333 | |
334 std::vector<std::string> relay_hosts; | |
335 relay_hosts.push_back(config.relay_server); | |
336 http_port_allocator_->SetRelayHosts(relay_hosts); | |
337 http_port_allocator_->SetRelayToken(config.relay_token); | |
338 } | |
339 } | |
340 | |
323 scoped_ptr<StreamTransport> LibjingleTransportFactory::CreateStreamTransport() { | 341 scoped_ptr<StreamTransport> LibjingleTransportFactory::CreateStreamTransport() { |
324 return scoped_ptr<StreamTransport>( | 342 return scoped_ptr<StreamTransport>( |
325 new LibjingleStreamTransport(port_allocator_.get(), incoming_only_)); | 343 new LibjingleStreamTransport(port_allocator_.get(), incoming_only_)); |
326 } | 344 } |
327 | 345 |
328 scoped_ptr<DatagramTransport> | 346 scoped_ptr<DatagramTransport> |
329 LibjingleTransportFactory::CreateDatagramTransport() { | 347 LibjingleTransportFactory::CreateDatagramTransport() { |
330 NOTIMPLEMENTED(); | 348 NOTIMPLEMENTED(); |
331 return scoped_ptr<DatagramTransport>(NULL); | 349 return scoped_ptr<DatagramTransport>(NULL); |
332 } | 350 } |
333 | 351 |
334 } // namespace protocol | 352 } // namespace protocol |
335 } // namespace remoting | 353 } // namespace remoting |
OLD | NEW |