[Libreoffice-commits] .: 2 commits - setup_native/source

Andras Timar timar at kemper.freedesktop.org
Fri Nov 25 00:47:38 PST 2011


 setup_native/source/win32/customactions/languagepacks/checkrunningofficelanguagepack.cxx |    3 
 setup_native/source/win32/customactions/patch/swappatchfiles.cxx                         |    3 
 setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx           |  142 +---------
 3 files changed, 26 insertions(+), 122 deletions(-)

New commits:
commit c392dfe4ff4273e63f62c8642c7532e7c7bddc37
Author: Andras Timar <atimar at suse.com>
Date:   Fri Nov 25 09:44:14 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 38f5bcd..fce807f 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>
 
@@ -90,133 +94,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)
-{
-    MsiSetProperty(handle, sProperty.c_str(), NULL);
-}
-
-static inline void SetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty)
-{
-    MsiSetProperty(handle, sProperty.c_str(), TEXT("1"));
-}
-
 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 sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
+    // Property empty -> no office installed
+    if ( sOfficeInstallPath.length() == 0 )
+        return ERROR_SUCCESS;
 
-        std::_tstring sResourceDir = sInstDir + TEXT("Basis\\program\\resource\\");
-        std::_tstring sPattern = sResourceDir + TEXT("vcl*.res");
+    DWORD aProcesses[1024], cbNeeded, cProcesses; /* 1024 processses ought to be enough for anybody */
 
-//        std::_tstring mystr;
-//        mystr = "IsOfficeRunning start. Checking file in dir: " + sResourceDir;
-//        MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK );
+    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
+        return ERROR_INSTALL_FAILURE;
 
-        WIN32_FIND_DATA aFindFileData;
-        HANDLE  hFind = FindFirstFile( sPattern.c_str(), &aFindFileData );
+    cProcesses = cbNeeded / sizeof(DWORD);
 
-        if ( IsValidHandle(hFind) )
+    // Check if there is "soffice.bin" among the processes
+    for ( unsigned int i = 0; i < cProcesses; i++ )
+    {
+        if( aProcesses[i] != 0 )
         {
-            BOOL    fSuccess = false;
-            bool    fRenameSucceeded;
-
-            do
+            TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
+            HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,  aProcesses[i] );
+            if (NULL != hProcess )
             {
-                std::_tstring   sResourceFile = sResourceDir + aFindFileData.cFileName;
-                std::_tstring   sIntermediate = sResourceFile + TEXT(".tmp");
-
-                fRenameSucceeded = MoveFileExA( sResourceFile.c_str(), sIntermediate.c_str(), MOVEFILE_REPLACE_EXISTING );
-                if ( fRenameSucceeded )
-                {
-                    MoveFileExA( sIntermediate.c_str(), sResourceFile.c_str(), 0 );
-                    fSuccess = FindNextFile( hFind, &aFindFileData );
-                }
-            } while ( fSuccess && fRenameSucceeded );
-
-            if ( !fRenameSucceeded )
-            {
-                MsiSetProperty(handle, TEXT("OFFICERUNS"), TEXT("1"));
-                SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING );
-
-//                mystr = "Office is running";
-//                MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK );
+                HMODULE hMod;
+                if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
+                    GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
             }
-
-            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 ))
+            CloseHandle( hProcess );
+            if ( _tcscmp( szProcessName, TEXT("soffice.bin") ) == 0 )
             {
-                OutputDebugStringFormat( TEXT("Error Code %d: %s"), dwError, lpMsgBuf );
-                LocalFree( lpMsgBuf );
+                MsiSetProperty( handle, TEXT("OFFICERUNS"), TEXT("1") );
+                SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING );
             }
-            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: */
commit 3b12413024c287b6546cf7e34361bb12776e3871
Author: Andras Timar <atimar at suse.com>
Date:   Fri Nov 25 09:18:15 2011 +0100

    remove unused defines

diff --git a/setup_native/source/win32/customactions/languagepacks/checkrunningofficelanguagepack.cxx b/setup_native/source/win32/customactions/languagepacks/checkrunningofficelanguagepack.cxx
index 2b7dc25..ff1efc0 100644
--- a/setup_native/source/win32/customactions/languagepacks/checkrunningofficelanguagepack.cxx
+++ b/setup_native/source/win32/customactions/languagepacks/checkrunningofficelanguagepack.cxx
@@ -56,9 +56,6 @@
 #include <systools/win32/uwinapi.h>
 #include <../tools/seterror.hxx>
 
-#define WININIT_FILENAME    "wininit.ini"
-#define RENAME_SECTION      "rename"
-
 #ifdef DEBUG
 inline void OutputDebugStringFormat( LPCTSTR pFormat, ... )
 {
diff --git a/setup_native/source/win32/customactions/patch/swappatchfiles.cxx b/setup_native/source/win32/customactions/patch/swappatchfiles.cxx
index 1b57632..7b7d46c 100644
--- a/setup_native/source/win32/customactions/patch/swappatchfiles.cxx
+++ b/setup_native/source/win32/customactions/patch/swappatchfiles.cxx
@@ -56,9 +56,6 @@
 #include <systools/win32/uwinapi.h>
 #include <../tools/seterror.hxx>
 
-#define WININIT_FILENAME    "wininit.ini"
-#define RENAME_SECTION      "rename"
-
 #ifdef DEBUG
 inline void OutputDebugStringFormat( LPCTSTR pFormat, ... )
 {
diff --git a/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx b/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
index 76f6b6e..38f5bcd 100644
--- a/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
@@ -56,9 +56,6 @@
 #include <systools/win32/uwinapi.h>
 #include <../tools/seterror.hxx>
 
-#define WININIT_FILENAME    "wininit.ini"
-#define RENAME_SECTION      "rename"
-
 #ifdef DEBUG
 inline void OutputDebugStringFormat( LPCTSTR pFormat, ... )
 {


More information about the Libreoffice-commits mailing list