Index: jingle/notifier/base/fake_ssl_client_socket.cc |
diff --git a/jingle/notifier/base/fake_ssl_client_socket.cc b/jingle/notifier/base/fake_ssl_client_socket.cc |
index 2ab7ef5d2529a0fa4c4004a490b558de00a2d53d..e2470387eb1c9e699ac20396bc8d047104192d3b 100644 |
--- a/jingle/notifier/base/fake_ssl_client_socket.cc |
+++ b/jingle/notifier/base/fake_ssl_client_socket.cc |
@@ -89,7 +89,7 @@ FakeSSLClientSocket::FakeSSLClientSocket( |
transport_socket_(transport_socket), |
next_handshake_state_(STATE_NONE), |
handshake_completed_(false), |
- user_connect_callback_(NULL), |
+ old_user_connect_callback_(NULL), |
write_buf_(NewDrainableIOBufferWithSize(arraysize(kSslClientHello))), |
read_buf_(NewDrainableIOBufferWithSize(arraysize(kSslServerHello))) { |
CHECK(transport_socket_.get()); |
@@ -126,17 +126,34 @@ int FakeSSLClientSocket::Connect(net::OldCompletionCallback* callback) { |
DCHECK(callback); |
DCHECK_EQ(next_handshake_state_, STATE_NONE); |
DCHECK(!handshake_completed_); |
- DCHECK(!user_connect_callback_); |
+ DCHECK(!old_user_connect_callback_); |
DCHECK_EQ(write_buf_->BytesConsumed(), 0); |
DCHECK_EQ(read_buf_->BytesConsumed(), 0); |
next_handshake_state_ = STATE_CONNECT; |
int status = DoHandshakeLoop(); |
if (status == net::ERR_IO_PENDING) { |
- user_connect_callback_ = callback; |
+ old_user_connect_callback_ = callback; |
} |
return status; |
} |
+int FakeSSLClientSocket::Connect(const net::CompletionCallback& callback) { |
+ // We don't support synchronous operation, even if |
+ // |transport_socket_| does. |
+ DCHECK(!callback.is_null()); |
+ DCHECK_EQ(next_handshake_state_, STATE_NONE); |
+ DCHECK(!handshake_completed_); |
+ DCHECK(user_connect_callback_.is_null()); |
+ DCHECK_EQ(write_buf_->BytesConsumed(), 0); |
+ DCHECK_EQ(read_buf_->BytesConsumed(), 0); |
+ |
+ next_handshake_state_ = STATE_CONNECT; |
+ int status = DoHandshakeLoop(); |
+ if (status == net::ERR_IO_PENDING) |
+ user_connect_callback_ = callback; |
+ |
+ return status; |
+} |
int FakeSSLClientSocket::DoHandshakeLoop() { |
DCHECK_NE(next_handshake_state_, STATE_NONE); |
@@ -167,9 +184,16 @@ int FakeSSLClientSocket::DoHandshakeLoop() { |
void FakeSSLClientSocket::RunUserConnectCallback(int status) { |
DCHECK_LE(status, net::OK); |
next_handshake_state_ = STATE_NONE; |
- net::OldCompletionCallback* user_connect_callback = user_connect_callback_; |
- user_connect_callback_ = NULL; |
- user_connect_callback->Run(status); |
+ if (old_user_connect_callback_) { |
+ net::OldCompletionCallback* user_connect_callback = |
+ old_user_connect_callback_; |
+ old_user_connect_callback_ = NULL; |
+ user_connect_callback->Run(status); |
+ } else { |
+ net::CompletionCallback user_connect_callback = user_connect_callback_; |
+ user_connect_callback_.Reset(); |
+ user_connect_callback.Run(status); |
+ } |
} |
void FakeSSLClientSocket::DoHandshakeLoopWithUserConnectCallback() { |
@@ -191,7 +215,7 @@ int FakeSSLClientSocket::DoConnect() { |
void FakeSSLClientSocket::OnConnectDone(int status) { |
DCHECK_NE(status, net::ERR_IO_PENDING); |
DCHECK_LE(status, net::OK); |
- DCHECK(user_connect_callback_); |
+ DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); |
if (status != net::OK) { |
RunUserConnectCallback(status); |
return; |
@@ -219,7 +243,7 @@ int FakeSSLClientSocket::DoSendClientHello() { |
void FakeSSLClientSocket::OnSendClientHelloDone(int status) { |
DCHECK_NE(status, net::ERR_IO_PENDING); |
- DCHECK(user_connect_callback_); |
+ DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); |
if (status < net::OK) { |
RunUserConnectCallback(status); |
return; |
@@ -252,7 +276,7 @@ int FakeSSLClientSocket::DoVerifyServerHello() { |
void FakeSSLClientSocket::OnVerifyServerHelloDone(int status) { |
DCHECK_NE(status, net::ERR_IO_PENDING); |
- DCHECK(user_connect_callback_); |
+ DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); |
if (status < net::OK) { |
RunUserConnectCallback(status); |
return; |
@@ -295,7 +319,8 @@ void FakeSSLClientSocket::Disconnect() { |
transport_socket_->Disconnect(); |
next_handshake_state_ = STATE_NONE; |
handshake_completed_ = false; |
- user_connect_callback_ = NULL; |
+ old_user_connect_callback_ = NULL; |
+ user_connect_callback_.Reset(); |
write_buf_->SetOffset(0); |
read_buf_->SetOffset(0); |
} |