setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
| 205 +-
setup_native/source/win32/customactions/shellextensions/makefile.mk
|3
2 files changed, 27 insertions(+), 181 deletions(-)
New commits:
commit 2408d229104c3e198ce79e72bb89ce360575aa36
Author: Andras Timar ati...@suse.com
Date: Thu Nov 24 23:10:30 2011 +0100
change logic of IsOfficeRunning custom action fdo#36677
instead of trying to rename a file or folder in
Program Files directory - which is write protected
anyway normally - installer checks the process list,
if there is a process called soffice.bin.
Signed-off-by: Fridrich Å trba fridrich.st...@bluewin.ch
diff --git
a/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
b/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
index 0cf8458..3432ddd 100644
---
a/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
+++
b/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
@@ -53,6 +53,10 @@
#include stdio.h
#include sal/macros.h
+// works with Windows XP as well as with Windows 7
+#define PSAPI_VERSION 1
+#include psapi.h
+
#include systools/win32/uwinapi.h
#include ../tools/seterror.hxx
@@ -93,201 +97,42 @@ static std::_tstring GetMsiProperty( MSIHANDLE handle,
const std::_tstring sPro
return result;
}
-static inline bool IsSetMsiProperty(MSIHANDLE handle, const std::_tstring
sProperty)
-{
-std::_tstring value = GetMsiProperty(handle, sProperty);
-return (value.length() 0);
-}
-
-static inline void UnsetMsiProperty(MSIHANDLE handle, const std::_tstring
sProperty)
+extern C UINT __stdcall IsOfficeRunning( MSIHANDLE handle )
{
-MsiSetProperty(handle, sProperty.c_str(), NULL);
-}
+std::_tstring sOfficeInstallPath = GetMsiProperty(handle,
TEXT(INSTALLLOCATION));
+// Property empty - no office installed
+if ( sOfficeInstallPath.length() == 0 )
+return ERROR_SUCCESS;
-static inline void SetMsiProperty(MSIHANDLE handle, const std::_tstring
sProperty)
-{
-MsiSetProperty(handle, sProperty.c_str(), TEXT(1));
-}
+DWORD aProcesses[1024], cbNeeded, cProcesses; /* 1024 processses ought to
be enough for anybody */
-static BOOL MoveFileEx9x( LPCSTR lpExistingFileNameA, LPCSTR lpNewFileNameA,
DWORD dwFlags )
-{
-BOOL fSuccess = FALSE; // assume failure
+if ( !EnumProcesses( aProcesses, sizeof(aProcesses), cbNeeded ) )
+return ERROR_INSTALL_FAILURE;
-// Windows 9x has a special mechanism to move files after reboot
+cProcesses = cbNeeded / sizeof(DWORD);
-if ( dwFlags MOVEFILE_DELAY_UNTIL_REBOOT )
+// Check if there is soffice.bin among the processes
+for ( unsigned int i = 0; i cProcesses; i++ )
{
-CHAR szExistingFileNameA[MAX_PATH];
-CHAR szNewFileNameA[MAX_PATH] = NUL;
-
-// Path names in WININIT.INI must be in short path name form
-
-if (
-GetShortPathNameA( lpExistingFileNameA, szExistingFileNameA,
MAX_PATH )
-(!lpNewFileNameA || GetShortPathNameA( lpNewFileNameA,
szNewFileNameA, MAX_PATH ))
-)
+if( aProcesses[i] != 0 )
{
-CHAR szBuffer[32767];// The buffer size must not
exceed 32K
-DWORD dwBufLen = GetPrivateProfileSectionA( RENAME_SECTION,
szBuffer, SAL_N_ELEMENTS(szBuffer), WININIT_FILENAME );
-
-CHAR szRename[MAX_PATH]; // This is enough for at most
to times 67 chracters
-strcpy( szRename, szNewFileNameA );
-strcat( szRename, = );
-strcat( szRename, szExistingFileNameA );
-size_t lnRename = strlen(szRename);
-
-if ( dwBufLen + lnRename + 2 = SAL_N_ELEMENTS(szBuffer) )
+TCHAR szProcessName[MAX_PATH] = TEXT(unknown);
+HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ, FALSE, aProcesses[i] );
+if (NULL != hProcess )
{
-CopyMemory( szBuffer[dwBufLen], szRename, lnRename );
-szBuffer[dwBufLen + lnRename ] = 0;
-szBuffer[dwBufLen + lnRename + 1 ] = 0;
-
-fSuccess = WritePrivateProfileSectionA( RENAME_SECTION,
szBuffer, WININIT_FILENAME );
+HMODULE hMod;
+if ( EnumProcessModules( hProcess, hMod, sizeof(hMod),
cbNeeded) )
+GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
-else
-SetLastError( ERROR_BUFFER_OVERFLOW );
-}
-}
-else
-{
-
-fSuccess = MoveFileA( lpExistingFileNameA, lpNewFileNameA );
-
-if ( !fSuccess GetLastError() != ERROR_ACCESS_DENIED
-0 != (dwFlags (MOVEFILE_COPY_ALLOWED |
MOVEFILE_REPLACE_EXISTING)) )
-{
-