| Index: net/socket/tcp_client_socket.cc
|
| diff --git a/net/socket/tcp_client_socket.cc b/net/socket/tcp_client_socket.cc
|
| deleted file mode 100644
|
| index 8e719f036c810d65775b3cd7244d95700abd4b4e..0000000000000000000000000000000000000000
|
| --- a/net/socket/tcp_client_socket.cc
|
| +++ /dev/null
|
| @@ -1,346 +0,0 @@
|
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/socket/tcp_client_socket.h"
|
| -
|
| -#include "base/callback_helpers.h"
|
| -#include "base/logging.h"
|
| -#include "base/profiler/scoped_tracker.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/ip_endpoint.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/net_util.h"
|
| -
|
| -namespace net {
|
| -
|
| -TCPClientSocket::TCPClientSocket(const AddressList& addresses,
|
| - net::NetLog* net_log,
|
| - const net::NetLog::Source& source)
|
| - : socket_(new TCPSocket(net_log, source)),
|
| - addresses_(addresses),
|
| - current_address_index_(-1),
|
| - next_connect_state_(CONNECT_STATE_NONE),
|
| - previously_disconnected_(false) {
|
| -}
|
| -
|
| -TCPClientSocket::TCPClientSocket(scoped_ptr<TCPSocket> connected_socket,
|
| - const IPEndPoint& peer_address)
|
| - : socket_(connected_socket.Pass()),
|
| - addresses_(AddressList(peer_address)),
|
| - current_address_index_(0),
|
| - next_connect_state_(CONNECT_STATE_NONE),
|
| - previously_disconnected_(false) {
|
| - DCHECK(socket_);
|
| -
|
| - socket_->SetDefaultOptionsForClient();
|
| - use_history_.set_was_ever_connected();
|
| -}
|
| -
|
| -TCPClientSocket::~TCPClientSocket() {
|
| -}
|
| -
|
| -int TCPClientSocket::Bind(const IPEndPoint& address) {
|
| - if (current_address_index_ >= 0 || bind_address_) {
|
| - // Cannot bind the socket if we are already connected or connecting.
|
| - NOTREACHED();
|
| - return ERR_UNEXPECTED;
|
| - }
|
| -
|
| - int result = OK;
|
| - if (!socket_->IsValid()) {
|
| - result = OpenSocket(address.GetFamily());
|
| - if (result != OK)
|
| - return result;
|
| - }
|
| -
|
| - result = socket_->Bind(address);
|
| - if (result != OK)
|
| - return result;
|
| -
|
| - bind_address_.reset(new IPEndPoint(address));
|
| - return OK;
|
| -}
|
| -
|
| -int TCPClientSocket::Connect(const CompletionCallback& callback) {
|
| - // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
|
| - tracked_objects::ScopedTracker tracking_profile(
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION("436634 TCPClientSocket::Connect"));
|
| -
|
| - DCHECK(!callback.is_null());
|
| -
|
| - // If connecting or already connected, then just return OK.
|
| - if (socket_->IsValid() && current_address_index_ >= 0)
|
| - return OK;
|
| -
|
| - socket_->StartLoggingMultipleConnectAttempts(addresses_);
|
| -
|
| - // We will try to connect to each address in addresses_. Start with the
|
| - // first one in the list.
|
| - next_connect_state_ = CONNECT_STATE_CONNECT;
|
| - current_address_index_ = 0;
|
| -
|
| - int rv = DoConnectLoop(OK);
|
| - if (rv == ERR_IO_PENDING) {
|
| - connect_callback_ = callback;
|
| - } else {
|
| - socket_->EndLoggingMultipleConnectAttempts(rv);
|
| - }
|
| -
|
| - return rv;
|
| -}
|
| -
|
| -int TCPClientSocket::DoConnectLoop(int result) {
|
| - DCHECK_NE(next_connect_state_, CONNECT_STATE_NONE);
|
| -
|
| - int rv = result;
|
| - do {
|
| - ConnectState state = next_connect_state_;
|
| - next_connect_state_ = CONNECT_STATE_NONE;
|
| - switch (state) {
|
| - case CONNECT_STATE_CONNECT:
|
| - DCHECK_EQ(OK, rv);
|
| - rv = DoConnect();
|
| - break;
|
| - case CONNECT_STATE_CONNECT_COMPLETE:
|
| - rv = DoConnectComplete(rv);
|
| - break;
|
| - default:
|
| - NOTREACHED() << "bad state " << state;
|
| - rv = ERR_UNEXPECTED;
|
| - break;
|
| - }
|
| - } while (rv != ERR_IO_PENDING && next_connect_state_ != CONNECT_STATE_NONE);
|
| -
|
| - return rv;
|
| -}
|
| -
|
| -int TCPClientSocket::DoConnect() {
|
| - // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
|
| - tracked_objects::ScopedTracker tracking_profile1(
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION("436634 TCPClientSocket::DoConnect1"));
|
| -
|
| - DCHECK_GE(current_address_index_, 0);
|
| - DCHECK_LT(current_address_index_, static_cast<int>(addresses_.size()));
|
| -
|
| - const IPEndPoint& endpoint = addresses_[current_address_index_];
|
| -
|
| - if (previously_disconnected_) {
|
| - use_history_.Reset();
|
| - previously_disconnected_ = false;
|
| - }
|
| -
|
| - next_connect_state_ = CONNECT_STATE_CONNECT_COMPLETE;
|
| -
|
| - if (socket_->IsValid()) {
|
| - DCHECK(bind_address_);
|
| - } else {
|
| - int result = OpenSocket(endpoint.GetFamily());
|
| - if (result != OK)
|
| - return result;
|
| -
|
| - if (bind_address_) {
|
| - result = socket_->Bind(*bind_address_);
|
| - if (result != OK) {
|
| - socket_->Close();
|
| - return result;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
|
| - tracked_objects::ScopedTracker tracking_profile2(
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION("436634 TCPClientSocket::DoConnect2"));
|
| -
|
| - // |socket_| is owned by this class and the callback won't be run once
|
| - // |socket_| is gone. Therefore, it is safe to use base::Unretained() here.
|
| - return socket_->Connect(endpoint,
|
| - base::Bind(&TCPClientSocket::DidCompleteConnect,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -int TCPClientSocket::DoConnectComplete(int result) {
|
| - // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed.
|
| - tracked_objects::ScopedTracker tracking_profile(
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| - "436634 TCPClientSocket::DoConnectComplete"));
|
| -
|
| - if (result == OK) {
|
| - use_history_.set_was_ever_connected();
|
| - return OK; // Done!
|
| - }
|
| -
|
| - // Close whatever partially connected socket we currently have.
|
| - DoDisconnect();
|
| -
|
| - // Try to fall back to the next address in the list.
|
| - if (current_address_index_ + 1 < static_cast<int>(addresses_.size())) {
|
| - next_connect_state_ = CONNECT_STATE_CONNECT;
|
| - ++current_address_index_;
|
| - return OK;
|
| - }
|
| -
|
| - // Otherwise there is nothing to fall back to, so give up.
|
| - return result;
|
| -}
|
| -
|
| -void TCPClientSocket::Disconnect() {
|
| - DoDisconnect();
|
| - current_address_index_ = -1;
|
| - bind_address_.reset();
|
| -}
|
| -
|
| -void TCPClientSocket::DoDisconnect() {
|
| - // If connecting or already connected, record that the socket has been
|
| - // disconnected.
|
| - previously_disconnected_ = socket_->IsValid() && current_address_index_ >= 0;
|
| - socket_->Close();
|
| -}
|
| -
|
| -bool TCPClientSocket::IsConnected() const {
|
| - return socket_->IsConnected();
|
| -}
|
| -
|
| -bool TCPClientSocket::IsConnectedAndIdle() const {
|
| - return socket_->IsConnectedAndIdle();
|
| -}
|
| -
|
| -int TCPClientSocket::GetPeerAddress(IPEndPoint* address) const {
|
| - return socket_->GetPeerAddress(address);
|
| -}
|
| -
|
| -int TCPClientSocket::GetLocalAddress(IPEndPoint* address) const {
|
| - DCHECK(address);
|
| -
|
| - if (!socket_->IsValid()) {
|
| - if (bind_address_) {
|
| - *address = *bind_address_;
|
| - return OK;
|
| - }
|
| - return ERR_SOCKET_NOT_CONNECTED;
|
| - }
|
| -
|
| - return socket_->GetLocalAddress(address);
|
| -}
|
| -
|
| -const BoundNetLog& TCPClientSocket::NetLog() const {
|
| - return socket_->net_log();
|
| -}
|
| -
|
| -void TCPClientSocket::SetSubresourceSpeculation() {
|
| - use_history_.set_subresource_speculation();
|
| -}
|
| -
|
| -void TCPClientSocket::SetOmniboxSpeculation() {
|
| - use_history_.set_omnibox_speculation();
|
| -}
|
| -
|
| -bool TCPClientSocket::WasEverUsed() const {
|
| - return use_history_.was_used_to_convey_data();
|
| -}
|
| -
|
| -bool TCPClientSocket::UsingTCPFastOpen() const {
|
| - return socket_->UsingTCPFastOpen();
|
| -}
|
| -
|
| -void TCPClientSocket::EnableTCPFastOpenIfSupported() {
|
| - socket_->EnableTCPFastOpenIfSupported();
|
| -}
|
| -
|
| -bool TCPClientSocket::WasNpnNegotiated() const {
|
| - return false;
|
| -}
|
| -
|
| -NextProto TCPClientSocket::GetNegotiatedProtocol() const {
|
| - return kProtoUnknown;
|
| -}
|
| -
|
| -bool TCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
|
| - return false;
|
| -}
|
| -
|
| -int TCPClientSocket::Read(IOBuffer* buf,
|
| - int buf_len,
|
| - const CompletionCallback& callback) {
|
| - DCHECK(!callback.is_null());
|
| -
|
| - // |socket_| is owned by this class and the callback won't be run once
|
| - // |socket_| is gone. Therefore, it is safe to use base::Unretained() here.
|
| - CompletionCallback read_callback = base::Bind(
|
| - &TCPClientSocket::DidCompleteReadWrite, base::Unretained(this), callback);
|
| - int result = socket_->Read(buf, buf_len, read_callback);
|
| - if (result > 0)
|
| - use_history_.set_was_used_to_convey_data();
|
| -
|
| - return result;
|
| -}
|
| -
|
| -int TCPClientSocket::Write(IOBuffer* buf,
|
| - int buf_len,
|
| - const CompletionCallback& callback) {
|
| - DCHECK(!callback.is_null());
|
| -
|
| - // |socket_| is owned by this class and the callback won't be run once
|
| - // |socket_| is gone. Therefore, it is safe to use base::Unretained() here.
|
| - CompletionCallback write_callback = base::Bind(
|
| - &TCPClientSocket::DidCompleteReadWrite, base::Unretained(this), callback);
|
| - int result = socket_->Write(buf, buf_len, write_callback);
|
| - if (result > 0)
|
| - use_history_.set_was_used_to_convey_data();
|
| -
|
| - return result;
|
| -}
|
| -
|
| -int TCPClientSocket::SetReceiveBufferSize(int32 size) {
|
| - return socket_->SetReceiveBufferSize(size);
|
| -}
|
| -
|
| -int TCPClientSocket::SetSendBufferSize(int32 size) {
|
| - return socket_->SetSendBufferSize(size);
|
| -}
|
| -
|
| -bool TCPClientSocket::SetKeepAlive(bool enable, int delay) {
|
| - return socket_->SetKeepAlive(enable, delay);
|
| -}
|
| -
|
| -bool TCPClientSocket::SetNoDelay(bool no_delay) {
|
| - return socket_->SetNoDelay(no_delay);
|
| -}
|
| -
|
| -void TCPClientSocket::DidCompleteConnect(int result) {
|
| - DCHECK_EQ(next_connect_state_, CONNECT_STATE_CONNECT_COMPLETE);
|
| - DCHECK_NE(result, ERR_IO_PENDING);
|
| - DCHECK(!connect_callback_.is_null());
|
| -
|
| - result = DoConnectLoop(result);
|
| - if (result != ERR_IO_PENDING) {
|
| - socket_->EndLoggingMultipleConnectAttempts(result);
|
| - base::ResetAndReturn(&connect_callback_).Run(result);
|
| - }
|
| -}
|
| -
|
| -void TCPClientSocket::DidCompleteReadWrite(const CompletionCallback& callback,
|
| - int result) {
|
| - if (result > 0)
|
| - use_history_.set_was_used_to_convey_data();
|
| -
|
| - // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed.
|
| - tracked_objects::ScopedTracker tracking_profile(
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| - "418183 TCPClientSocket::DidCompleteReadWrite"));
|
| - callback.Run(result);
|
| -}
|
| -
|
| -int TCPClientSocket::OpenSocket(AddressFamily family) {
|
| - DCHECK(!socket_->IsValid());
|
| -
|
| - int result = socket_->Open(family);
|
| - if (result != OK)
|
| - return result;
|
| -
|
| - socket_->SetDefaultOptionsForClient();
|
| -
|
| - return OK;
|
| -}
|
| -
|
| -} // namespace net
|
|
|