// Copyright (c) 2012 The Chromium OS 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 SHILL_RESOLVER_
#define SHILL_RESOLVER_

#include <string>
#include <vector>

#include <base/file_path.h>
#include <base/lazy_instance.h>
#include <base/memory/ref_counted.h>

#include "shill/refptr_types.h"

namespace shill {

// This provides a static function for dumping the DNS information out
// of an ipconfig into a "resolv.conf" formatted file.
class Resolver {
 public:
  enum TimeoutParameters {
    kDefaultTimeout,
    kShortTimeout
  };

  // The default comma-separated list of search-list prefixes that
  // should be ignored when writing out a DNS configuration.  These
  // are usually preconfigured by a DHCP server and are not of real
  // value to the user.  This will release DNS bandwidth for searches
  // we expect will have a better chance of getting what the user is
  // looking for.
  static const char kDefaultIgnoredSearchList[];

  // The default comma-separated list of technologies for which short
  // DNS timeouts should be enabled.
  static const char kDefaultShortTimeoutTechnologies[];

  virtual ~Resolver();

  // Since this is a singleton, use Resolver::GetInstance()->Foo()
  static Resolver *GetInstance();

  virtual void set_path(const FilePath &path) { path_ = path; }

  // Install domain name service parameters, given a list of
  // DNS servers in |dns_servers|, a list of DNS search suffixes in
  // |domain_search| and a DNS timeout parameter in |timeout|.
  virtual bool SetDNSFromLists(const std::vector<std::string> &dns_servers,
                               const std::vector<std::string> &domain_search,
                               TimeoutParameters timeout);

  // Remove any created domain name service file.
  virtual bool ClearDNS();

  // Sets the list of ignored DNS search suffixes.  This list will be used
  // to filter the domain_search parameter of later SetDNSFromLists() calls.
  virtual void set_ignored_search_list(
      const std::vector<std::string> &ignored_list) {
    ignored_search_list_ = ignored_list;
  }

 protected:
  Resolver();

 private:
  friend struct base::DefaultLazyInstanceTraits<Resolver>;
  friend class ResolverTest;

  static const char kDefaultTimeoutOptions[];
  static const char kShortTimeoutOptions[];

  FilePath path_;
  std::vector<std::string> ignored_search_list_;

  DISALLOW_COPY_AND_ASSIGN(Resolver);
};

}  // namespace shill

#endif  // SHILL_RESOLVER_
