diff options
Diffstat (limited to 'setup_native/source/win32/customactions/reg4msdoc/userregistrar.cxx')
-rw-r--r-- | setup_native/source/win32/customactions/reg4msdoc/userregistrar.cxx | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/setup_native/source/win32/customactions/reg4msdoc/userregistrar.cxx b/setup_native/source/win32/customactions/reg4msdoc/userregistrar.cxx new file mode 100644 index 000000000000..68d3a1e2205d --- /dev/null +++ b/setup_native/source/win32/customactions/reg4msdoc/userregistrar.cxx @@ -0,0 +1,136 @@ +// UserRegistrar.cpp: Implementierung der Klasse UserRegistrar. +// +////////////////////////////////////////////////////////////////////// + +#include "userregistrar.hxx" +#include "registryvalueimpl.hxx" +#include "windowsregistry.hxx" +#include "registryexception.hxx" + +#ifdef _MSC_VER +#pragma warning(disable : 4350) +#endif + +//-------------------------------------- +/** +*/ +UserRegistrar::UserRegistrar(const RegistrationContextInformation& RegContext) : + Registrar(RegContext) +{ + RegistryKey RegKey = WindowsRegistry().GetCurrentUserKey(); + m_RootKey = RegKey->OpenSubKey(L"Software\\Classes"); +} + +//################################### +// Command +//################################### + +//-------------------------------------- +/** +*/ +void UserRegistrar::UnregisterAsHtmlEditorForInternetExplorer() const +{ + Registrar::UnregisterAsHtmlEditorForInternetExplorer(); + + DeleteHtmFileAssociationKeys(); + + try + { + RegistryKey RegKey = m_RootKey->OpenSubKey(L"Applications"); + if ((0 == RegKey->GetSubValueCount()) && (0 == RegKey->GetSubKeyCount())) + { + RegKey->Close(); + m_RootKey->DeleteSubKey(L"Applications"); + } + } + catch(RegistryKeyNotFoundException&) + { + } +} + +//-------------------------------------- +/** +*/ +void UserRegistrar::RegisterAsDefaultShellHtmlEditor() const +{ + RegistryKey LocalHtmKey = m_RootKey->CreateSubKey(L".htm"); + + if (!LocalHtmKey->HasValue(DEFAULT_VALUE_NAME)) + { + RegistryKey HKCRKey = WindowsRegistry().GetClassesRootKey(); + + if (HKCRKey->HasSubKey(L".htm")) + { + RegistryKey RootHtmKey = HKCRKey->OpenSubKey(L".htm", false); + + if (RootHtmKey->HasValue(DEFAULT_VALUE_NAME)) + { + RegistryValue RegVal = RootHtmKey->GetValue(DEFAULT_VALUE_NAME); + + std::wstring RootHtmFwdKey = RegVal->GetDataAsUniString(); + + if (HKCRKey->HasSubKey(RootHtmFwdKey)) + { + m_RootKey->CreateSubKey(RootHtmFwdKey); + LocalHtmKey->CopyValue(RootHtmKey, DEFAULT_VALUE_NAME); + } + } + } + } + + // calling base class method + Registrar::RegisterAsDefaultShellHtmlEditor(); +} + +//-------------------------------------- +/** +*/ +void UserRegistrar::UnregisterAsDefaultShellHtmlEditor() const +{ + // calling base class method + Registrar::UnregisterAsDefaultShellHtmlEditor(); + DeleteHtmFileAssociationKeys(); +} + +//-------------------------------------- +/** +*/ +void UserRegistrar::UnregisterForMsOfficeApplication( + const std::wstring& FileExtension) const +{ + /// calling base class method + Registrar::UnregisterForMsOfficeApplication(FileExtension); + + if (m_RootKey->HasSubKey(FileExtension)) + { + RegistryKey RegKey = m_RootKey->OpenSubKey(FileExtension); + + if ((0 == RegKey->GetSubKeyCount()) && (0 == RegKey->GetSubValueCount())) + { + RegKey->Close(); + m_RootKey->DeleteSubKey(FileExtension); + } + } +} + +//-------------------------------------- +/** +*/ +RegistryKey UserRegistrar::GetRootKeyForDefHtmlEditorForIERegistration() const +{ + return WindowsRegistry().GetCurrentUserKey(); +} + +//-------------------------------------- +/** +*/ +void UserRegistrar::DeleteHtmFileAssociationKeys() const +{ + // Later delete the created keys if they are empty and have not changed meanwhile. + // Remeber: if we create a new registry key in the user part of the + // registry, changes to that key via the merged key HKEY_CLASSES_ROOT + // go into the user branch HKEY_CURRENT_USER and are not visible for other users. + // so we must carefully detect if the keys have not changed in order to prevent accidentally + // deleting a key and so destroying existing associations + // See MSDN: "Merged View of HKEY_CLASSES_ROOT" +} |