1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/base/host_resolver.h" 6 7 #include "base/compiler_specific.h" 8 #include "base/logging.h" 9 #include "net/base/net_errors.h" 10 11 namespace net { 12 13 SingleRequestHostResolver::SingleRequestHostResolver(HostResolver* resolver) 14 : resolver_(resolver), 15 cur_request_(NULL), 16 cur_request_callback_(NULL), 17 ALLOW_THIS_IN_INITIALIZER_LIST( 18 callback_(this, &SingleRequestHostResolver::OnResolveCompletion)) { 19 DCHECK(resolver_ != NULL); 20 } 21 22 SingleRequestHostResolver::~SingleRequestHostResolver() { 23 Cancel(); 24 } 25 26 int SingleRequestHostResolver::Resolve(const HostResolver::RequestInfo& info, 27 AddressList* addresses, 28 CompletionCallback* callback, 29 LoadLog* load_log) { 30 DCHECK(!cur_request_ && !cur_request_callback_) << "resolver already in use"; 31 32 HostResolver::RequestHandle request = NULL; 33 34 // We need to be notified of completion before |callback| is called, so that 35 // we can clear out |cur_request_*|. 36 CompletionCallback* transient_callback = callback ? &callback_ : NULL; 37 38 int rv = resolver_->Resolve( 39 info, addresses, transient_callback, &request, load_log); 40 41 if (rv == ERR_IO_PENDING) { 42 // Cleared in OnResolveCompletion(). 43 cur_request_ = request; 44 cur_request_callback_ = callback; 45 } 46 47 return rv; 48 } 49 50 void SingleRequestHostResolver::Cancel() { 51 if (cur_request_) { 52 resolver_->CancelRequest(cur_request_); 53 cur_request_ = NULL; 54 } 55 } 56 57 void SingleRequestHostResolver::OnResolveCompletion(int result) { 58 DCHECK(cur_request_ && cur_request_callback_); 59 60 CompletionCallback* callback = cur_request_callback_; 61 62 // Clear the outstanding request information. 63 cur_request_ = NULL; 64 cur_request_callback_ = NULL; 65 66 // Call the user's original callback. 67 callback->Run(result); 68 } 69 70 } // namespace net 71