| 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 |