OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/signaling/xmpp_signal_strategy.h" | 5 #include "remoting/signaling/xmpp_signal_strategy.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 const XmppServerConfig& xmpp_server_config); | 60 const XmppServerConfig& xmpp_server_config); |
61 ~Core() override; | 61 ~Core() override; |
62 | 62 |
63 void Connect(); | 63 void Connect(); |
64 void Disconnect(); | 64 void Disconnect(); |
65 State GetState() const; | 65 State GetState() const; |
66 Error GetError() const; | 66 Error GetError() const; |
67 std::string GetLocalJid() const; | 67 std::string GetLocalJid() const; |
68 void AddListener(Listener* listener); | 68 void AddListener(Listener* listener); |
69 void RemoveListener(Listener* listener); | 69 void RemoveListener(Listener* listener); |
70 bool SendStanza(scoped_ptr<buzz::XmlElement> stanza); | 70 bool SendStanza(std::unique_ptr<buzz::XmlElement> stanza); |
71 | 71 |
72 void SetAuthInfo(const std::string& username, | 72 void SetAuthInfo(const std::string& username, |
73 const std::string& auth_token); | 73 const std::string& auth_token); |
74 | 74 |
75 private: | 75 private: |
76 enum class TlsState { | 76 enum class TlsState { |
77 // StartTls() hasn't been called. |socket_| is not encrypted. | 77 // StartTls() hasn't been called. |socket_| is not encrypted. |
78 NOT_REQUESTED, | 78 NOT_REQUESTED, |
79 | 79 |
80 // StartTls() has been called. Waiting for |writer_| to finish writing | 80 // StartTls() has been called. Waiting for |writer_| to finish writing |
(...skipping 11 matching lines...) Expand all Loading... |
92 void OnTlsConnected(int result); | 92 void OnTlsConnected(int result); |
93 | 93 |
94 void ReadSocket(); | 94 void ReadSocket(); |
95 void OnReadResult(int result); | 95 void OnReadResult(int result); |
96 void HandleReadResult(int result); | 96 void HandleReadResult(int result); |
97 | 97 |
98 // XmppLoginHandler::Delegate interface. | 98 // XmppLoginHandler::Delegate interface. |
99 void SendMessage(const std::string& message) override; | 99 void SendMessage(const std::string& message) override; |
100 void StartTls() override; | 100 void StartTls() override; |
101 void OnHandshakeDone(const std::string& jid, | 101 void OnHandshakeDone(const std::string& jid, |
102 scoped_ptr<XmppStreamParser> parser) override; | 102 std::unique_ptr<XmppStreamParser> parser) override; |
103 void OnLoginHandlerError(SignalStrategy::Error error) override; | 103 void OnLoginHandlerError(SignalStrategy::Error error) override; |
104 | 104 |
105 // Callback for BufferedSocketWriter. | 105 // Callback for BufferedSocketWriter. |
106 void OnMessageSent(); | 106 void OnMessageSent(); |
107 | 107 |
108 // Event handlers for XmppStreamParser. | 108 // Event handlers for XmppStreamParser. |
109 void OnStanza(const scoped_ptr<buzz::XmlElement> stanza); | 109 void OnStanza(const std::unique_ptr<buzz::XmlElement> stanza); |
110 void OnParserError(); | 110 void OnParserError(); |
111 | 111 |
112 void OnNetworkError(int error); | 112 void OnNetworkError(int error); |
113 | 113 |
114 void SendKeepAlive(); | 114 void SendKeepAlive(); |
115 | 115 |
116 net::ClientSocketFactory* socket_factory_; | 116 net::ClientSocketFactory* socket_factory_; |
117 scoped_refptr<net::URLRequestContextGetter> request_context_getter_; | 117 scoped_refptr<net::URLRequestContextGetter> request_context_getter_; |
118 XmppServerConfig xmpp_server_config_; | 118 XmppServerConfig xmpp_server_config_; |
119 | 119 |
120 // Used by the |socket_|. | 120 // Used by the |socket_|. |
121 scoped_ptr<net::CertVerifier> cert_verifier_; | 121 std::unique_ptr<net::CertVerifier> cert_verifier_; |
122 scoped_ptr<net::TransportSecurityState> transport_security_state_; | 122 std::unique_ptr<net::TransportSecurityState> transport_security_state_; |
123 | 123 |
124 scoped_ptr<net::StreamSocket> socket_; | 124 std::unique_ptr<net::StreamSocket> socket_; |
125 scoped_ptr<BufferedSocketWriter> writer_; | 125 std::unique_ptr<BufferedSocketWriter> writer_; |
126 int pending_writes_ = 0; | 126 int pending_writes_ = 0; |
127 scoped_refptr<net::IOBuffer> read_buffer_; | 127 scoped_refptr<net::IOBuffer> read_buffer_; |
128 bool read_pending_ = false; | 128 bool read_pending_ = false; |
129 | 129 |
130 TlsState tls_state_ = TlsState::NOT_REQUESTED; | 130 TlsState tls_state_ = TlsState::NOT_REQUESTED; |
131 | 131 |
132 scoped_ptr<XmppLoginHandler> login_handler_; | 132 std::unique_ptr<XmppLoginHandler> login_handler_; |
133 scoped_ptr<XmppStreamParser> stream_parser_; | 133 std::unique_ptr<XmppStreamParser> stream_parser_; |
134 std::string jid_; | 134 std::string jid_; |
135 | 135 |
136 Error error_ = OK; | 136 Error error_ = OK; |
137 | 137 |
138 base::ObserverList<Listener, true> listeners_; | 138 base::ObserverList<Listener, true> listeners_; |
139 | 139 |
140 base::Timer keep_alive_timer_; | 140 base::Timer keep_alive_timer_; |
141 | 141 |
142 base::ThreadChecker thread_checker_; | 142 base::ThreadChecker thread_checker_; |
143 | 143 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 void XmppSignalStrategy::Core::AddListener(Listener* listener) { | 229 void XmppSignalStrategy::Core::AddListener(Listener* listener) { |
230 DCHECK(thread_checker_.CalledOnValidThread()); | 230 DCHECK(thread_checker_.CalledOnValidThread()); |
231 listeners_.AddObserver(listener); | 231 listeners_.AddObserver(listener); |
232 } | 232 } |
233 | 233 |
234 void XmppSignalStrategy::Core::RemoveListener(Listener* listener) { | 234 void XmppSignalStrategy::Core::RemoveListener(Listener* listener) { |
235 DCHECK(thread_checker_.CalledOnValidThread()); | 235 DCHECK(thread_checker_.CalledOnValidThread()); |
236 listeners_.RemoveObserver(listener); | 236 listeners_.RemoveObserver(listener); |
237 } | 237 } |
238 | 238 |
239 bool XmppSignalStrategy::Core::SendStanza(scoped_ptr<buzz::XmlElement> stanza) { | 239 bool XmppSignalStrategy::Core::SendStanza( |
| 240 std::unique_ptr<buzz::XmlElement> stanza) { |
240 DCHECK(thread_checker_.CalledOnValidThread()); | 241 DCHECK(thread_checker_.CalledOnValidThread()); |
241 | 242 |
242 if (!stream_parser_) { | 243 if (!stream_parser_) { |
243 VLOG(0) << "Dropping signalling message because XMPP is not connected."; | 244 VLOG(0) << "Dropping signalling message because XMPP is not connected."; |
244 return false; | 245 return false; |
245 } | 246 } |
246 | 247 |
247 SendMessage(stanza->Str()); | 248 SendMessage(stanza->Str()); |
248 | 249 |
249 // Return false if the SendMessage() call above resulted in the SignalStrategy | 250 // Return false if the SendMessage() call above resulted in the SignalStrategy |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 return; | 282 return; |
282 } | 283 } |
283 | 284 |
284 tls_state_ = TlsState::CONNECTING; | 285 tls_state_ = TlsState::CONNECTING; |
285 | 286 |
286 // Reset the writer so we don't try to write to the raw socket anymore. | 287 // Reset the writer so we don't try to write to the raw socket anymore. |
287 writer_.reset(); | 288 writer_.reset(); |
288 | 289 |
289 DCHECK(!read_pending_); | 290 DCHECK(!read_pending_); |
290 | 291 |
291 scoped_ptr<net::ClientSocketHandle> socket_handle( | 292 std::unique_ptr<net::ClientSocketHandle> socket_handle( |
292 new net::ClientSocketHandle()); | 293 new net::ClientSocketHandle()); |
293 socket_handle->SetSocket(std::move(socket_)); | 294 socket_handle->SetSocket(std::move(socket_)); |
294 | 295 |
295 cert_verifier_ = net::CertVerifier::CreateDefault(); | 296 cert_verifier_ = net::CertVerifier::CreateDefault(); |
296 transport_security_state_.reset(new net::TransportSecurityState()); | 297 transport_security_state_.reset(new net::TransportSecurityState()); |
297 net::SSLClientSocketContext context; | 298 net::SSLClientSocketContext context; |
298 context.cert_verifier = cert_verifier_.get(); | 299 context.cert_verifier = cert_verifier_.get(); |
299 context.transport_security_state = transport_security_state_.get(); | 300 context.transport_security_state = transport_security_state_.get(); |
300 | 301 |
301 socket_ = socket_factory_->CreateSSLClientSocket( | 302 socket_ = socket_factory_->CreateSSLClientSocket( |
302 std::move(socket_handle), | 303 std::move(socket_handle), |
303 net::HostPortPair(xmpp_server_config_.host, kDefaultHttpsPort), | 304 net::HostPortPair(xmpp_server_config_.host, kDefaultHttpsPort), |
304 net::SSLConfig(), context); | 305 net::SSLConfig(), context); |
305 | 306 |
306 int result = socket_->Connect( | 307 int result = socket_->Connect( |
307 base::Bind(&Core::OnTlsConnected, base::Unretained(this))); | 308 base::Bind(&Core::OnTlsConnected, base::Unretained(this))); |
308 if (result != net::ERR_IO_PENDING) | 309 if (result != net::ERR_IO_PENDING) |
309 OnTlsConnected(result); | 310 OnTlsConnected(result); |
310 } | 311 } |
311 | 312 |
312 void XmppSignalStrategy::Core::OnHandshakeDone( | 313 void XmppSignalStrategy::Core::OnHandshakeDone( |
313 const std::string& jid, | 314 const std::string& jid, |
314 scoped_ptr<XmppStreamParser> parser) { | 315 std::unique_ptr<XmppStreamParser> parser) { |
315 DCHECK(thread_checker_.CalledOnValidThread()); | 316 DCHECK(thread_checker_.CalledOnValidThread()); |
316 | 317 |
317 jid_ = jid; | 318 jid_ = jid; |
318 stream_parser_ = std::move(parser); | 319 stream_parser_ = std::move(parser); |
319 stream_parser_->SetCallbacks( | 320 stream_parser_->SetCallbacks( |
320 base::Bind(&Core::OnStanza, base::Unretained(this)), | 321 base::Bind(&Core::OnStanza, base::Unretained(this)), |
321 base::Bind(&Core::OnParserError, base::Unretained(this))); | 322 base::Bind(&Core::OnParserError, base::Unretained(this))); |
322 | 323 |
323 // Don't need |login_handler_| anymore. | 324 // Don't need |login_handler_| anymore. |
324 login_handler_.reset(); | 325 login_handler_.reset(); |
(...skipping 13 matching lines...) Expand all Loading... |
338 void XmppSignalStrategy::Core::OnMessageSent() { | 339 void XmppSignalStrategy::Core::OnMessageSent() { |
339 DCHECK(thread_checker_.CalledOnValidThread()); | 340 DCHECK(thread_checker_.CalledOnValidThread()); |
340 | 341 |
341 if (tls_state_ == TlsState::WAITING_FOR_FLUSH && | 342 if (tls_state_ == TlsState::WAITING_FOR_FLUSH && |
342 !writer_->has_data_pending()) { | 343 !writer_->has_data_pending()) { |
343 StartTls(); | 344 StartTls(); |
344 } | 345 } |
345 } | 346 } |
346 | 347 |
347 void XmppSignalStrategy::Core::OnStanza( | 348 void XmppSignalStrategy::Core::OnStanza( |
348 const scoped_ptr<buzz::XmlElement> stanza) { | 349 const std::unique_ptr<buzz::XmlElement> stanza) { |
349 DCHECK(thread_checker_.CalledOnValidThread()); | 350 DCHECK(thread_checker_.CalledOnValidThread()); |
350 | 351 |
351 base::ObserverListBase<Listener>::Iterator it(&listeners_); | 352 base::ObserverListBase<Listener>::Iterator it(&listeners_); |
352 for (Listener* listener = it.GetNext(); listener; listener = it.GetNext()) { | 353 for (Listener* listener = it.GetNext(); listener; listener = it.GetNext()) { |
353 if (listener->OnSignalStrategyIncomingStanza(stanza.get())) | 354 if (listener->OnSignalStrategyIncomingStanza(stanza.get())) |
354 return; | 355 return; |
355 } | 356 } |
356 } | 357 } |
357 | 358 |
358 void XmppSignalStrategy::Core::OnParserError() { | 359 void XmppSignalStrategy::Core::OnParserError() { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 return core_->GetLocalJid(); | 520 return core_->GetLocalJid(); |
520 } | 521 } |
521 | 522 |
522 void XmppSignalStrategy::AddListener(Listener* listener) { | 523 void XmppSignalStrategy::AddListener(Listener* listener) { |
523 core_->AddListener(listener); | 524 core_->AddListener(listener); |
524 } | 525 } |
525 | 526 |
526 void XmppSignalStrategy::RemoveListener(Listener* listener) { | 527 void XmppSignalStrategy::RemoveListener(Listener* listener) { |
527 core_->RemoveListener(listener); | 528 core_->RemoveListener(listener); |
528 } | 529 } |
529 bool XmppSignalStrategy::SendStanza(scoped_ptr<buzz::XmlElement> stanza) { | 530 bool XmppSignalStrategy::SendStanza(std::unique_ptr<buzz::XmlElement> stanza) { |
530 return core_->SendStanza(std::move(stanza)); | 531 return core_->SendStanza(std::move(stanza)); |
531 } | 532 } |
532 | 533 |
533 std::string XmppSignalStrategy::GetNextId() { | 534 std::string XmppSignalStrategy::GetNextId() { |
534 return base::Uint64ToString(base::RandUint64()); | 535 return base::Uint64ToString(base::RandUint64()); |
535 } | 536 } |
536 | 537 |
537 void XmppSignalStrategy::SetAuthInfo(const std::string& username, | 538 void XmppSignalStrategy::SetAuthInfo(const std::string& username, |
538 const std::string& auth_token) { | 539 const std::string& auth_token) { |
539 core_->SetAuthInfo(username, auth_token); | 540 core_->SetAuthInfo(username, auth_token); |
540 } | 541 } |
541 | 542 |
542 } // namespace remoting | 543 } // namespace remoting |
OLD | NEW |