[Libreoffice-commits] .: Branch 'libreoffice-3-4-4' - setup_native/source

Andras Timar timar at kemper.freedesktop.org
Thu Nov 24 14:14:59 PST 2011


 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 5ddec51eae718d7ee48ca3e3096d7e5dd60f445e
Author: Andras Timar <atimar at 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".

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+=	\


More information about the Libreoffice-commits mailing list