diff options
Diffstat (limited to 'net/socket/client_socket_handle.cc')
-rw-r--r-- | net/socket/client_socket_handle.cc | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/net/socket/client_socket_handle.cc b/net/socket/client_socket_handle.cc new file mode 100644 index 0000000..96dec03 --- /dev/null +++ b/net/socket/client_socket_handle.cc @@ -0,0 +1,73 @@ +// Copyright (c) 2006-2008 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/client_socket_handle.h" + +#include "base/compiler_specific.h" +#include "base/logging.h" +#include "net/base/net_errors.h" +#include "net/socket/client_socket.h" +#include "net/socket/client_socket_pool.h" + +namespace net { + +ClientSocketHandle::ClientSocketHandle(ClientSocketPool* pool) + : pool_(pool), + socket_(NULL), + is_reused_(false), + ALLOW_THIS_IN_INITIALIZER_LIST( + callback_(this, &ClientSocketHandle::OnIOComplete)) {} + +ClientSocketHandle::~ClientSocketHandle() { + Reset(); +} + +int ClientSocketHandle::Init(const std::string& group_name, + const HostResolver::RequestInfo& resolve_info, + int priority, + CompletionCallback* callback) { + ResetInternal(true); + group_name_ = group_name; + user_callback_ = callback; + return pool_->RequestSocket( + group_name, resolve_info, priority, this, &callback_); +} + +void ClientSocketHandle::Reset() { + ResetInternal(true); +} + +void ClientSocketHandle::ResetInternal(bool cancel) { + if (group_name_.empty()) // Was Init called? + return; + if (socket_.get()) { + // If we've still got a socket, release it back to the ClientSocketPool so + // it can be deleted or reused. + pool_->ReleaseSocket(group_name_, release_socket()); + } else if (cancel) { + // If we did not get initialized yet, so we've got a socket request pending. + // Cancel it. + pool_->CancelRequest(group_name_, this); + } + group_name_.clear(); + is_reused_ = false; + user_callback_ = NULL; +} + +LoadState ClientSocketHandle::GetLoadState() const { + CHECK(!is_initialized()); + CHECK(!group_name_.empty()); + return pool_->GetLoadState(group_name_, this); +} + +void ClientSocketHandle::OnIOComplete(int result) { + CHECK(ERR_IO_PENDING != result); + CompletionCallback* callback = user_callback_; + user_callback_ = NULL; + if (result != OK) + ResetInternal(false); // The request failed, so there's nothing to cancel. + callback->Run(result); +} + +} // namespace net |