/************************************************************** * * 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. * *************************************************************/ #include "register.hxx" #include "registryexception.hxx" #include "registrationcontextinformation.hxx" #include "userregistrar.hxx" #include "windowsregistry.hxx" #include "stringconverter.hxx" #include "msihelper.hxx" #ifdef _MSC_VER #pragma warning(push, 1) /* disable warnings within system headers */ #pragma warning(disable: 4917) #endif #include #ifdef _MSC_VER #pragma warning(pop) #endif #include #ifdef _MSC_VER #pragma warning(disable: 4350) #endif typedef std::auto_ptr RegistrarPtr; namespace /* private */ { RegistrarPtr CreateRegistrar(bool InstallForAllUser, const RegistrationContextInformation& RegCtx) { RegistrarPtr RegPtr; if (InstallForAllUser) RegPtr = RegistrarPtr(new Registrar(RegCtx)); else RegPtr = RegistrarPtr(new UserRegistrar(RegCtx)); return RegPtr; } } // namespace private bool query_preselect_registration_for_ms_application(MSIHANDLE handle, int Register) { bool preselect = false; try { RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle)); RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext); if (Register & MSWORD) preselect = CurrentRegistrar->QueryPreselectMsWordRegistration(); else if (Register & MSEXCEL) preselect = CurrentRegistrar->QueryPreselectMsExcelRegistration(); else if (Register & MSPOWERPOINT) preselect = CurrentRegistrar->QueryPreselectMsPowerPointRegistration(); } catch(RegistryException&) { assert(false); } return preselect; } //----------------------------------------- // registers OpenOffice for MS document // types and as default HTML editor if // specified //----------------------------------------- void Register4MsDoc(MSIHANDLE handle, int Register) { try { RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle)); RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext); if ((Register & MSWORD)) CurrentRegistrar->RegisterForMsWord(); if ((Register & MSEXCEL)) CurrentRegistrar->RegisterForMsExcel(); if ((Register & MSPOWERPOINT)) CurrentRegistrar->RegisterForMsPowerPoint(); if ((Register & HTML_EDITOR)) CurrentRegistrar->RegisterAsHtmlEditorForInternetExplorer(); if ((Register & DEFAULT_SHELL_HTML_EDITOR)) { CurrentRegistrar->RegisterAsDefaultHtmlEditorForInternetExplorer(); CurrentRegistrar->RegisterAsDefaultShellHtmlEditor(); } } catch(RegistryException&) { assert(false); } if (Register) SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); } void Unregister4MsDoc(MSIHANDLE handle, int Unregister) { try { RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle)); RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext); if ((Unregister & MSWORD) && CurrentRegistrar->IsRegisteredFor(MSWORD)) CurrentRegistrar->UnregisterForMsWord(); if ((Unregister & HTML_EDITOR) && CurrentRegistrar->IsRegisteredFor(HTML_EDITOR)) CurrentRegistrar->UnregisterAsHtmlEditorForInternetExplorer(); if ((Unregister & MSEXCEL) && CurrentRegistrar->IsRegisteredFor(MSEXCEL)) CurrentRegistrar->UnregisterForMsExcel(); if ((Unregister & MSPOWERPOINT) && CurrentRegistrar->IsRegisteredFor(MSPOWERPOINT)) CurrentRegistrar->UnregisterForMsPowerPoint(); if ((Unregister & DEFAULT_HTML_EDITOR_FOR_IE) && CurrentRegistrar->IsRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE)) CurrentRegistrar->UnregisterAsDefaultHtmlEditorForInternetExplorer(); if ((Unregister & DEFAULT_SHELL_HTML_EDITOR) && CurrentRegistrar->IsRegisteredFor(DEFAULT_SHELL_HTML_EDITOR)) CurrentRegistrar->UnregisterAsDefaultShellHtmlEditor(); } catch(RegistryException&) { assert(false); } if (Unregister) SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); } //----------------------------------------- // restores the entries for the selected // registry entries // Algorithm: // // 1. // Target key exist (e.g. '.doc') // Default value == soffice.? // Backup key != empty // Action: Replace Default value with backup // key // // 2. // Target key exist // Default value == soffice.? // Backup key == empty // Action: delete default value // // 3. // Target key exist // Default value != soffice.? // Action: nop // // 4. // Target key does not exist // Action: nop //----------------------------------------- void Unregister4MsDocAll(MSIHANDLE handle) { try { RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle)); RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext); CurrentRegistrar->UnregisterAllAndCleanUpRegistry(); } catch(RegistryException&) { assert(false); } } //----------------------------------------- // restores lost settings formerly made // with Register4MsDoc //----------------------------------------- void RepairRegister4MsDocSettings(MSIHANDLE handle) { try { RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle)); RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext); CurrentRegistrar->RepairRegistrationState(); } catch(RegistryException&) { assert(false); } } bool IsRegisteredFor(MSIHANDLE handle, int State) { bool Registered = false; try { RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle)); RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext); Registered = CurrentRegistrar->IsRegisteredFor(State); } catch(RegistryException&) { assert(false); } return Registered; } #define SO60_UNINSTALL_KEY L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\StarOffice 6.0" #define SO_BACKUP_KEY L"soffice6.bak" #define REGMSDOCSTATE L"Reg4MsDocState" #define SOFTWARE_CLASSES L"Software\\Classes" int FixReturnRegistrationState(MSIHANDLE handle) { int registration_state = 0; try { WindowsRegistry registry; RegistryValue rv_regmsdocstate = RegistryValue( new RegistryValueImpl(REGMSDOCSTATE, 0)); RegistryKey so_bak_key; if (IsAllUserInstallation(handle)) { RegistryKey hkcr_key = registry.GetClassesRootKey(); if (hkcr_key->HasSubKey(SO_BACKUP_KEY)) so_bak_key = hkcr_key->OpenSubKey(SO_BACKUP_KEY); else so_bak_key = hkcr_key->CreateSubKey(SO_BACKUP_KEY); if (!so_bak_key->HasValue(REGMSDOCSTATE)) { // set a defined value so_bak_key->SetValue(rv_regmsdocstate); RegistryKey hklm_key = registry.GetLocalMachineKey(); if (hklm_key->HasSubKey(SO60_UNINSTALL_KEY)) { RegistryKey so_uninst_key = hklm_key->OpenSubKey(SO60_UNINSTALL_KEY); if (so_uninst_key->HasValue(REGMSDOCSTATE)) so_bak_key->CopyValue(so_uninst_key, REGMSDOCSTATE); } } } else { RegistryKey hkcu_classes_key = registry.GetCurrentUserKey()->OpenSubKey(SOFTWARE_CLASSES); so_bak_key = hkcu_classes_key->CreateSubKey(SO_BACKUP_KEY); if (!so_bak_key->HasValue(REGMSDOCSTATE)) { // set a defined value so_bak_key->SetValue(rv_regmsdocstate); RegistryKey hklm_sftw_classes = registry.GetLocalMachineKey()->OpenSubKey(SOFTWARE_CLASSES, false); RegistryKey so_bak_key_old; if (hklm_sftw_classes->HasSubKey(SO_BACKUP_KEY)) { so_bak_key_old = hklm_sftw_classes->OpenSubKey(SO_BACKUP_KEY, false); if (so_bak_key_old->HasValue(REGMSDOCSTATE)) so_bak_key->CopyValue(so_bak_key_old, REGMSDOCSTATE); } else // try the uninstall key { RegistryKey hklm_key = registry.GetLocalMachineKey(); if (hklm_key->HasSubKey(SO60_UNINSTALL_KEY)) { RegistryKey so_uninst_key = hklm_key->OpenSubKey(SO60_UNINSTALL_KEY); if (so_uninst_key->HasValue(REGMSDOCSTATE)) so_bak_key->CopyValue(so_uninst_key, REGMSDOCSTATE); } } } } rv_regmsdocstate = so_bak_key->GetValue(REGMSDOCSTATE); registration_state = rv_regmsdocstate->GetDataAsInt(); } catch(RegistryException&) { registration_state = 0; } return registration_state; }