text: // Copyright 2015 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.
  
  #ifndef NET_DNS_MOJO_HOST_RESOLVER_IMPL_H_
  #define NET_DNS_MOJO_HOST_RESOLVER_IMPL_H_
  
  #include <list>
  #include <memory>
  
  #include "base/macros.h"
  #include "base/threading/thread_checker.h"
  #include "net/interfaces/host_resolver_service.mojom.h"
  #include "net/log/net_log_with_source.h"
  
  namespace net {
  
  class HostResolver;
  
  // MojoHostResolverImpl handles mojo host resolution requests. Inbound Mojo
  // requests are sent to the HostResolver passed into the constructor. When
  // destroyed, any outstanding resolver requests are cancelled. If a request's
  // HostResolverRequestClient is shut down, the associated resolver request is
  // cancelled.
  class MojoHostResolverImpl {
   public:
    // |resolver| is expected to outlive |this|.
    MojoHostResolverImpl(net::HostResolver* resolver,
                         const NetLogWithSource& net_log);
    ~MojoHostResolverImpl();
  
    void Resolve(std::unique_ptr<HostResolver::RequestInfo> request_info,
                 interfaces::HostResolverRequestClientPtr client);
  
    bool request_in_progress() { return !pending_jobs_.empty(); }
  
   private:
    class Job;
  
    // Removes |job| from the set of pending jobs.
    void DeleteJob(std::list<Job>::iterator job);
  
    // Resolver for resolving incoming requests. Not owned.
    net::HostResolver* resolver_;
  
    // The NetLogWithSource to be passed to |resolver_| for all requests.
    const NetLogWithSource net_log_;
  
    // All pending jobs, so they can be cancelled when this service is destroyed.
    std::list<Job> pending_jobs_;
  
    base::ThreadChecker thread_checker_;
  
    DISALLOW_COPY_AND_ASSIGN(MojoHostResolverImpl);
  };
  
  }  // namespace net
  
  #endif  // NET_DNS_MOJO_HOST_RESOLVER_IMPL_H_
  