Hans Leidekker : msi: Open the log file once per package.

Alexandre Julliard julliard at winehq.org
Tue Oct 26 12:34:53 CDT 2010


Module: wine
Branch: master
Commit: f3e7ed44f18ea66571d2ae2897bba821e85c3851
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f3e7ed44f18ea66571d2ae2897bba821e85c3851

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Oct 26 12:42:34 2010 +0200

msi: Open the log file once per package.

---

 dlls/msi/msi.c      |   12 +++++++-----
 dlls/msi/msi_main.c |    3 ++-
 dlls/msi/msipriv.h  |    3 ++-
 dlls/msi/package.c  |   32 ++++++++++++++------------------
 4 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 11d1174..85bdc96 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -1766,24 +1766,26 @@ UINT WINAPI MsiEnableLogA(DWORD dwLogMode, LPCSTR szLogFile, DWORD attributes)
 
 UINT WINAPI MsiEnableLogW(DWORD dwLogMode, LPCWSTR szLogFile, DWORD attributes)
 {
-    HANDLE file = INVALID_HANDLE_VALUE;
-
     TRACE("%08x %s %08x\n", dwLogMode, debugstr_w(szLogFile), attributes);
 
+    msi_free(gszLogFile);
+    gszLogFile = NULL;
     if (szLogFile)
     {
-        lstrcpyW(gszLogFile,szLogFile);
+        HANDLE file;
+
         if (!(attributes & INSTALLLOGATTRIBUTES_APPEND))
             DeleteFileW(szLogFile);
         file = CreateFileW(szLogFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL, NULL);
         if (file != INVALID_HANDLE_VALUE)
+        {
+            gszLogFile = strdupW(szLogFile);
             CloseHandle(file);
+        }
         else
             ERR("Unable to enable log %s (%u)\n", debugstr_w(szLogFile), GetLastError());
     }
-    else
-        gszLogFile[0] = '\0';
 
     return ERROR_SUCCESS;
 }
diff --git a/dlls/msi/msi_main.c b/dlls/msi/msi_main.c
index df29184..27df1a5 100644
--- a/dlls/msi/msi_main.c
+++ b/dlls/msi/msi_main.c
@@ -44,7 +44,7 @@ INSTALLUI_HANDLERW       gUIHandlerW      = NULL;
 INSTALLUI_HANDLER_RECORD gUIHandlerRecord = NULL;
 DWORD                    gUIFilter        = 0;
 LPVOID                   gUIContext       = NULL;
-WCHAR gszLogFile[MAX_PATH];
+WCHAR                   *gszLogFile       = NULL;
 HINSTANCE msi_hInstance;
 
 static WCHAR msi_path[MAX_PATH];
@@ -78,6 +78,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
         if (msi_typelib) ITypeLib_Release( msi_typelib );
         msi_dialog_unregister_class();
         msi_free_handle_table();
+        msi_free( gszLogFile );
         break;
     }
     return TRUE;
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 30910de..4d9fea7 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -331,6 +331,7 @@ typedef struct tagMSIPACKAGE
     struct list folders;
     LPWSTR ActionFormat;
     LPWSTR LastAction;
+    HANDLE log_file;
 
     struct list classes;
     struct list extensions;
@@ -879,7 +880,7 @@ extern INSTALLUI_HANDLERW gUIHandlerW;
 extern INSTALLUI_HANDLER_RECORD gUIHandlerRecord;
 extern DWORD gUIFilter;
 extern LPVOID gUIContext;
-extern WCHAR gszLogFile[MAX_PATH];
+extern WCHAR *gszLogFile;
 extern HINSTANCE msi_hInstance;
 
 /* action related functions */
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 8fcf6ff..f3f5071 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -295,6 +295,7 @@ static void MSI_FreePackage( MSIOBJECTHDR *arg)
 
     msiobj_release( &package->db->hdr );
     free_package_structures(package);
+    CloseHandle( package->log_file );
 }
 
 static UINT create_temp_property_table(MSIPACKAGE *package)
@@ -1121,6 +1122,8 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
 
         if (package->WordCount & msidbSumInfoSourceTypeAdminImage)
             msi_load_admin_properties( package );
+
+        package->log_file = INVALID_HANDLE_VALUE;
     }
 
     return package;
@@ -1551,6 +1554,10 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
         msi_adjust_privilege_properties( package );
     }
 
+    if (gszLogFile)
+        package->log_file = CreateFileW( gszLogFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
+                                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+
     *pPackage = package;
     return ERROR_SUCCESS;
 }
@@ -1657,17 +1664,13 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType,
         {'S','e','t','P','r','o','g','r','e','s','s',0};
     static const WCHAR szActionText[] =
         {'A','c','t','i','o','n','T','e','x','t',0};
-    DWORD log_type = 0;
     LPWSTR message;
-    DWORD sz;
-    DWORD total_size = 0;
-    INT i;
-    INT rc;
+    DWORD sz, total_size = 0, log_type = 0;
+    INT i, rc = 0;
     char *msg;
     int len;
 
     TRACE("%x\n", eMessageType);
-    rc = 0;
 
     if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ERROR)
         log_type |= INSTALLLOGMODE_ERROR;
@@ -1773,19 +1776,12 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType,
         MsiCloseHandle( rec );
     }
 
-    if (!rc && gszLogFile[0] && (eMessageType & 0xff000000) != INSTALLMESSAGE_PROGRESS)
+    if (!rc && package->log_file != INVALID_HANDLE_VALUE &&
+        (eMessageType & 0xff000000) != INSTALLMESSAGE_PROGRESS)
     {
-        DWORD write;
-        HANDLE log_file = CreateFileW(gszLogFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
-                                  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-
-        if (log_file != INVALID_HANDLE_VALUE)
-        {
-            SetFilePointer(log_file,0, NULL, FILE_END);
-            WriteFile(log_file,msg,strlen(msg),&write,NULL);
-            WriteFile(log_file,"\n",1,&write,NULL);
-            CloseHandle(log_file);
-        }
+        DWORD written;
+        WriteFile( package->log_file, msg, len - 1, &written, NULL );
+        WriteFile( package->log_file, "\n", 1, &written, NULL );
     }
     msi_free( msg );
     msi_free( message );




More information about the wine-cvs mailing list