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