// Copyright (c) 2012 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_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_
#define CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_

#include <string>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/prefs/pref_change_registrar.h"
#include "chrome/browser/net/pref_proxy_config_tracker_impl.h"
#include "chromeos/network/network_state_handler_observer.h"
#include "components/onc/onc_constants.h"

namespace chromeos {

class NetworkState;

// Implementation of proxy config service for chromeos that:
// - extends PrefProxyConfigTrackerImpl (and so lives and runs entirely on UI
//   thread) to handle proxy from prefs (via PrefProxyConfigTrackerImpl) and
//   system i.e. network (via shill notifications)
// - exists one per profile and one per local state
// - persists proxy setting per network in flimflim
// - provides network stack with latest effective proxy configuration for
//   currently active network via PrefProxyConfigTrackerImpl's mechanism of
//   pushing config to ChromeProxyConfigService
class ProxyConfigServiceImpl : public PrefProxyConfigTrackerImpl,
                               public NetworkStateHandlerObserver {
 public:
  // ProxyConfigServiceImpl is created in ProxyServiceFactory::
  // CreatePrefProxyConfigTrackerImpl via Profile::GetProxyConfigTracker() for
  // profile or via IOThread constructor for local state and is owned by the
  // respective classes.
  //
  // The user's proxy config, proxy policies and proxy from prefs, are used to
  // determine the effective proxy config, which is then pushed through
  // PrefProxyConfigTrackerImpl to ChromeProxyConfigService to the
  // network stack.
  //
  // |profile_prefs| can be NULL if this object should only track prefs from
  // local state (e.g., for system request context or sigin-in screen).
  explicit ProxyConfigServiceImpl(PrefService* profile_prefs,
                                  PrefService* local_state_prefs);
  virtual ~ProxyConfigServiceImpl();

  // PrefProxyConfigTrackerImpl implementation.
  virtual void OnProxyConfigChanged(ProxyPrefs::ConfigState config_state,
                                    const net::ProxyConfig& config) OVERRIDE;

  // NetworkStateHandlerObserver implementation.
  virtual void DefaultNetworkChanged(const NetworkState* network) OVERRIDE;

 protected:
  friend class UIProxyConfigService;

  // Returns true if proxy is to be ignored for this network profile and
  // |onc_source|, e.g. this happens if the network is shared and
  // use-shared-proxies is turned off. |profile_prefs| may be NULL.
  static bool IgnoreProxy(const PrefService* profile_prefs,
                          const std::string network_profile_path,
                          onc::ONCSource onc_source);

 private:
  // Called when any proxy preference changes.
  void OnProxyPrefChanged();

  // Determines effective proxy config based on prefs from config tracker, the
  // current default network and if user is using shared proxies.  The effective
  // config is stored in |active_config_| and activated on network stack, and
  // hence, picked up by observers.
  void DetermineEffectiveConfigFromDefaultNetwork();

  // State of |active_config_|.  |active_config_| is only valid if
  // |active_config_state_| is not ProxyPrefs::CONFIG_UNSET.
  ProxyPrefs::ConfigState active_config_state_;

  // Active proxy configuration, which could be from prefs or network.
  net::ProxyConfig active_config_;

  // Track changes in profile preferences: UseSharedProxies and
  // OpenNetworkConfiguration.
  PrefChangeRegistrar profile_pref_registrar_;

  // Track changes in local state preferences: DeviceOpenNetworkConfiguration.
  PrefChangeRegistrar local_state_pref_registrar_;

  // Not owned. NULL if tracking only local state prefs (e.g. in the system
  // request context or sign-in screen).
  PrefService* profile_prefs_;

  // Not owned.
  PrefService* local_state_prefs_;

  base::WeakPtrFactory<ProxyConfigServiceImpl> pointer_factory_;

  DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceImpl);
};

}  // namespace chromeos

#endif  // CHROME_BROWSER_CHROMEOS_PROXY_CONFIG_SERVICE_IMPL_H_
