1// Copyright (c) 2011 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#ifndef NET_PROXY_POLLING_PROXY_CONFIG_SERVICE_H_
6#define NET_PROXY_POLLING_PROXY_CONFIG_SERVICE_H_
7
8#include "base/compiler_specific.h"
9#include "base/memory/ref_counted.h"
10#include "base/time/time.h"
11#include "net/proxy/proxy_config_service.h"
12
13namespace net {
14
15// PollingProxyConfigService is a base class for creating ProxyConfigService
16// implementations that use polling to notice when settings have change.
17//
18// It runs code to get the current proxy settings on a background worker
19// thread, and notifies registered observers when the value changes.
20class NET_EXPORT_PRIVATE PollingProxyConfigService : public ProxyConfigService {
21 public:
22  // ProxyConfigService implementation:
23  virtual void AddObserver(Observer* observer) OVERRIDE;
24  virtual void RemoveObserver(Observer* observer) OVERRIDE;
25  virtual ConfigAvailability GetLatestProxyConfig(ProxyConfig* config) OVERRIDE;
26  virtual void OnLazyPoll() OVERRIDE;
27
28 protected:
29  // Function for retrieving the current proxy configuration.
30  // Implementors must be threadsafe as the function will be invoked from
31  // worker threads.
32  typedef void (*GetConfigFunction)(ProxyConfig*);
33
34  // Creates a polling-based ProxyConfigService which will test for new
35  // settings at most every |poll_interval| time by calling |get_config_func|
36  // on a worker thread.
37  PollingProxyConfigService(
38      base::TimeDelta poll_interval,
39      GetConfigFunction get_config_func);
40
41  virtual ~PollingProxyConfigService();
42
43  // Polls for changes by posting a task to the worker pool.
44  void CheckForChangesNow();
45
46 private:
47  class Core;
48  scoped_refptr<Core> core_;
49
50  DISALLOW_COPY_AND_ASSIGN(PollingProxyConfigService);
51};
52
53}  // namespace net
54
55#endif  // NET_PROXY_POLLING_PROXY_CONFIG_SERVICE_H_
56