/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _REGISTRY_HXX_ #define _REGISTRY_HXX_ #ifdef _MSC_VER #pragma warning(push, 1) /* disable warnings within system headers */ #endif #include #ifdef _MSC_VER #pragma warning(pop) #endif #include #include #include #include "registryvalueimpl.hxx" //--------------------------------------- // forward declaration //--------------------------------------- class RegistryKeyImpl; //--------------------------------------- // typedefs //--------------------------------------- typedef std::auto_ptr RegistryKey; typedef std::vector StringList; typedef std::auto_ptr StringListPtr; //--------------------------------------- // //--------------------------------------- class RegistryKeyImpl { public: //############################################ // Destruction //############################################ virtual ~RegistryKeyImpl(); //############################################ // Queries //############################################ /** The name of the key at hand, maybe empty if this is any of the root keys */ std::wstring GetName() const; /** The number of sub values of the key at hand @precond IsOpen = true @throws */ virtual size_t GetSubValueCount() const = 0; /** The number of sub-keys of the key at hand @precond IsOpen = true @throws */ virtual size_t GetSubKeyCount() const = 0; bool IsOpen() const; /** Do we have write access on the key at hand */ bool IsWriteable() const; /** The StringList will be allocated on the heap, so this is in fact a transfer of ownership to the caller @precond IsOpen = true @throws RegistryIOException */ virtual StringListPtr GetSubKeyNames() const = 0; /** The StringList will be allocated on the heap, so this is in fact a transfer of ownership to the caller @precond IsOpen = true @throws RegistryIOException */ virtual StringListPtr GetSubValueNames() const = 0; /** Get the specified registry value @precond IsOpen = true */ virtual RegistryValue GetValue(const std::wstring& Name) const = 0; /** Get the specified registry value, return the given default value if value not found @precond IsOpen = true */ virtual RegistryValue GetValue(const std::wstring& Name, const RegistryValue& Default) const = 0; /** Convenience function to determine if the Registry key at hand has the specified value @precond IsOpen = true throws RegistryAccessDenyException */ bool HasValue(const std::wstring& Name) const; /** Convenience function to determine if the Registry key at hand has the specified sub-key @precond IsOpen = true throws RegistryAccessDenyException */ bool HasSubKey(const std::wstring& Name) const; //############################################ // Commands //############################################ /** Open the registry key, has no effect if the key is already open @precond IsOpen = false @throws RegistryWriteAccessDenyException RegistryAccessDenyException */ virtual void Open(bool Writeable = true) = 0; /** Close the registry key at hand, further using it without re-opening may cause RegistryIOExceptions to be thrown This is a template method that calls ImplClose which has to be overwritten by sub-classes */ void Close(); /** Open the specified sub-key of the registry key at hand @precond IsOpen = true HasSubKey(Name) = true @throws RegistryIOException RegistryKeyNotFoundException RegistryAccessDeniedException */ virtual RegistryKey OpenSubKey(const std::wstring& Name, bool Writeable = true) = 0; /** Creates a new sub-key below the key at hand @precond IsOpen = true IsWriteable = true @throws RegistryIOException RegistryWriteAccessDenyException */ virtual RegistryKey CreateSubKey(const std::wstring& Name) = 0; /** Deletes a sub-key below the key at hand, the key must not have sub-keys @precond IsOpen = true IsWriteable = true @throws RegistryIOException RegistryWriteAccessDenyException */ virtual void DeleteSubKey(const std::wstring& Name) = 0; /** Deletes a sub-key below the key at hand with all its sub-keys @precond IsOpen = true IsWriteable = true; @throws RegistryIOException RegistryWriteAccessDenyException */ virtual void DeleteSubKeyTree(const std::wstring& Name) = 0; /** Delete the specified value @precond IsOpen = true IsWriteable = true HasValue(Name) = true @throws RegistryIOException RegistryWriteAccessDeniedException RegistryValueNotFoundException */ virtual void DeleteValue(const std::wstring& Name) = 0; /** Set the specified registry value @precond IsOpen = true IsWriteable = true @throws RegistryIOException RegistryWriteAccessDenyException */ virtual void SetValue(const RegistryValue& Value) = 0; /** Copies the specified value from RegistryKey to the registry key at hand, if a value with this name already exist under the registry key at hand it will be overwritten @precond IsOpen = true IsWriteable = true RegistryKey.HasSubValue(Name) = true @throws RegistryIOException RegistryWriteAccessDeniedException RegistryValueNotFoundException */ virtual void CopyValue(const RegistryKey& RegistryKey, const std::wstring& Name); /** Copies the specified value from RegistryKey to the registry key at hand under a new name, if a value with this name already exist there it will be overwritten @precond IsOpen = true IsWriteable = true RegistryKey.HasSubValue(Name) = true @throws RegistryIOException RegistryWriteAccessDeniedException RegistryValueNotFoundException */ virtual void CopyValue(const RegistryKey& RegistryKey, const std::wstring& Name, const std::wstring& NewName); //############################################ // Creation // only possible through WindowsRegistry class //############################################ protected: /** Create instance of the specified Registry key @throws RegistryWriteAccessDenyException RegistryAccessDenyException RegistryKeyNotFoundException */ RegistryKeyImpl(HKEY RootKey, const std::wstring& KeyName); /** Create instance of the specified Registry key. RootKey should only one of the predefined keys HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS @throws RegistryWriteAccessDenyException RegistryAccessDenyException RegistryKeyNotFoundException */ RegistryKeyImpl(HKEY RootKey); /** Create an instances of the specified Registry key, the key is assumed to be already opened. */ RegistryKeyImpl(HKEY RootKey, HKEY SubKey, const std::wstring& KeyName, bool Writeable = true); /** Is this one of the root keys HKEY_CLASSES_ROOT HKEY_CURRENT_USER etc. */ bool IsRootKey() const; protected: HKEY m_hRootKey; HKEY m_hSubKey; std::wstring m_KeyName; bool m_IsWriteable; // prevent copy and assignment private: RegistryKeyImpl(const RegistryKeyImpl&); RegistryKeyImpl& operator=(const RegistryKeyImpl&); //###################################### // Friend declarations //###################################### friend class WindowsRegistry; }; #endif