1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2011 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
16b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
17c45688bb3881f0c2216e6ec0e19ebda0be33e871Ben Chan#ifndef SHILL_RESOLVER_H_
18c45688bb3881f0c2216e6ec0e19ebda0be33e871Ben Chan#define SHILL_RESOLVER_H_
19b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
20ed2c28c6e3c0bc2f9d8832fee083868304178f08Hristo Stefanov#include <string>
21ed2c28c6e3c0bc2f9d8832fee083868304178f08Hristo Stefanov#include <vector>
22ed2c28c6e3c0bc2f9d8832fee083868304178f08Hristo Stefanov
23a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/files/file_path.h>
240d2ada3971075e78fb9900d0753c9ad94c15add4Paul Stewart#include <base/lazy_instance.h>
25b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart#include <base/memory/ref_counted.h>
26b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
27b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart#include "shill/refptr_types.h"
28b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
29b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartnamespace shill {
30b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
31b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart// This provides a static function for dumping the DNS information out
32b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart// of an ipconfig into a "resolv.conf" formatted file.
33b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewartclass Resolver {
34b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart public:
354d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  // The default comma-separated list of search-list prefixes that
364d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  // should be ignored when writing out a DNS configuration.  These
374d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  // are usually preconfigured by a DHCP server and are not of real
384d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  // value to the user.  This will release DNS bandwidth for searches
394d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  // we expect will have a better chance of getting what the user is
404d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  // looking for.
414d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  static const char kDefaultIgnoredSearchList[];
424d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart
430d2ada3971075e78fb9900d0753c9ad94c15add4Paul Stewart  virtual ~Resolver();
440d2ada3971075e78fb9900d0753c9ad94c15add4Paul Stewart
45f407d5934100e6f2106aeeede46bafb0074cee35mukesh agrawal  // Since this is a singleton, use Resolver::GetInstance()->Foo().
461a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  static Resolver* GetInstance();
47b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
481a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  virtual void set_path(const base::FilePath& path) { path_ = path; }
49b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
506f65c0b387f6dde8113f52745b758ca1c4f349bePaul Stewart  // Install domain name service parameters, given a list of
5123ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal  // DNS servers in |dns_servers|, and a list of DNS search suffixes in
5223ac6b72d44c446bca88175883ba26b39c5ed817mukesh agrawal  // |domain_search|.
531a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart  virtual bool SetDNSFromLists(const std::vector<std::string>& dns_servers,
541a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart                               const std::vector<std::string>& domain_search);
55b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
56bf667617d573e3af4b808ed317b1d6ca04747ee4Paul Stewart  // Remove any created domain name service file.
57dd60e4549cc8898f7f517283eacc58f67570bd1fPaul Stewart  virtual bool ClearDNS();
58b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
594d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  // Sets the list of ignored DNS search suffixes.  This list will be used
604d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  // to filter the domain_search parameter of later SetDNSFromLists() calls.
614d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  virtual void set_ignored_search_list(
621a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart      const std::vector<std::string>& ignored_list) {
634d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart    ignored_search_list_ = ignored_list;
644d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  }
654d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart
660d2ada3971075e78fb9900d0753c9ad94c15add4Paul Stewart protected:
670d2ada3971075e78fb9900d0753c9ad94c15add4Paul Stewart  Resolver();
680d2ada3971075e78fb9900d0753c9ad94c15add4Paul Stewart
69b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart private:
700d2ada3971075e78fb9900d0753c9ad94c15add4Paul Stewart  friend struct base::DefaultLazyInstanceTraits<Resolver>;
71b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  friend class ResolverTest;
72b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
730e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulk  base::FilePath path_;
744d5efb7d5d130e3e6e52ab732127a273bcb95261Paul Stewart  std::vector<std::string> ignored_search_list_;
75b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
76b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart  DISALLOW_COPY_AND_ASSIGN(Resolver);
77b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart};
78b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
79b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart}  // namespace shill
80b6063942a712bc2825e78dc026a24a5d7b6131fcPaul Stewart
81c45688bb3881f0c2216e6ec0e19ebda0be33e871Ben Chan#endif  // SHILL_RESOLVER_H_
82