// Copyright (c) 2011 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_EXTENSIONS_EXTENSION_SETTINGS_STORAGE_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_SETTINGS_STORAGE_H_ #pragma once #include <set> #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/values.h" // Interface for extension settings storage classes. // // All methods *must* be run on the FILE thread, inclusing construction and // destructions. class ExtensionSettingsStorage { public: // The result of an operation. // // Supports lightweight copying. class Result { public: // Ownership of |settings| and |changed_keys| taken. // |settings| may be NULL when the result is for an operation which // generates no setting values (e.g. Remove(), Clear()). // |changed_keys| may be NULL when the result is for an operation which // cannot change settings (e.g. Get()). Result(DictionaryValue* settings, std::set<std::string>* changed_keys); explicit Result(const std::string& error); ~Result(); // The dictionary result of the computation. NULL does not imply invalid; // HasError() should be used to test this. // Ownership remains with with the Result. DictionaryValue* GetSettings() const; // Gets the list of setting keys which changed as a result of the // computation. This includes all settings that existed and removed, all // settings which changed when set, and all setting keys cleared. // May be NULL for operations which cannot change settings, such as Get(). std::set<std::string>* GetChangedKeys() const; // Whether there was an error in the computation. If so, the results of // GetSettings and ReleaseSettings are not valid. bool HasError() const; // Gets the error message, if any. const std::string& GetError() const; private: struct Inner : public base::RefCountedThreadSafe<Inner> { // Empty error implies no error. Inner( DictionaryValue* settings, std::set<std::string>* changed_keys, const std::string& error); ~Inner(); const scoped_ptr<DictionaryValue> settings_; const scoped_ptr<std::set<std::string> > changed_keys_; const std::string error_; }; scoped_refptr<Inner> inner_; }; virtual ~ExtensionSettingsStorage() {} // Gets a single value from storage. // If successful, result maps the key to its value. virtual Result Get(const std::string& key) = 0; // Gets multiple values from storage. // If successful, result maps each key to its value. virtual Result Get(const std::vector<std::string>& keys) = 0; // Gets all values from storage. // If successful, result maps every key to its value. virtual Result Get() = 0; // Sets a single key to a new value. // If successful, result maps the key to the given value. virtual Result Set(const std::string& key, const Value& value) = 0; // Sets multiple keys to new values. // If successful, result is identical to the given dictionary. virtual Result Set(const DictionaryValue& values) = 0; // Removes a key from the storage. // If successful, result value is NULL. virtual Result Remove(const std::string& key) = 0; // Removes multiple keys from the storage. // If successful, result value is NULL. virtual Result Remove(const std::vector<std::string>& keys) = 0; // Clears the storage. // If successful, result value is NULL. virtual Result Clear() = 0; }; #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SETTINGS_STORAGE_H_