// Copyright 2013 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 COMPONENTS_POLICY_CORE_COMMON_REGISTRY_DICT_H_ #define COMPONENTS_POLICY_CORE_COMMON_REGISTRY_DICT_H_ #include #include #include #include "base/macros.h" #include "base/strings/string16.h" #include "components/policy/policy_export.h" #if defined(OS_WIN) #include #endif namespace base { class Value; } namespace policy { class Schema; // Converts a value (as read from the registry) to meet |schema|, converting // types as necessary. Unconvertible types will show up as null values in the // result. std::unique_ptr POLICY_EXPORT ConvertRegistryValue(const base::Value& value, const Schema& schema); // A case-insensitive string comparison functor. struct POLICY_EXPORT CaseInsensitiveStringCompare { bool operator()(const std::string& a, const std::string& b) const; }; // In-memory representation of a registry subtree. Using a // base::DictionaryValue directly seems tempting, but that doesn't handle the // registry's case-insensitive-but-case-preserving semantics properly. class POLICY_EXPORT RegistryDict { public: using KeyMap = std::map, CaseInsensitiveStringCompare>; using ValueMap = std::map, CaseInsensitiveStringCompare>; RegistryDict(); ~RegistryDict(); // Returns a pointer to an existing key, NULL if not present. RegistryDict* GetKey(const std::string& name); const RegistryDict* GetKey(const std::string& name) const; // Sets a key. If |dict| is NULL, clears that key. void SetKey(const std::string& name, std::unique_ptr dict); // Removes a key. If the key doesn't exist, NULL is returned. std::unique_ptr RemoveKey(const std::string& name); // Clears all keys. void ClearKeys(); // Returns a pointer to a value, NULL if not present. base::Value* GetValue(const std::string& name); const base::Value* GetValue(const std::string& name) const; // Sets a value. If |value| is NULL, removes the value. void SetValue(const std::string& name, std::unique_ptr value); // Removes a value. If the value doesn't exist, NULL is returned. std::unique_ptr RemoveValue(const std::string& name); // Clears all values. void ClearValues(); // Merge keys and values from |other|, giving precedence to |other|. void Merge(const RegistryDict& other); // Swap with |other|. void Swap(RegistryDict* other); #if defined(OS_WIN) // Read a Windows registry subtree into this registry dictionary object. void ReadRegistry(HKEY hive, const base::string16& root); // Converts the dictionary to base::Value representation. For key/value name // collisions, the key wins. |schema| is used to determine the expected type // for each policy. // The returned object is either a base::DictionaryValue or a base::ListValue. std::unique_ptr ConvertToJSON(const class Schema& schema) const; #endif const KeyMap& keys() const { return keys_; } const ValueMap& values() const { return values_; } private: KeyMap keys_; ValueMap values_; DISALLOW_COPY_AND_ASSIGN(RegistryDict); }; } // namespace policy #endif // COMPONENTS_POLICY_CORE_COMMON_REGISTRY_DICT_H_