Home | History | Annotate | Download | only in base
      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