diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-21 01:40:53 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-21 01:40:53 +0000 |
commit | f2cb3cf86e4217581443d93e863c891a05066e60 (patch) | |
tree | c62110d2347d17e1b1a1f57fa758cf8bba72548b /net/dns/single_request_host_resolver.cc | |
parent | b8512263f9556ac705394e9da03d364980f0eadf (diff) | |
download | chromium_src-f2cb3cf86e4217581443d93e863c891a05066e60.zip chromium_src-f2cb3cf86e4217581443d93e863c891a05066e60.tar.gz chromium_src-f2cb3cf86e4217581443d93e863c891a05066e60.tar.bz2 |
net: move host_resolver files from net/base to net/dns
BUG=70818
Review URL: https://codereview.chromium.org/12518036
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@189485 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/dns/single_request_host_resolver.cc')
-rw-r--r-- | net/dns/single_request_host_resolver.cc | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/net/dns/single_request_host_resolver.cc b/net/dns/single_request_host_resolver.cc new file mode 100644 index 0000000..e926e86 --- /dev/null +++ b/net/dns/single_request_host_resolver.cc @@ -0,0 +1,77 @@ +// Copyright (c) 2011 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/dns/single_request_host_resolver.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/compiler_specific.h" +#include "base/logging.h" +#include "net/base/net_errors.h" + +namespace net { + +SingleRequestHostResolver::SingleRequestHostResolver(HostResolver* resolver) + : resolver_(resolver), + cur_request_(NULL), + ALLOW_THIS_IN_INITIALIZER_LIST(callback_( + base::Bind(&SingleRequestHostResolver::OnResolveCompletion, + base::Unretained(this)))) { + DCHECK(resolver_ != NULL); +} + +SingleRequestHostResolver::~SingleRequestHostResolver() { + Cancel(); +} + +int SingleRequestHostResolver::Resolve( + const HostResolver::RequestInfo& info, AddressList* addresses, + const CompletionCallback& callback, const BoundNetLog& net_log) { + DCHECK(addresses); + DCHECK_EQ(false, callback.is_null()); + DCHECK(cur_request_callback_.is_null()) << "resolver already in use"; + + HostResolver::RequestHandle request = NULL; + + // We need to be notified of completion before |callback| is called, so that + // we can clear out |cur_request_*|. + CompletionCallback transient_callback = + callback.is_null() ? CompletionCallback() : callback_; + + int rv = resolver_->Resolve( + info, addresses, transient_callback, &request, net_log); + + if (rv == ERR_IO_PENDING) { + DCHECK_EQ(false, callback.is_null()); + // Cleared in OnResolveCompletion(). + cur_request_ = request; + cur_request_callback_ = callback; + } + + return rv; +} + +void SingleRequestHostResolver::Cancel() { + if (!cur_request_callback_.is_null()) { + resolver_->CancelRequest(cur_request_); + cur_request_ = NULL; + cur_request_callback_.Reset(); + } +} + +void SingleRequestHostResolver::OnResolveCompletion(int result) { + DCHECK(cur_request_); + DCHECK_EQ(false, cur_request_callback_.is_null()); + + CompletionCallback callback = cur_request_callback_; + + // Clear the outstanding request information. + cur_request_ = NULL; + cur_request_callback_.Reset(); + + // Call the user's original callback. + callback.Run(result); +} + +} // namespace net |