diff options
Diffstat (limited to 'setup_native/source/win32/customactions/reg4msdoc/registry.cxx')
-rw-r--r-- | setup_native/source/win32/customactions/reg4msdoc/registry.cxx | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/setup_native/source/win32/customactions/reg4msdoc/registry.cxx b/setup_native/source/win32/customactions/reg4msdoc/registry.cxx new file mode 100644 index 000000000000..2572a3a2d287 --- /dev/null +++ b/setup_native/source/win32/customactions/reg4msdoc/registry.cxx @@ -0,0 +1,242 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "registry.hxx" + +#include <Shlwapi.h> +#include <assert.h> +#include <algorithm> + +#ifdef _MSC_VER +#pragma warning(disable : 4786 4350) +#endif + +//----------------------------------------------------- +/** Create instance and open the specified Registry key + + @throws RegistryWriteAccessDenyException + RegistryAccessDenyException + RegistryKeyNotFoundException +*/ +RegistryKeyImpl::RegistryKeyImpl(HKEY RootKey, const std::wstring& KeyName) : + m_hRootKey(RootKey), + m_hSubKey(0), + m_KeyName(KeyName), + m_IsWriteable(false) +{ +} + +//----------------------------------------------------- +/** Create instance and open the specified Registry key + + @throws RegistryWriteAccessDenyException + RegistryAccessDenyException + RegistryKeyNotFoundException +*/ +RegistryKeyImpl::RegistryKeyImpl(HKEY RootKey) : + m_hRootKey(RootKey), + m_hSubKey(0), + m_IsWriteable(false) +{ +} + +//----------------------------------------------------- +/** Create an instances of the specified Registry key, + the key is assumed to be already opened. +*/ +RegistryKeyImpl::RegistryKeyImpl(HKEY RootKey, HKEY SubKey, const std::wstring& KeyName, bool Writeable) : + m_hRootKey(RootKey), + m_hSubKey(SubKey), + m_KeyName(KeyName), + m_IsWriteable(Writeable) +{ +} + +//----------------------------------------------------- +/** +*/ +RegistryKeyImpl::~RegistryKeyImpl() +{ + if (IsOpen()) + Close(); +} + + +//############################################ +// Queries +//############################################ + + +//----------------------------------------------------- +/** The name of the key at hand, maybe empty + if this is any of the root keys +*/ +std::wstring RegistryKeyImpl::GetName() const +{ + return m_KeyName; +} + +//----------------------------------------------------- +/** +*/ +bool RegistryKeyImpl::IsOpen() const +{ + return m_hSubKey != 0; +} + +//----------------------------------------------------- +/** Is this one of the root keys + HKEY_CLASSES_ROOT + HKEY_CURRENT_USER + etc. +*/ +bool RegistryKeyImpl::IsRootKey() const +{ + return (0 == m_KeyName.length()); +} + +//----------------------------------------------------- +/** Do we have write access on the key at hand +*/ +bool RegistryKeyImpl::IsWriteable() const +{ + return m_IsWriteable; +} + +//----------------------------------------------------- +/** Convenience function to determine if the + Registry key at hand has the specified + value + + @precond IsOpen = true + + throws RegistryAccessDenyException +*/ +bool RegistryKeyImpl::HasValue(const std::wstring& Name) const +{ + StringListPtr names = GetSubValueNames(); + + StringList::iterator iter_end = names->end(); + StringList::iterator iter = std::find(names->begin(), iter_end, Name); + + return (iter != iter_end); +} + +struct CompareNamesCaseInsensitive +{ + CompareNamesCaseInsensitive(const std::wstring& Name) : + name_(Name) + {} + + bool operator() (const std::wstring& value) + { + return (0 == StrCmpI(value.c_str(), name_.c_str())); + } + + std::wstring name_; +}; + +//----------------------------------------------------- +/** Convenience function to determine if the + Registry key at hand has the specified + sub-key + + @precond IsOpen = true + + throws RegistryAccessDenyException +*/ +bool RegistryKeyImpl::HasSubKey(const std::wstring& Name) const +{ + StringListPtr names = GetSubKeyNames(); + + StringList::iterator iter_end = names->end(); + StringList::iterator iter = std::find_if(names->begin(), iter_end, CompareNamesCaseInsensitive(Name)); + + return (iter != iter_end); +} + +//----------------------------------------------------- +/** +*/ +void RegistryKeyImpl::Close() +{ + if (RegCloseKey(m_hSubKey) != ERROR_SUCCESS) { + assert(false); + } + + m_hSubKey = 0; + m_IsWriteable = false; +} + +//----------------------------------------------------- +/** 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 +*/ +void RegistryKeyImpl::CopyValue(const RegistryKey& RegistryKey, const std::wstring& Name) +{ + assert(RegistryKey->HasValue(Name)); +#ifdef __MINGW32__ + SetValue((const RegistryValue&)(RegistryKey->GetValue(Name))); +#else + SetValue(RegistryKey->GetValue(Name)); +#endif + assert(HasValue(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 +*/ +void RegistryKeyImpl::CopyValue(const RegistryKey& RegistryKey, const std::wstring& Name, const std::wstring& NewName) +{ + assert(RegistryKey->HasValue(Name)); + + RegistryValue RegVal = RegistryKey->GetValue(Name); + RegVal->SetName(NewName); + SetValue(RegVal); + + assert(HasValue(NewName)); +} |