Index: chrome/browser/net/dns_probe_runner.h |
diff --git a/chrome/browser/net/dns_probe_runner.h b/chrome/browser/net/dns_probe_runner.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e41b6d221db6150e1bef2158a8f844d88c957cfa |
--- /dev/null |
+++ b/chrome/browser/net/dns_probe_runner.h |
@@ -0,0 +1,85 @@ |
+// Copyright (c) 2013 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 CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_ |
+#define CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_ |
+ |
+#include "base/basictypes.h" |
+#include "base/bind.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
+ |
+namespace net { |
+class DnsClient; |
+class DnsResponse; |
+class DnsTransaction; |
+} |
+ |
+namespace chrome_browser_net { |
+ |
+// Runs DNS probes using a single DnsClient and evaluates the responses. |
+// (Currently requests A records for google.com and expects at least one IP |
+// address in the response.) |
+// Used by DnsProbeService to probe the system and public DNS configurations. |
+class DnsProbeRunner { |
+ public: |
+ static const char* kKnownGoodHostname; |
+ |
+ // Used in histograms; add new entries at the bottom, and don't remove any. |
+ enum Result { |
+ UNKNOWN, |
+ CORRECT, // Response contains at least one A record. |
+ INCORRECT, // Response claimed success but included no A records. |
+ FAILING, // Response included an error or was malformed. |
+ UNREACHABLE // No response received (timeout, network unreachable, etc.). |
+ }; |
+ |
+ DnsProbeRunner(); |
+ ~DnsProbeRunner(); |
+ |
+ // Sets the DnsClient that will be used for DNS probes sent by this runner. |
+ // Must be called before RunProbe; can be called repeatedly, including during |
+ // a probe. It will not affect an in-flight probe, if one is running. |
+ void SetClient(scoped_ptr<net::DnsClient> client); |
+ |
+ // Starts a probe using the client specified with SetClient, which must have |
+ // been called before RunProbe. |callback| will be called asynchronously |
+ // when the result is ready, even if it is ready synchronously. Must not |
+ // be called again until the callback is called, but may be called during the |
+ // callback. |
+ void RunProbe(const base::Closure& callback); |
+ |
+ // Returns true if a probe is running. Guaranteed to return true after |
+ // RunProbe returns, and false during and after the callback. |
+ bool IsRunning() const; |
+ |
+ // Returns the result of the last probe. |
+ Result result() const { return result_; } |
+ |
+ private: |
+ void OnTransactionComplete(net::DnsTransaction* transaction, |
+ int net_error, |
+ const net::DnsResponse* response); |
+ void CallCallback(); |
+ |
+ base::WeakPtrFactory<DnsProbeRunner> weak_factory_; |
+ |
+ scoped_ptr<net::DnsClient> client_; |
+ |
+ // The callback passed to |RunProbe|. Cleared right before calling the |
+ // callback. |
+ base::Closure callback_; |
+ |
+ // The transaction started in |RunProbe| for the DNS probe. Reset once the |
+ // results have been examined. |
+ scoped_ptr<net::DnsTransaction> transaction_; |
+ |
+ Result result_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DnsProbeRunner); |
+}; |
+ |
+} // namespace chrome_browser_net |
+ |
+#endif // CHROME_BROWSER_NET_DNS_PROBE_RUNNER_H_ |