summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tlillqvist@novell.com>2011-04-05 16:32:59 +0300
committerTor Lillqvist <tlillqvist@novell.com>2011-04-05 16:34:13 +0300
commitd415d68aae23c8e27f839f082a180440824e3e5f (patch)
tree0a2bb70cb5278867a3a633cbc217d956d0152ed3
parent7420b551ed82e270bbe566c812344c0f1fd4eaa5 (diff)
bnc#530872: Save old associations for MS doc types when installing
Then restore them, if still relevant, when uninstalling LibreOffice. git log from build repository: commit 1737ec9b6675cc7e30df03fa5537012a429425bb Author: Tor Lillqvist <tlillqvist@novell.com> Date: Thu Oct 14 15:28:55 2010 +0300 Make win32-restore-associations.diff apply again commit 72a25ab4a055cd1d3cf5aec627cfe120113bfb34 Author: Tor Lillqvist <tlillqvist@novell.com> Date: Thu May 20 10:34:24 2010 +0300 Make patches apply for a Windows build commit d635f716a75d8c1648eab0c1d598b390be8c4f07 Author: Tor Lillqvist <tlillqvist@novell.com> Date: Thu Sep 17 22:16:40 2009 +0300 Add new patch to restore MSO file associations on uninstall * patches/dev300/apply: Add it to Win32Only * patches/dev300/win32-restore-associations.diff: New file. Save previous associations of the MS Office file formats on installation of OOo. On uninstallation of OOo, restore them. Still a bit experimental, but seems to work.
-rw-r--r--setup_native/source/win32/customactions/reg4allmsdoc/exports.dxp3
-rw-r--r--setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx136
2 files changed, 138 insertions, 1 deletions
diff --git a/setup_native/source/win32/customactions/reg4allmsdoc/exports.dxp b/setup_native/source/win32/customactions/reg4allmsdoc/exports.dxp
index 566981ba569e..54ebb2f675f4 100644
--- a/setup_native/source/win32/customactions/reg4allmsdoc/exports.dxp
+++ b/setup_native/source/win32/customactions/reg4allmsdoc/exports.dxp
@@ -1,3 +1,4 @@
FindRegisteredExtensions
LookForRegisteredExtensions
-RegisterSomeExtensions \ No newline at end of file
+RegisterSomeExtensions
+RestoreRegAllMSDoc
diff --git a/setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx b/setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx
index 54a40cd08d8f..7b9cfc992245 100644
--- a/setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx
+++ b/setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx
@@ -213,6 +213,9 @@ static LONG DeleteSubKeyTree( HKEY RootKey, LPCSTR lpKey )
return rc;
}
+// Unused
+#if 0
+
//----------------------------------------------------------
static BOOL RemoveExtensionInRegistry( LPCSTR lpSubKey )
{
@@ -263,6 +266,8 @@ static BOOL RemoveExtensionInRegistry( LPCSTR lpSubKey )
return ( ERROR_SUCCESS == lResult );
}
+#endif
+
//----------------------------------------------------------
bool GetMsiProp( MSIHANDLE handle, LPCSTR name, /*out*/std::string& value )
{
@@ -307,11 +312,59 @@ static void registerForExtension( MSIHANDLE handle, const int nIndex, bool bRegi
}
//----------------------------------------------------------
+static void saveOldRegistration( LPCSTR lpSubKey )
+{
+ BOOL bRet = false;
+ HKEY hKey = NULL;
+ LONG lResult = RegOpenKeyExA( HKEY_CLASSES_ROOT, lpSubKey, 0,
+ KEY_QUERY_VALUE|KEY_SET_VALUE, &hKey );
+
+ if ( ERROR_SUCCESS == lResult )
+ {
+ CHAR szBuffer[1024];
+ DWORD nSize = sizeof( szBuffer );
+
+ lResult = RegQueryValueExA( hKey, "", NULL, NULL, (LPBYTE)szBuffer, &nSize );
+ if ( ERROR_SUCCESS == lResult )
+ {
+ szBuffer[nSize] = '\0';
+
+ // No need to save assocations for our own types
+ if ( strncmp( szBuffer, "OpenOffice.org.", 15 ) != 0 )
+ {
+ // Save the old association
+ RegSetValueExA( hKey, "OOoBackupAssociation", 0,
+ REG_SZ, (LPBYTE)szBuffer, nSize );
+ // Also save what the old association means, just so we can try to verify
+ // if/when restoring it that the old application still exists
+ HKEY hKey2 = NULL;
+ lResult = RegOpenKeyExA( HKEY_CLASSES_ROOT, szBuffer, 0,
+ KEY_QUERY_VALUE, &hKey2 );
+ if ( ERROR_SUCCESS == lResult )
+ {
+ nSize = sizeof( szBuffer );
+ lResult = RegQueryValueExA( hKey2, "", NULL, NULL, (LPBYTE)szBuffer, &nSize );
+ if ( ERROR_SUCCESS == lResult )
+ {
+ RegSetValueExA( hKey, "OOoBackupAssociationDeref", 0,
+ REG_SZ, (LPBYTE)szBuffer, nSize );
+ }
+ RegCloseKey( hKey2 );
+ }
+ }
+ }
+ RegCloseKey( hKey );
+ }
+}
+
+//----------------------------------------------------------
static void registerForExtensions( MSIHANDLE handle, BOOL bRegisterAll )
{ // Check all file extensions
int nIndex = 0;
while ( g_Extensions[nIndex] != 0 )
{
+ saveOldRegistration( g_Extensions[nIndex] );
+
BOOL bRegister = bRegisterAll || CheckExtensionInRegistry( g_Extensions[nIndex] );
if ( bRegister )
registerForExtension( handle, nIndex, true );
@@ -478,6 +531,10 @@ extern "C" UINT __stdcall RegisterSomeExtensions( MSIHANDLE handle )
}
//----------------------------------------------------------
+//
+// This is the (slightly misleadinly named) entry point for the
+// custom action called Regallmsdocdll.
+//
extern "C" UINT __stdcall FindRegisteredExtensions( MSIHANDLE handle )
{
if ( IsSetMsiProp( handle, "FILETYPEDIALOGUSED" ) )
@@ -514,7 +571,12 @@ extern "C" UINT __stdcall FindRegisteredExtensions( MSIHANDLE handle )
return ERROR_SUCCESS;
}
+#if 0
+
//----------------------------------------------------------
+//
+// This entry is not called for any custom action.
+//
extern "C" UINT __stdcall DeleteRegisteredExtensions( MSIHANDLE /*handle*/ )
{
OutputDebugStringFormat( "DeleteRegisteredExtensions\n" );
@@ -530,4 +592,78 @@ extern "C" UINT __stdcall DeleteRegisteredExtensions( MSIHANDLE /*handle*/ )
return ERROR_SUCCESS;
}
+#endif
+
+//----------------------------------------------------------
+static void restoreOldRegistration( LPCSTR lpSubKey )
+{
+ BOOL bRet = false;
+ HKEY hKey = NULL;
+ LONG lResult = RegOpenKeyExA( HKEY_CLASSES_ROOT, lpSubKey, 0,
+ KEY_QUERY_VALUE|KEY_SET_VALUE, &hKey );
+
+ if ( ERROR_SUCCESS == lResult )
+ {
+ CHAR szBuffer[1024];
+ DWORD nSize = sizeof( szBuffer );
+
+ lResult = RegQueryValueExA( hKey, "OOoBackupAssociation", NULL, NULL,
+ (LPBYTE)szBuffer, &nSize );
+ if ( ERROR_SUCCESS == lResult )
+ {
+ HKEY hKey2 = NULL;
+ lResult = RegOpenKeyExA( HKEY_CLASSES_ROOT, szBuffer, 0,
+ KEY_QUERY_VALUE, &hKey2 );
+ if ( ERROR_SUCCESS == lResult )
+ {
+ CHAR szBuffer2[1024];
+ DWORD nSize2 = sizeof( szBuffer2 );
+
+ lResult = RegQueryValueExA( hKey2, "", NULL, NULL, (LPBYTE)szBuffer2, &nSize2 );
+ if ( ERROR_SUCCESS == lResult )
+ {
+ CHAR szBuffer3[1024];
+ DWORD nSize3 = sizeof( szBuffer3 );
+
+ // Try to verify that the old association is OK to restore
+ lResult = RegQueryValueExA( hKey, "OOoBackupAssociationDeref", NULL, NULL,
+ (LPBYTE)szBuffer3, &nSize3 );
+ if ( ERROR_SUCCESS == lResult )
+ {
+ if ( nSize2 == nSize3 && strcmp (szBuffer2, szBuffer3) == 0)
+ {
+ // Yep. So restore it
+ RegSetValueExA( hKey, "", 0, REG_SZ, (LPBYTE)szBuffer, nSize );
+ }
+ }
+ }
+ RegCloseKey( hKey2 );
+ }
+ RegDeleteValueA( hKey, "OOoBackupAssociation" );
+ }
+ RegDeleteValueA( hKey, "OOoBackupAssociationDeref" );
+ RegCloseKey( hKey );
+ }
+}
+
+//----------------------------------------------------------
+//
+// This function is not in OO.o. We call this from the
+// Restoreregallmsdocdll custom action.
+//
+extern "C" UINT __stdcall RestoreRegAllMSDoc( MSIHANDLE /*handle*/ )
+{
+ OutputDebugStringFormat( "RestoreRegAllMSDoc\n" );
+
+ int nIndex = 0;
+ while ( g_Extensions[nIndex] != 0 )
+ {
+ restoreOldRegistration( g_Extensions[nIndex] );
+ ++nIndex;
+ }
+
+
+ return ERROR_SUCCESS;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */