Module: wine Branch: master Commit: 808343fb5b5fd36fcd92c38def0ac1ca1010825f URL: http://source.winehq.org/git/wine.git/?a=commit;h=808343fb5b5fd36fcd92c38def...
Author: Hans Leidekker hans@codeweavers.com Date: Mon Nov 2 10:04:05 2009 +0100
msi: Implement MsiSetExternalUIRecord.
---
dlls/msi/media.c | 9 ++++++++- dlls/msi/msi.c | 19 +++++++++++++------ dlls/msi/msi_main.c | 13 +++++++------ dlls/msi/msipriv.h | 1 + dlls/msi/package.c | 9 ++++++++- dlls/msi/tests/install.c | 28 ++++++++++++++++++++++++++++ 6 files changed, 65 insertions(+), 14 deletions(-)
diff --git a/dlls/msi/media.c b/dlls/msi/media.c index fe0192e..bc60b60 100644 --- a/dlls/msi/media.c +++ b/dlls/msi/media.c @@ -77,7 +77,7 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi) static const WCHAR error_prop[] = {'E','r','r','o','r','D','i','a','l','o','g',0};
if ((msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_MASK) == - INSTALLUILEVEL_NONE && !gUIHandlerA && !gUIHandlerW) + INSTALLUILEVEL_NONE && !gUIHandlerA && !gUIHandlerW && !gUIHandlerRecord) return ERROR_SUCCESS;
error = generate_error_string(package, 1302, 1, mi->disk_prompt); @@ -98,6 +98,13 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi) gUIHandlerA(gUIContext, MB_RETRYCANCEL | INSTALLMESSAGE_ERROR, msg); msi_free(msg); } + else if (gUIHandlerRecord) + { + MSIHANDLE rec = MsiCreateRecord(1); + MsiRecordSetStringW(rec, 0, error); + gUIHandlerRecord(gUIContext, MB_RETRYCANCEL | INSTALLMESSAGE_ERROR, rec); + MsiCloseHandle(rec); + } }
msi_free(error); diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index 8b56705..2515714 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -3595,13 +3595,20 @@ UINT WINAPI MsiIsProductElevatedA( LPCSTR szProduct, BOOL *pfElevated ) /*********************************************************************** * MsiSetExternalUIRecord [MSI.@] */ -UINT WINAPI MsiSetExternalUIRecord( INSTALLUI_HANDLER_RECORD puiHandler, - DWORD dwMessageFilter, LPVOID pvContext, - PINSTALLUI_HANDLER_RECORD ppuiPrevHandler) +UINT WINAPI MsiSetExternalUIRecord( INSTALLUI_HANDLER_RECORD handler, + DWORD filter, LPVOID context, + PINSTALLUI_HANDLER_RECORD prev ) { - FIXME("%p %08x %p %p\n", puiHandler, dwMessageFilter ,pvContext, - ppuiPrevHandler); - return ERROR_CALL_NOT_IMPLEMENTED; + TRACE("%p %08x %p %p\n", handler, filter, context, prev); + + if (prev) + *prev = gUIHandlerRecord; + + gUIHandlerRecord = handler; + gUIFilter = filter; + gUIContext = context; + + return ERROR_SUCCESS; }
/*********************************************************************** diff --git a/dlls/msi/msi_main.c b/dlls/msi/msi_main.c index 9474b2a..df29184 100644 --- a/dlls/msi/msi_main.c +++ b/dlls/msi/msi_main.c @@ -37,12 +37,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); static LONG dll_count;
/* the UI level */ -INSTALLUILEVEL gUILevel = INSTALLUILEVEL_BASIC; -HWND gUIhwnd = 0; -INSTALLUI_HANDLERA gUIHandlerA = NULL; -INSTALLUI_HANDLERW gUIHandlerW = NULL; -DWORD gUIFilter = 0; -LPVOID gUIContext = NULL; +INSTALLUILEVEL gUILevel = INSTALLUILEVEL_BASIC; +HWND gUIhwnd = 0; +INSTALLUI_HANDLERA gUIHandlerA = NULL; +INSTALLUI_HANDLERW gUIHandlerW = NULL; +INSTALLUI_HANDLER_RECORD gUIHandlerRecord = NULL; +DWORD gUIFilter = 0; +LPVOID gUIContext = NULL; WCHAR gszLogFile[MAX_PATH]; HINSTANCE msi_hInstance;
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index cfc3828..38103d8 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -843,6 +843,7 @@ extern INSTALLUILEVEL gUILevel; extern HWND gUIhwnd; extern INSTALLUI_HANDLERA gUIHandlerA; extern INSTALLUI_HANDLERW gUIHandlerW; +extern INSTALLUI_HANDLER_RECORD gUIHandlerRecord; extern DWORD gUIFilter; extern LPVOID gUIContext; extern WCHAR gszLogFile[MAX_PATH]; diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 08a76f6..7f13633 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -1203,7 +1203,7 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, } }
- TRACE("%p %p %x %x %s\n", gUIHandlerA, gUIHandlerW, + TRACE("%p %p %p %x %x %s\n", gUIHandlerA, gUIHandlerW, gUIHandlerRecord, gUIFilter, log_type, debugstr_w(message));
/* convert it to ASCII */ @@ -1219,6 +1219,13 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, { rc = gUIHandlerA( gUIContext, eMessageType, msg ); } + else if (gUIHandlerRecord && (gUIFilter & log_type)) + { + MSIHANDLE rec = MsiCreateRecord( 1 ); + MsiRecordSetStringW( rec, 0, message ); + rc = gUIHandlerRecord( gUIContext, eMessageType, rec ); + MsiCloseHandle( rec ); + }
if ((!rc) && (gszLogFile[0]) && !((eMessageType & 0xff000000) == INSTALLMESSAGE_PROGRESS)) diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index 216ab97..51e37e8 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -6873,11 +6873,14 @@ static void test_file_in_use_cab(void)
INT CALLBACK handler_a(LPVOID context, UINT type, LPCSTR msg) { return IDOK; }; INT CALLBACK handler_w(LPVOID context, UINT type, LPCWSTR msg) { return IDOK; }; +INT CALLBACK handler_record(LPVOID context, UINT type, MSIHANDLE record) { return IDOK; };
static void test_MsiSetExternalUI(void) { INSTALLUI_HANDLERA ret_a; INSTALLUI_HANDLERW ret_w; + INSTALLUI_HANDLER_RECORD prev; + UINT error;
ret_a = MsiSetExternalUIA(handler_a, INSTALLLOGMODE_ERROR, NULL); ok(ret_a == NULL, "expected NULL, got %p\n", ret_a); @@ -6885,6 +6888,15 @@ static void test_MsiSetExternalUI(void) ret_a = MsiSetExternalUIA(NULL, 0, NULL); ok(ret_a == handler_a, "expected %p, got %p\n", handler_a, ret_a);
+ error = MsiSetExternalUIRecord(handler_record, INSTALLLOGMODE_ERROR, NULL, &prev); + ok(!error, "MsiSetExternalUIRecord failed %u\n", error); + ok(prev == NULL, "expected NULL, got %p\n", prev); + + prev = (INSTALLUI_HANDLER_RECORD)0xdeadbeef; + error = MsiSetExternalUIRecord(NULL, INSTALLLOGMODE_ERROR, NULL, &prev); + ok(!error, "MsiSetExternalUIRecord failed %u\n", error); + ok(prev == handler_record, "expected %p, got %p\n", handler_record, prev); + ret_w = MsiSetExternalUIW(handler_w, INSTALLLOGMODE_ERROR, NULL); ok(ret_w == NULL, "expected NULL, got %p\n", ret_w);
@@ -6897,11 +6909,27 @@ static void test_MsiSetExternalUI(void) ret_w = MsiSetExternalUIW(handler_w, INSTALLLOGMODE_ERROR, NULL); ok(ret_w == NULL, "expected NULL, got %p\n", ret_w);
+ prev = (INSTALLUI_HANDLER_RECORD)0xdeadbeef; + error = MsiSetExternalUIRecord(handler_record, INSTALLLOGMODE_ERROR, NULL, &prev); + ok(!error, "MsiSetExternalUIRecord failed %u\n", error); + ok(prev == NULL, "expected NULL, got %p\n", prev); + ret_a = MsiSetExternalUIA(NULL, 0, NULL); ok(ret_a == NULL, "expected NULL, got %p\n", ret_a);
ret_w = MsiSetExternalUIW(NULL, 0, NULL); ok(ret_w == NULL, "expected NULL, got %p\n", ret_w); + + prev = (INSTALLUI_HANDLER_RECORD)0xdeadbeef; + error = MsiSetExternalUIRecord(NULL, 0, NULL, &prev); + ok(!error, "MsiSetExternalUIRecord failed %u\n", error); + ok(prev == handler_record, "expected %p, got %p\n", handler_record, prev); + + error = MsiSetExternalUIRecord(handler_record, INSTALLLOGMODE_ERROR, NULL, NULL); + ok(!error, "MsiSetExternalUIRecord failed %u\n", error); + + error = MsiSetExternalUIRecord(NULL, 0, NULL, NULL); + ok(!error, "MsiSetExternalUIRecord failed %u\n", error); }
START_TEST(install)