1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_PROXY_PROXY_CONFIG_SERVICE_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_PROXY_PROXY_CONFIG_SERVICE_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92557749644f9d25af9721533322db19197c49b49Kristian Monsen#include "net/base/net_export.h"
102557749644f9d25af9721533322db19197c49b49Kristian Monsen
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ProxyConfig;
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Service for watching when the proxy settings have changed.
162557749644f9d25af9721533322db19197c49b49Kristian Monsenclass NET_EXPORT ProxyConfigService {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Indicates whether proxy configuration is valid, and if not, why.
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  enum ConfigAvailability {
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Configuration is pending, observers will be notified later.
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CONFIG_PENDING,
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Configuration is present and valid.
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CONFIG_VALID,
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // No configuration is set.
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CONFIG_UNSET
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Observer for being notified when the proxy settings have changed.
292557749644f9d25af9721533322db19197c49b49Kristian Monsen  class NET_EXPORT Observer {
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick   public:
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    virtual ~Observer() {}
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Notification callback that should be invoked by ProxyConfigService
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // implementors whenever the configuration changes. |availability| indicates
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // the new availability status and can be CONFIG_UNSET or CONFIG_VALID (in
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // which case |config| contains the configuration). Implementors must not
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // pass CONFIG_PENDING.
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void OnProxyConfigChanged(const ProxyConfig& config,
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      ConfigAvailability availability) = 0;
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~ProxyConfigService() {}
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Adds/Removes an observer that will be called whenever the proxy
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // configuration has changed.
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void AddObserver(Observer* observer) = 0;
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RemoveObserver(Observer* observer) = 0;
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Gets the most recent availability status. If a configuration is present,
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the proxy configuration is written to |config| and CONFIG_VALID is
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // returned. Returns CONFIG_PENDING if it is not available yet. In this case,
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // it is guaranteed that subscribed observers will be notified of a change at
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // some point in the future once the configuration is available.
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Note that to avoid re-entrancy problems, implementations should not
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // dispatch any change notifications from within this function.
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ConfigAvailability GetLatestProxyConfig(ProxyConfig* config) = 0;
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // ProxyService will call this periodically during periods of activity.
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // It can be used as a signal for polling-based implementations.
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  //
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Note that this is purely used as an optimization -- polling
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // implementations could simply set a global timer that goes off every
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // X seconds at which point they check for changes. However that has
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // the disadvantage of doing continuous work even during idle periods.
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void OnLazyPoll() {}
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_PROXY_PROXY_CONFIG_SERVICE_H_
70