Zebediah Figura : msi: Implement INSTALLMESSAGE_INITIALIZE and INSTALLMESSAGE_TERMINATE.

Alexandre Julliard julliard at winehq.org
Tue Jun 27 17:19:06 CDT 2017


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Jun 26 20:28:01 2017 -0500

msi: Implement INSTALLMESSAGE_INITIALIZE and INSTALLMESSAGE_TERMINATE.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msi/package.c       | 29 +++++++++++++++++++++--------
 dlls/msi/tests/format.c  |  3 +++
 dlls/msi/tests/package.c |  4 ++--
 3 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 7c537d4..00a8283 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -352,6 +352,7 @@ static void MSI_FreePackage( MSIOBJECTHDR *arg)
 
     if (package->delete_on_close) DeleteFileW( package->localfile );
     msi_free( package->localfile );
+    MSI_ProcessMessage(NULL, INSTALLMESSAGE_TERMINATE, 0);
 }
 
 static UINT create_temp_property_table(MSIPACKAGE *package)
@@ -1477,6 +1478,8 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
 
     TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
 
+    MSI_ProcessMessage(NULL, INSTALLMESSAGE_INITIALIZE, 0);
+
     localfile[0] = 0;
     if( szPackage[0] == '#' )
     {
@@ -1638,6 +1641,8 @@ UINT WINAPI MsiOpenPackageExW(LPCWSTR szPackage, DWORD dwOptions, MSIHANDLE *phP
             ret = ERROR_NOT_ENOUGH_MEMORY;
         msiobj_release( &package->hdr );
     }
+    else
+        MSI_ProcessMessage(NULL, INSTALLMESSAGE_TERMINATE, 0);
 
     return ret;
 }
@@ -1787,13 +1792,17 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIREC
         msi_free(template);
     }
 
-    res = MSI_FormatRecordW(package, record, message, &len);
-    if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA)
-        return res;
-    len++;
-    message = msi_alloc(len * sizeof(WCHAR));
-    if (!message) return ERROR_OUTOFMEMORY;
-    MSI_FormatRecordW(package, record, message, &len);
+    if (!package || !record)
+        message = NULL;
+    else {
+        res = MSI_FormatRecordW(package, record, message, &len);
+        if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA)
+            return res;
+        len++;
+        message = msi_alloc(len * sizeof(WCHAR));
+        if (!message) return ERROR_OUTOFMEMORY;
+        MSI_FormatRecordW(package, record, message, &len);
+    }
 
     /* convert it to ASCII */
     len = WideCharToMultiByte( CP_ACP, 0, message, -1, NULL, 0, NULL, NULL );
@@ -1821,7 +1830,7 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIREC
         rc = gUIHandlerA( gUIContext, eMessageType, msg );
     }
 
-    if (!rc && package->log_file != INVALID_HANDLE_VALUE &&
+    if (!rc && package && package->log_file != INVALID_HANDLE_VALUE &&
         (eMessageType & 0xff000000) != INSTALLMESSAGE_PROGRESS)
     {
         DWORD written;
@@ -1883,6 +1892,10 @@ INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType,
     MSIPACKAGE *package = NULL;
     MSIRECORD *record = NULL;
 
+    if ((eMessageType & 0xff000000) == INSTALLMESSAGE_INITIALIZE ||
+        (eMessageType & 0xff000000) == INSTALLMESSAGE_TERMINATE)
+        return -1;
+
     package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE );
     if( !package )
     {
diff --git a/dlls/msi/tests/format.c b/dlls/msi/tests/format.c
index b035cfa..d86a252 100644
--- a/dlls/msi/tests/format.c
+++ b/dlls/msi/tests/format.c
@@ -2782,6 +2782,9 @@ static void test_processmessage(void)
     todo_wine
     ok( r == IDOK, "expected IDOK, got %i\n", r);
 
+    r = MsiProcessMessage(package, INSTALLMESSAGE_INITIALIZE, hrec);
+    ok( r == -1, "expected -1, got %i\n", r);
+
     MsiCloseHandle(hrec);
     MsiCloseHandle(package);
 
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 9934c00..a46bb20 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -9384,7 +9384,7 @@ static void test_externalui_message(void)
 
     r = MsiOpenPackageA("nonexistent", &hpkg);
     ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", r);
-    ok_sequence(openpackage_nonexistent_sequence, "MsiOpenPackage with nonexistent db", TRUE);
+    ok_sequence(openpackage_nonexistent_sequence, "MsiOpenPackage with nonexistent db", FALSE);
 
     r = package_from_db(hdb, &hpkg);
     if (r == ERROR_INSTALL_PACKAGE_REJECTED)
@@ -9408,7 +9408,7 @@ static void test_externalui_message(void)
 
     /* close the package */
     MsiCloseHandle(hpkg);
-    ok_sequence(closehandle_sequence, "MsiCloseHandle()", TRUE);
+    ok_sequence(closehandle_sequence, "MsiCloseHandle()", FALSE);
 
     CoUninitialize();
     DeleteFileA(msifile);




More information about the wine-cvs mailing list