Chromium Code Reviews| Index: net/socket/tcp_client_socket_win.cc |
| diff --git a/net/socket/tcp_client_socket_win.cc b/net/socket/tcp_client_socket_win.cc |
| index 11debe041df8aceab1b8fb5f1434a8d8a6202b3b..4a89863aa277fea333ca3f8fe78be63686f83edf 100644 |
| --- a/net/socket/tcp_client_socket_win.cc |
| +++ b/net/socket/tcp_client_socket_win.cc |
| @@ -744,6 +744,47 @@ int TCPClientSocketWin::Read(IOBuffer* buf, |
| core_->read_iobuffer_ = buf; |
| return ERR_IO_PENDING; |
| } |
| +int TCPClientSocketWin::Read(IOBuffer* buf, |
| + int buf_len, |
| + const CompletionCallback& callback) { |
| + DCHECK(CalledOnValidThread()); |
| + DCHECK_NE(socket_, INVALID_SOCKET); |
| + DCHECK(!waiting_read_); |
| + DCHECK(!old_read_callback_ && read_callback_.is_null()); |
| + DCHECK(!core_->read_iobuffer_); |
| + |
| + buf_len = core_->ThrottleReadSize(buf_len); |
| + |
| + core_->read_buffer_.len = buf_len; |
| + core_->read_buffer_.buf = buf->data(); |
| + |
| + // TODO(wtc): Remove the assertion after enough testing. |
| + AssertEventNotSignaled(core_->read_overlapped_.hEvent); |
| + DWORD num, flags = 0; |
| + int rv = WSARecv(socket_, &core_->read_buffer_, 1, &num, &flags, |
| + &core_->read_overlapped_, NULL); |
| + if (rv == 0) { |
| + if (ResetEventIfSignaled(core_->read_overlapped_.hEvent)) { |
| + base::StatsCounter read_bytes("tcp.read_bytes"); |
| + read_bytes.Add(num); |
| + num_bytes_read_ += num; |
| + if (num > 0) |
| + use_history_.set_was_used_to_convey_data(); |
| + net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, num, |
| + core_->read_buffer_.buf); |
| + return static_cast<int>(num); |
| + } |
| + } else { |
| + int os_error = WSAGetLastError(); |
| + if (os_error != WSA_IO_PENDING) |
| + return MapSystemError(os_error); |
| + } |
| + core_->WatchForRead(); |
| + waiting_read_ = true; |
| + old_read_callback_ = callback; |
|
csilv
2011/12/07 00:03:48
read_callback_ = callback;
James Hawkins
2011/12/07 00:19:37
Done.
|
| + core_->read_iobuffer_ = buf; |
| + return ERR_IO_PENDING; |
| +} |
| int TCPClientSocketWin::Write(IOBuffer* buf, |
| int buf_len, |