summaryrefslogtreecommitdiff
path: root/setup_native/source/win32/customactions/reg4msdoc/register.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'setup_native/source/win32/customactions/reg4msdoc/register.cxx')
-rw-r--r--setup_native/source/win32/customactions/reg4msdoc/register.cxx340
1 files changed, 340 insertions, 0 deletions
diff --git a/setup_native/source/win32/customactions/reg4msdoc/register.cxx b/setup_native/source/win32/customactions/reg4msdoc/register.cxx
new file mode 100644
index 000000000000..77d091806acd
--- /dev/null
+++ b/setup_native/source/win32/customactions/reg4msdoc/register.cxx
@@ -0,0 +1,340 @@
+/*************************************************************************
+ *
+ * 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 "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 <shlobj.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+
+#include <assert.h>
+#ifdef _MSC_VER
+#pragma warning(disable: 4350)
+#endif
+
+typedef std::auto_ptr<Registrar> 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 StarOffice 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;
+}
+