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)) ) - { - BOOL bFailIfExist = 0 == (dwFlags & MOVEFILE_REPLACE_EXISTING); - - fSuccess = CopyFileA( lpExistingFileNameA, lpNewFileNameA, bFailIfExist ); - - if ( fSuccess ) - fSuccess = DeleteFileA( lpExistingFileNameA ); - } - - } - - return fSuccess; -} - -static BOOL MoveFileExImpl( LPCSTR lpExistingFileNameA, LPCSTR lpNewFileNameA, DWORD dwFlags ) -{ - if ( 0 > ((LONG)GetVersion())) // High order bit indicates Win 9x - return MoveFileEx9x( lpExistingFileNameA, lpNewFileNameA, dwFlags ); - else - return MoveFileExA( lpExistingFileNameA, lpNewFileNameA, dwFlags ); -} - -extern "C" UINT __stdcall IsOfficeRunning( MSIHANDLE handle ) -{ - OSVERSIONINFO osverinfo; - osverinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx( &osverinfo ); - - // renaming the vcl resource doesn't work reliable with OS >= Windows Vista - if (osverinfo.dwMajorVersion < 6 ) - { - std::_tstring sInstDir = GetMsiProperty( handle, TEXT("INSTALLLOCATION") ); - // Property empty -> no office installed - if ( sInstDir.length() == 0 ) - return ERROR_SUCCESS; - - std::_tstring sResourceDir = sInstDir + TEXT("Basis\\program\\resource\\"); - std::_tstring sPattern = sResourceDir + TEXT("vcl*.res"); - -// std::_tstring mystr; -// mystr = "IsOfficeRunning start. Checking file in dir: " + sResourceDir; -// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK ); - - WIN32_FIND_DATA aFindFileData; - HANDLE hFind = FindFirstFile( sPattern.c_str(), &aFindFileData ); - - if ( IsValidHandle(hFind) ) - { - BOOL fSuccess = false; - bool fRenameSucceeded; - - do + CloseHandle( hProcess ); + if ( _tcscmp( szProcessName, TEXT("soffice.bin") ) == 0 ) { - std::_tstring sResourceFile = sResourceDir + aFindFileData.cFileName; - std::_tstring sIntermediate = sResourceFile + TEXT(".tmp"); - - fRenameSucceeded = MoveFileExImpl( sResourceFile.c_str(), sIntermediate.c_str(), MOVEFILE_REPLACE_EXISTING ); - if ( fRenameSucceeded ) - { - MoveFileExImpl( sIntermediate.c_str(), sResourceFile.c_str(), 0 ); - fSuccess = FindNextFile( hFind, &aFindFileData ); - } - } while ( fSuccess && fRenameSucceeded ); - - if ( !fRenameSucceeded ) - { - MsiSetProperty(handle, TEXT("OFFICERUNS"), TEXT("1")); + MsiSetProperty( handle, TEXT("OFFICERUNS"), TEXT("1") ); SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING ); - -// mystr = "Office is running"; -// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK ); } - - FindClose( hFind ); } -// mystr = "IsOfficeRunning end"; -// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK ); } - else - { - std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION")); - // Property empty -> no office installed - if ( sOfficeInstallPath.length() == 0 ) - return ERROR_SUCCESS; - - std::_tstring sRenameSrc = sOfficeInstallPath + TEXT("program"); - std::_tstring sRenameDst = sOfficeInstallPath + TEXT("program_test"); - - bool bSuccess = MoveFile( sRenameSrc.c_str(), sRenameDst.c_str() ); - - if ( bSuccess ) - { - MoveFile( sRenameDst.c_str(), sRenameSrc.c_str() ); - } - else - { - DWORD dwError = GetLastError(); - LPVOID lpMsgBuf; - // When there is no program folder, there could be no running office - if ( dwError == ERROR_FILE_NOT_FOUND ) - return ERROR_SUCCESS; - if ( dwError == ERROR_PATH_NOT_FOUND ) - return ERROR_SUCCESS; - - // The destination folder should never exist, don't know what to do here - if ( dwError == ERROR_ALREADY_EXISTS ) - return ERROR_SUCCESS; - - if ( FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL )) - { - OutputDebugStringFormat( TEXT("Error Code %d: %s"), dwError, lpMsgBuf ); - LocalFree( lpMsgBuf ); - } - else - OutputDebugStringFormat( TEXT("Error Code %d: Unknown"), dwError ); - - MsiSetProperty( handle, TEXT("OFFICERUNS"), TEXT("1") ); - SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING ); - } - } - return ERROR_SUCCESS; } - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/setup_native/source/win32/customactions/shellextensions/makefile.mk b/setup_native/source/win32/customactions/shellextensions/makefile.mk index de8f943..579527b 100644 --- a/setup_native/source/win32/customactions/shellextensions/makefile.mk +++ b/setup_native/source/win32/customactions/shellextensions/makefile.mk @@ -69,7 +69,8 @@ SLOFILES = \ STDSHL += \ $(ADVAPI32LIB)\ $(MSILIB)\ - $(SHELL32LIB) + $(SHELL32LIB)\ + psapi.lib .IF "$(COM)"=="GCC" STDSHL+= \
_______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits