// 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_SETTINGS_CROS_SETTINGS_PROVIDER_H_
#define CHROME_BROWSER_CHROMEOS_SETTINGS_CROS_SETTINGS_PROVIDER_H_

#include <string>

#include "base/callback.h"

namespace base {
class Value;
}

namespace chromeos {

class CrosSettingsProvider {
 public:
  // The callback type that is called to notify the CrosSettings observers
  // about a setting change.
  typedef base::Callback<void(const std::string&)> NotifyObserversCallback;

  // Possible results of a trusted check.
  enum TrustedStatus {
    // The trusted values were populated in the cache and can be accessed
    // until the next iteration of the message loop.
    TRUSTED,
    // Either a store or a load operation is in progress. The provided
    // callback will be invoked once the verification has finished.
    TEMPORARILY_UNTRUSTED,
    // The verification of the trusted store has failed permanently. The
    // client should assume this state final and further checks for
    // trustedness will fail at least until the browser restarts.
    PERMANENTLY_UNTRUSTED,
  };

  // Creates a new provider instance. |notify_cb| will be used to notify
  // about setting changes.
  explicit CrosSettingsProvider(const NotifyObserversCallback& notify_cb);
  virtual ~CrosSettingsProvider();

  // Sets |in_value| to given |path| in cros settings.
  void Set(const std::string& path, const base::Value& in_value);

  // Gets settings value of given |path| to |out_value|.
  virtual const base::Value* Get(const std::string& path) const = 0;

  // Requests the provider to fetch its values from a trusted store, if it
  // hasn't done so yet. Returns TRUSTED if the values returned by this provider
  // are trusted during the current loop cycle. Otherwise returns
  // TEMPORARILY_UNTRUSTED, and |callback| will be invoked later when trusted
  // values become available, PrepareTrustedValues() should be tried again in
  // that case. Returns PERMANENTLY_UNTRUSTED if a permanent error has occurred.
  virtual TrustedStatus PrepareTrustedValues(
      const base::Closure& callback) = 0;

  // Gets the namespace prefix provided by this provider.
  virtual bool HandlesSetting(const std::string& path) const = 0;

  void SetNotifyObserversCallback(const NotifyObserversCallback& notify_cb);

 protected:
  // Notifies the observers about a setting change.
  void NotifyObservers(const std::string& path);

 private:
  // Does the real job for Set().
  virtual void DoSet(const std::string& path,
                     const base::Value& in_value) = 0;

  // Callback used to notify about setting changes.
  NotifyObserversCallback notify_cb_;
};

}  // namespace chromeos

#endif  // CHROME_BROWSER_CHROMEOS_SETTINGS_CROS_SETTINGS_PROVIDER_H_
