summaryrefslogtreecommitdiffstats
path: root/net/dns/single_request_host_resolver.cc
diff options
context:
space:
mode:
authorphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-21 01:40:53 +0000
committerphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-21 01:40:53 +0000
commitf2cb3cf86e4217581443d93e863c891a05066e60 (patch)
treec62110d2347d17e1b1a1f57fa758cf8bba72548b /net/dns/single_request_host_resolver.cc
parentb8512263f9556ac705394e9da03d364980f0eadf (diff)
downloadchromium_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.cc77
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