-- v2: compstui: Test that callbacks are executed.
From: Piotr Caban piotr@codeweavers.com
--- dlls/compstui/compstui_main.c | 102 +++++++++++++++++++++++++++++++-- dlls/compstui/tests/compstui.c | 25 ++++++++ 2 files changed, 122 insertions(+), 5 deletions(-)
diff --git a/dlls/compstui/compstui_main.c b/dlls/compstui/compstui_main.c index b7a08e1c52b..c44942c60a3 100644 --- a/dlls/compstui/compstui_main.c +++ b/dlls/compstui/compstui_main.c @@ -32,6 +32,7 @@ #include "ddk/compstui.h"
#include "wine/debug.h" +#include "wine/list.h"
WINE_DEFAULT_DEBUG_CHANNEL(compstui);
@@ -59,6 +60,7 @@ struct propsheet { int pages_cnt; HANDLE pages[100]; + struct list funcs; };
struct propsheetpage @@ -66,6 +68,17 @@ struct propsheetpage HPROPSHEETPAGE hpsp; };
+struct propsheetfunc +{ + struct list entry; + HANDLE handle; + PFNPROPSHEETUI func; + LPARAM lparam; + BOOL unicode; + ULONG_PTR user_data; + ULONG_PTR result; +}; + #define HANDLE_FIRST 0x43440001 static struct cps_data { @@ -73,7 +86,8 @@ static struct cps_data { HANDLE_FREE = 0, HANDLE_PROPSHEET, - HANDLE_PROPSHEETPAGE + HANDLE_PROPSHEETPAGE, + HANDLE_PROPSHEETFUNC, } type; union { @@ -81,6 +95,7 @@ static struct cps_data struct cps_data *next_free; struct propsheet *ps; struct propsheetpage *psp; + struct propsheetfunc *psf; }; } handles[0x1000]; static struct cps_data *first_free_handle = handles; @@ -94,6 +109,8 @@ static CRITICAL_SECTION_DEBUG handles_cs_debug = }; static CRITICAL_SECTION handles_cs = { &handles_cs_debug, -1, 0, 0, 0, 0 };
+static LONG_PTR WINAPI cps_callback(HANDLE hcps, UINT func, LPARAM lparam1, LPARAM lparam2); + static struct cps_data* get_handle_data(HANDLE handle) { struct cps_data *ret; @@ -117,6 +134,9 @@ static HANDLE alloc_handle(struct cps_data **cps_data, int type) case HANDLE_PROPSHEETPAGE: data = calloc(1, sizeof(struct propsheetpage)); break; + case HANDLE_PROPSHEETFUNC: + data = calloc(1, sizeof(struct propsheetfunc)); + break; }
if (!data) @@ -187,6 +207,59 @@ static HANDLE add_hpropsheetpage(HANDLE hcps, HPROPSHEETPAGE hpsp) return ret; }
+static HANDLE add_propsheetfunc(HANDLE hcps, PFNPROPSHEETUI func, LPARAM lparam, BOOL unicode) +{ + struct cps_data *cps_data = get_handle_data(hcps); + struct cps_data *cpsf_data; + PROPSHEETUI_INFO info, callback_info; + HANDLE ret; + LONG lret; + + if (!cps_data || !func) + return 0; + + if (cps_data->type != HANDLE_PROPSHEET) + { + FIXME("unsupported handle type %d\n", cps_data->type); + return 0; + } + + ret = alloc_handle(&cpsf_data, HANDLE_PROPSHEETFUNC); + if (!ret) + return 0; + cpsf_data->psf->handle = ret; + cpsf_data->psf->func = func; + cpsf_data->psf->unicode = unicode; + cpsf_data->psf->lparam = lparam; + + memset(&info, 0, sizeof(info)); + info.cbSize = sizeof(info); + info.Version = PROPSHEETUI_INFO_VERSION; + info.Flags = unicode ? PSUIINFO_UNICODE : 0; + info.Reason = PROPSHEETUI_REASON_INIT; + info.hComPropSheet = hcps; + info.pfnComPropSheet = cps_callback; + info.lParamInit = lparam; + + callback_info = info; + lret = func(&callback_info, lparam); + cpsf_data->psf->user_data = callback_info.UserData; + cpsf_data->psf->result = callback_info.Result; + if (lret <= 0) + { + callback_info = info; + callback_info.Reason = PROPSHEETUI_REASON_DESTROY; + callback_info.UserData = cpsf_data->psf->user_data; + callback_info.Result = cpsf_data->psf->result; + free_handle(ret); + func(&callback_info, 0); + return 0; + } + + list_add_tail(&cps_data->ps->funcs, &cpsf_data->psf->entry); + return ret; +} + static LONG_PTR WINAPI cps_callback(HANDLE hcps, UINT func, LPARAM lparam1, LPARAM lparam2) { TRACE("(%p, %u, %Ix, %Ix\n", hcps, func, lparam1, lparam2); @@ -195,11 +268,13 @@ static LONG_PTR WINAPI cps_callback(HANDLE hcps, UINT func, LPARAM lparam1, LPAR { case CPSFUNC_ADD_HPROPSHEETPAGE: return (LONG_PTR)add_hpropsheetpage(hcps, (HPROPSHEETPAGE)lparam1); + case CPSFUNC_ADD_PFNPROPSHEETUIA: + case CPSFUNC_ADD_PFNPROPSHEETUIW: + return (LONG_PTR)add_propsheetfunc(hcps, (PFNPROPSHEETUI)lparam1, + lparam2, func == CPSFUNC_ADD_PFNPROPSHEETUIW); case CPSFUNC_ADD_PROPSHEETPAGEW: case CPSFUNC_ADD_PCOMPROPSHEETUIA: case CPSFUNC_ADD_PCOMPROPSHEETUIW: - case CPSFUNC_ADD_PFNPROPSHEETUIA: - case CPSFUNC_ADD_PFNPROPSHEETUIW: case CPSFUNC_DELETE_HCOMPROPSHEET: case CPSFUNC_SET_HSTARTPAGE: case CPSFUNC_GET_PAGECOUNT: @@ -324,6 +399,7 @@ static LONG create_prop_dlg(HWND hwnd, PFNPROPSHEETUI callback, LPARAM lparam, D SetLastError(0); return ERR_CPSUI_GETLASTERROR; } + list_init(&cps_data->ps->funcs);
memset(&info, 0, sizeof(info)); info.cbSize = sizeof(info); @@ -364,9 +440,25 @@ static LONG create_prop_dlg(HWND hwnd, PFNPROPSHEETUI callback, LPARAM lparam, D ret = create_property_sheetW(cps_data->ps, &header);
destroy: + info.Reason = PROPSHEETUI_REASON_DESTROY; + while (!list_empty(&cps_data->ps->funcs)) + { + struct propsheetfunc *func = LIST_ENTRY(list_head(&cps_data->ps->funcs), + struct propsheetfunc, entry); + + list_remove(&func->entry); + + callback_info = info; + callback_info.Flags = func->unicode ? PSUIINFO_UNICODE : 0; + callback_info.lParamInit = func->lparam; + callback_info.UserData = func->user_data; + callback_info.Result = func->result; + func->func(&callback_info, ret <= 0 ? 0 : 0x100); + free_handle(func->handle); + } + callback_info = info; - callback_info.Reason = PROPSHEETUI_REASON_DESTROY; - callback(&callback_info, ret < 0 ? 0 : 0x100); + callback(&callback_info, ret <= 0 ? 0 : 0x100);
for (i = 0; i < cps_data->ps->pages_cnt; i++) free_handle(cps_data->ps->pages[i]); diff --git a/dlls/compstui/tests/compstui.c b/dlls/compstui/tests/compstui.c index f4e3af459a9..be63c7645ec 100644 --- a/dlls/compstui/tests/compstui.c +++ b/dlls/compstui/tests/compstui.c @@ -45,6 +45,25 @@ static INT_PTR CALLBACK prop_page_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARA return FALSE; }
+static LONG WINAPI device_property_sheets(PROPSHEETUI_INFO *info, LPARAM lparam) +{ + ok(info->cbSize == sizeof(*info), "info->cbSize = %hd\n", info->cbSize); + ok(info->Version == PROPSHEETUI_INFO_VERSION, "info->Version = %hd\n", info->Version); + ok(info->Flags == info->lParamInit ? PSUIINFO_UNICODE : 0, "info->Flags = %hd\n", info->Flags); + ok(info->Reason == PROPSHEETUI_REASON_INIT || info->Reason == PROPSHEETUI_REASON_DESTROY, + "info->Reason = %hx\n", info->Reason); + ok(info->hComPropSheet != NULL, "info->hComPropSheet = NULL\n"); + ok(info->pfnComPropSheet != NULL, "info->pfnComPropSheet = NULL\n"); + if (info->Reason == PROPSHEETUI_REASON_INIT) + { + ok(info->lParamInit == lparam, "info->lParamInit = %Ix, lparam = %Ix\n", + info->lParamInit, lparam); + } + ok(!info->UserData, "info->UserData = %Ix\n", info->UserData); + ok(!info->Result, "info->Result = %Ix\n", info->Result); + return lparam; +} + #define ADD_PAGES 0x1
static LONG WINAPI propsheetui_callback(PROPSHEETUI_INFO *info, LPARAM lparam) @@ -93,6 +112,12 @@ static LONG WINAPI propsheetui_callback(PROPSHEETUI_INFO *info, LPARAM lparam) PROPSHEETPAGEW psp; LONG_PTR ret;
+ ret = info->pfnComPropSheet(info->hComPropSheet, CPSFUNC_ADD_PFNPROPSHEETUIA, (LPARAM)device_property_sheets, 0); + ok(!ret, "ret = %Ix\n", ret); + + ret = info->pfnComPropSheet(info->hComPropSheet, CPSFUNC_ADD_PFNPROPSHEETUIW, (LPARAM)device_property_sheets, 1); + ok(ret, "ret = 0\n"); + memset(&psp, 0, sizeof(psp)); psp.dwSize = sizeof(psp); U(psp).pszTemplate = L"prop_page1";
From: Piotr Caban piotr@codeweavers.com
--- dlls/compstui/compstui_main.c | 131 ++++++++++++++++++++++++++++++++- dlls/compstui/tests/compstui.c | 27 +++++++ include/ddk/compstui.h | 9 +++ 3 files changed, 165 insertions(+), 2 deletions(-)
diff --git a/dlls/compstui/compstui_main.c b/dlls/compstui/compstui_main.c index c44942c60a3..60d5f9891b0 100644 --- a/dlls/compstui/compstui_main.c +++ b/dlls/compstui/compstui_main.c @@ -28,7 +28,7 @@ #include "windef.h" #include "winbase.h" #include "winuser.h" -#include "prsht.h" +#include "commctrl.h" #include "ddk/compstui.h"
#include "wine/debug.h" @@ -66,6 +66,7 @@ struct propsheet struct propsheetpage { HPROPSHEETPAGE hpsp; + DLGPROC dlg_proc; };
struct propsheetfunc @@ -260,6 +261,130 @@ static HANDLE add_propsheetfunc(HANDLE hcps, PFNPROPSHEETUI func, LPARAM lparam, return ret; }
+static HANDLE add_propsheetpage(HANDLE hcps, void *psp, PSPINFO *info, + DLGPROC dlg_proc, BOOL unicode) +{ + struct cps_data *cps_data = get_handle_data(hcps); + struct cps_data *cpsp_data; + HPROPSHEETPAGE hpsp; + HANDLE ret; + + if (!cps_data) + return 0; + + if (cps_data->type != HANDLE_PROPSHEET) + { + FIXME("unsupported handle type %d\n", cps_data->type); + return 0; + } + + if (cps_data->ps->pages_cnt == ARRAY_SIZE(cps_data->ps->pages)) + return 0; + + ret = alloc_handle(&cpsp_data, HANDLE_PROPSHEETPAGE); + if (!ret) + return 0; + + info->cbSize = sizeof(*info); + info->wReserved = 0; + info->hComPropSheet = hcps; + info->hCPSUIPage = ret; + info->pfnComPropSheet = cps_callback; + + if (unicode) + hpsp = CreatePropertySheetPageW((PROPSHEETPAGEW*)psp); + else + hpsp = CreatePropertySheetPageA((PROPSHEETPAGEA*)psp); + if (!hpsp) + { + free_handle(ret); + return 0; + } + + cpsp_data->psp->hpsp = hpsp; + cpsp_data->psp->dlg_proc = dlg_proc; + cps_data->ps->pages[cps_data->ps->pages_cnt++] = ret; + return ret; +} + +static INT_PTR CALLBACK propsheetpage_dlg_procW(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if (msg == WM_INITDIALOG) + { + PROPSHEETPAGEW *psp = (PROPSHEETPAGEW*)lparam; + PSPINFO *info = (PSPINFO*)((BYTE*)lparam + psp->dwSize - sizeof(*info)); + struct cps_data *cpsp_data = get_handle_data(info->hCPSUIPage); + + psp->dwSize -= sizeof(*info); + psp->pfnDlgProc = cpsp_data->psp->dlg_proc; + SetWindowLongPtrW(hwnd, DWLP_DLGPROC, (LONG_PTR)psp->pfnDlgProc); + return psp->pfnDlgProc(hwnd, msg, wparam, lparam); + } + + return FALSE; +} + +static HANDLE add_propsheetpageW(HANDLE hcps, PROPSHEETPAGEW *psp) +{ + PROPSHEETPAGEW *psp_copy; + PSPINFO *info; + HANDLE ret; + + if (!psp || psp->dwSize < PROPSHEETPAGEW_V1_SIZE) + return 0; + + psp_copy = (PROPSHEETPAGEW*)malloc(psp->dwSize + sizeof(*info)); + if (!psp_copy) + return 0; + memcpy(psp_copy, psp, psp->dwSize); + psp_copy->dwSize += sizeof(*info); + psp_copy->pfnDlgProc = propsheetpage_dlg_procW; + + info = (PSPINFO*)((BYTE*)psp_copy + psp->dwSize); + ret = add_propsheetpage(hcps, psp_copy, info, psp->pfnDlgProc, TRUE); + free(psp_copy); + return ret; +} + +static INT_PTR CALLBACK propsheetpage_dlg_procA(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if (msg == WM_INITDIALOG) + { + PROPSHEETPAGEA *psp = (PROPSHEETPAGEA*)lparam; + PSPINFO *info = (PSPINFO*)((BYTE*)lparam + psp->dwSize - sizeof(*info)); + struct cps_data *cpsp_data = get_handle_data(info->hCPSUIPage); + + psp->dwSize -= sizeof(*info); + psp->pfnDlgProc = cpsp_data->psp->dlg_proc; + SetWindowLongPtrA(hwnd, DWLP_DLGPROC, (LONG_PTR)psp->pfnDlgProc); + return psp->pfnDlgProc(hwnd, msg, wparam, lparam); + } + + return FALSE; +} + +static HANDLE add_propsheetpageA(HANDLE hcps, PROPSHEETPAGEA *psp) +{ + PROPSHEETPAGEA *psp_copy; + PSPINFO *info; + HANDLE ret; + + if (!psp || psp->dwSize < PROPSHEETPAGEW_V1_SIZE) + return 0; + + psp_copy = (PROPSHEETPAGEA*)malloc(psp->dwSize + sizeof(*info)); + if (!psp_copy) + return 0; + memcpy(psp_copy, psp, psp->dwSize); + psp_copy->dwSize += sizeof(*info); + psp_copy->pfnDlgProc = propsheetpage_dlg_procA; + + info = (PSPINFO*)((BYTE*)psp_copy + psp->dwSize); + ret = add_propsheetpage(hcps, psp_copy, info, psp->pfnDlgProc, FALSE); + free(psp_copy); + return ret; +} + static LONG_PTR WINAPI cps_callback(HANDLE hcps, UINT func, LPARAM lparam1, LPARAM lparam2) { TRACE("(%p, %u, %Ix, %Ix\n", hcps, func, lparam1, lparam2); @@ -272,7 +397,10 @@ static LONG_PTR WINAPI cps_callback(HANDLE hcps, UINT func, LPARAM lparam1, LPAR case CPSFUNC_ADD_PFNPROPSHEETUIW: return (LONG_PTR)add_propsheetfunc(hcps, (PFNPROPSHEETUI)lparam1, lparam2, func == CPSFUNC_ADD_PFNPROPSHEETUIW); + case CPSFUNC_ADD_PROPSHEETPAGEA: + return (LONG_PTR)add_propsheetpageA(hcps, (PROPSHEETPAGEA*)lparam1); case CPSFUNC_ADD_PROPSHEETPAGEW: + return (LONG_PTR)add_propsheetpageW(hcps, (PROPSHEETPAGEW*)lparam1); case CPSFUNC_ADD_PCOMPROPSHEETUIA: case CPSFUNC_ADD_PCOMPROPSHEETUIW: case CPSFUNC_DELETE_HCOMPROPSHEET: @@ -284,7 +412,6 @@ static LONG_PTR WINAPI cps_callback(HANDLE hcps, UINT func, LPARAM lparam1, LPAR case CPSFUNC_LOAD_CPSUI_STRINGW: case CPSFUNC_LOAD_CPSUI_ICON: case CPSFUNC_GET_PFNPROPSHEETUI_ICON: - case CPSFUNC_ADD_PROPSHEETPAGEA: case CPSFUNC_INSERT_PSUIPAGEA: case CPSFUNC_INSERT_PSUIPAGEW: case CPSFUNC_SET_PSUIPAGE_TITLEA: diff --git a/dlls/compstui/tests/compstui.c b/dlls/compstui/tests/compstui.c index be63c7645ec..72ac9b93f28 100644 --- a/dlls/compstui/tests/compstui.c +++ b/dlls/compstui/tests/compstui.c @@ -45,6 +45,29 @@ static INT_PTR CALLBACK prop_page_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARA return FALSE; }
+static INT_PTR CALLBACK prop_page_proc2(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if (msg == WM_INITDIALOG) + { + PROPSHEETPAGEW *psp = (PROPSHEETPAGEW*)lparam; + PSPINFO *info = (PSPINFO*)((BYTE*)lparam + psp->dwSize); + HWND dlg = GetParent(hwnd); + + ok(psp->dwSize == sizeof(PROPSHEETPAGEW), "psp->dwSize = %ld\n", psp->dwSize); + ok(psp->pfnDlgProc == prop_page_proc2, "psp->pfnDlgProc != prop_page_proc2\n"); + ok(!psp->lParam, "psp->lParam = %Ix\n", psp->lParam); + + ok(info->cbSize == sizeof(*info), "info->cbSize = %hd\n", info->cbSize); + ok(!info->wReserved, "info->wReserved = %hd\n", info->wReserved); + ok(info->hComPropSheet != NULL, "info->hComPropSheet = NULL\n"); + ok(info->hCPSUIPage != NULL, "info->hCPSUIPage = NULL\n"); + ok(info->pfnComPropSheet != NULL, "info->pfnComPropSheet = NULL\n"); + + PostMessageW(dlg, PSM_SETCURSEL, 1, 0); + } + return FALSE; +} + static LONG WINAPI device_property_sheets(PROPSHEETUI_INFO *info, LPARAM lparam) { ok(info->cbSize == sizeof(*info), "info->cbSize = %hd\n", info->cbSize); @@ -121,6 +144,10 @@ static LONG WINAPI propsheetui_callback(PROPSHEETUI_INFO *info, LPARAM lparam) memset(&psp, 0, sizeof(psp)); psp.dwSize = sizeof(psp); U(psp).pszTemplate = L"prop_page1"; + psp.pfnDlgProc = prop_page_proc2; + ret = info->pfnComPropSheet(info->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGEW, (LPARAM)&psp, 0); + ok(ret, "ret = 0\n"); + psp.pfnDlgProc = prop_page_proc; hpsp = CreatePropertySheetPageW(&psp); ok(hpsp != NULL, "hpsp = %p\n", hpsp); diff --git a/include/ddk/compstui.h b/include/ddk/compstui.h index aa167830207..1563450e26b 100644 --- a/include/ddk/compstui.h +++ b/include/ddk/compstui.h @@ -440,6 +440,15 @@ extern "C" { /* TYPES */ typedef LONG_PTR (CALLBACK *PFNCOMPROPSHEET)(HANDLE, UINT, LPARAM, LPARAM);
+ +typedef struct _PSPINFO { + WORD cbSize; + WORD wReserved; + HANDLE hComPropSheet; + HANDLE hCPSUIPage; + PFNCOMPROPSHEET pfnComPropSheet; +} PSPINFO, *PPSPINFO; + typedef struct _PROPSHEETUI_INFO { WORD cbSize; WORD Version;
From: Piotr Caban piotr@codeweavers.com
--- dlls/compstui/tests/compstui.c | 79 ++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+)
diff --git a/dlls/compstui/tests/compstui.c b/dlls/compstui/tests/compstui.c index 72ac9b93f28..2634875db63 100644 --- a/dlls/compstui/tests/compstui.c +++ b/dlls/compstui/tests/compstui.c @@ -22,6 +22,42 @@
#include "wine/test.h"
+#define DEFINE_EXPECT(func) \ + static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + +#define SET_EXPECT(func) \ + do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0) + +#define CHECK_EXPECT2(func) \ + do { \ + ok(expect_ ##func, "unexpected call " #func "\n"); \ + called_ ## func = TRUE; \ + }while(0) + +#define CHECK_EXPECT(func) \ + do { \ + CHECK_EXPECT2(func); \ + expect_ ## func = FALSE; \ + }while(0) + +#define CHECK_CALLED(func) \ + do { \ + ok(called_ ## func, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +#define CLEAR_CALLED(func) \ + expect_ ## func = called_ ## func = FALSE + +DEFINE_EXPECT(page_proc_WM_INITDIALOG); +DEFINE_EXPECT(page_proc2_WM_INITDIALOG); +DEFINE_EXPECT(device_PROPSHEETUI_REASON_INIT); +DEFINE_EXPECT(device_PROPSHEETUI_REASON_DESTROY); +DEFINE_EXPECT(callback_PROPSHEETUI_REASON_BEFORE_INIT); +DEFINE_EXPECT(callback_PROPSHEETUI_REASON_INIT); +DEFINE_EXPECT(callback_PROPSHEETUI_REASON_GET_INFO_HEADER); +DEFINE_EXPECT(callback_PROPSHEETUI_REASON_DESTROY); + typedef struct { WORD cbSize; WORD Flags; @@ -40,6 +76,8 @@ static INT_PTR CALLBACK prop_page_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARA { HWND dlg = GetParent(hwnd);
+ CHECK_EXPECT(page_proc_WM_INITDIALOG); + PostMessageW(dlg, PSM_PRESSBUTTON, PSBTN_OK, 0); } return FALSE; @@ -53,6 +91,8 @@ static INT_PTR CALLBACK prop_page_proc2(HWND hwnd, UINT msg, WPARAM wparam, LPAR PSPINFO *info = (PSPINFO*)((BYTE*)lparam + psp->dwSize); HWND dlg = GetParent(hwnd);
+ CHECK_EXPECT(page_proc2_WM_INITDIALOG); + ok(psp->dwSize == sizeof(PROPSHEETPAGEW), "psp->dwSize = %ld\n", psp->dwSize); ok(psp->pfnDlgProc == prop_page_proc2, "psp->pfnDlgProc != prop_page_proc2\n"); ok(!psp->lParam, "psp->lParam = %Ix\n", psp->lParam); @@ -70,6 +110,11 @@ static INT_PTR CALLBACK prop_page_proc2(HWND hwnd, UINT msg, WPARAM wparam, LPAR
static LONG WINAPI device_property_sheets(PROPSHEETUI_INFO *info, LPARAM lparam) { + if (info->Reason == PROPSHEETUI_REASON_INIT) + CHECK_EXPECT(device_PROPSHEETUI_REASON_INIT); + else + CHECK_EXPECT(device_PROPSHEETUI_REASON_DESTROY); + ok(info->cbSize == sizeof(*info), "info->cbSize = %hd\n", info->cbSize); ok(info->Version == PROPSHEETUI_INFO_VERSION, "info->Version = %hd\n", info->Version); ok(info->Flags == info->lParamInit ? PSUIINFO_UNICODE : 0, "info->Flags = %hd\n", info->Flags); @@ -98,6 +143,7 @@ static LONG WINAPI propsheetui_callback(PROPSHEETUI_INFO *info, LPARAM lparam) switch(info->Reason) { case PROPSHEETUI_REASON_BEFORE_INIT: + CHECK_EXPECT(callback_PROPSHEETUI_REASON_BEFORE_INIT); ok(!info->Version, "info->Version = %hd\n", info->Version); ok(!info->Flags, "info->Flags = %hd\n", info->Flags); ok(!info->hComPropSheet, "info->hComPropSheet = %p\n", info->hComPropSheet); @@ -105,6 +151,7 @@ static LONG WINAPI propsheetui_callback(PROPSHEETUI_INFO *info, LPARAM lparam) ok(!info->Result, "info->Result = %Ix\n", info->Result); break; case PROPSHEETUI_REASON_INIT: + CHECK_EXPECT(callback_PROPSHEETUI_REASON_INIT); ok(info->Version == PROPSHEETUI_INFO_VERSION, "info->Version = %hd\n", info->Version); ok(info->Flags == PSUIINFO_UNICODE, "info->Flags = %hd\n", info->Flags); ok(info->hComPropSheet != NULL, "info->hComPropSheet = NULL\n"); @@ -113,6 +160,7 @@ static LONG WINAPI propsheetui_callback(PROPSHEETUI_INFO *info, LPARAM lparam) ok(!info->Result, "info->Result = %Ix\n", info->Result); break; case PROPSHEETUI_REASON_GET_INFO_HEADER: + CHECK_EXPECT(callback_PROPSHEETUI_REASON_GET_INFO_HEADER); ok(info->Version == PROPSHEETUI_INFO_VERSION, "info->Version = %hd\n", info->Version); ok(info->Flags == PSUIINFO_UNICODE, "info->Flags = %hd\n", info->Flags); ok(info->hComPropSheet != NULL, "info->hComPropSheet = NULL\n"); @@ -135,11 +183,18 @@ static LONG WINAPI propsheetui_callback(PROPSHEETUI_INFO *info, LPARAM lparam) PROPSHEETPAGEW psp; LONG_PTR ret;
+ SET_EXPECT(device_PROPSHEETUI_REASON_INIT); + SET_EXPECT(device_PROPSHEETUI_REASON_DESTROY); ret = info->pfnComPropSheet(info->hComPropSheet, CPSFUNC_ADD_PFNPROPSHEETUIA, (LPARAM)device_property_sheets, 0); ok(!ret, "ret = %Ix\n", ret); + CHECK_CALLED(device_PROPSHEETUI_REASON_INIT); + CHECK_CALLED(device_PROPSHEETUI_REASON_DESTROY);
+ SET_EXPECT(device_PROPSHEETUI_REASON_INIT); ret = info->pfnComPropSheet(info->hComPropSheet, CPSFUNC_ADD_PFNPROPSHEETUIW, (LPARAM)device_property_sheets, 1); ok(ret, "ret = 0\n"); + CHECK_CALLED(device_PROPSHEETUI_REASON_INIT); + SET_EXPECT(device_PROPSHEETUI_REASON_DESTROY);
memset(&psp, 0, sizeof(psp)); psp.dwSize = sizeof(psp); @@ -156,8 +211,12 @@ static LONG WINAPI propsheetui_callback(PROPSHEETUI_INFO *info, LPARAM lparam) } break; case PROPSHEETUI_REASON_DESTROY: + CHECK_EXPECT(callback_PROPSHEETUI_REASON_DESTROY); if (info->lParamInit & ADD_PAGES) + { + CHECK_CALLED(device_PROPSHEETUI_REASON_DESTROY); ok(lparam, "lparam = 0\n"); + } else ok(!lparam, "lparam = %Ix\n", lparam);
@@ -188,15 +247,35 @@ static void test_CommonPropertySheetUI(void) ok(res == 0xdeadbeef, "res = %lx\n", res); ok(!GetLastError(), "CommonPropertySheetUIW error %ld\n", GetLastError());
+ SET_EXPECT(callback_PROPSHEETUI_REASON_BEFORE_INIT); + SET_EXPECT(callback_PROPSHEETUI_REASON_INIT); + SET_EXPECT(callback_PROPSHEETUI_REASON_GET_INFO_HEADER); + SET_EXPECT(callback_PROPSHEETUI_REASON_DESTROY); res = 0xdeadbeef; ret = CommonPropertySheetUIW((HWND)0x4321, propsheetui_callback, 0, &res); ok(ret == ERR_CPSUI_NO_PROPSHEETPAGE, "CommonPropertySheetUIW returned %ld\n", ret); ok(!res, "res = %lx\n", res); + CLEAR_CALLED(callback_PROPSHEETUI_REASON_BEFORE_INIT); + CHECK_CALLED(callback_PROPSHEETUI_REASON_INIT); + CHECK_CALLED(callback_PROPSHEETUI_REASON_GET_INFO_HEADER); + CHECK_CALLED(callback_PROPSHEETUI_REASON_DESTROY);
+ SET_EXPECT(callback_PROPSHEETUI_REASON_BEFORE_INIT); + SET_EXPECT(callback_PROPSHEETUI_REASON_INIT); + SET_EXPECT(callback_PROPSHEETUI_REASON_GET_INFO_HEADER); + SET_EXPECT(page_proc2_WM_INITDIALOG); + SET_EXPECT(page_proc_WM_INITDIALOG); + SET_EXPECT(callback_PROPSHEETUI_REASON_DESTROY); res = 0xdeadbeef; ret = CommonPropertySheetUIW((HWND)0x4321, propsheetui_callback, ADD_PAGES, &res); ok(ret == CPSUI_OK, "CommonPropertySheetUIW returned %ld\n", ret); ok(!res, "res = %lx\n", res); + CLEAR_CALLED(callback_PROPSHEETUI_REASON_BEFORE_INIT); + CHECK_CALLED(callback_PROPSHEETUI_REASON_INIT); + CHECK_CALLED(callback_PROPSHEETUI_REASON_GET_INFO_HEADER); + CHECK_CALLED(page_proc2_WM_INITDIALOG); + CHECK_CALLED(page_proc_WM_INITDIALOG); + CHECK_CALLED(callback_PROPSHEETUI_REASON_DESTROY); }
START_TEST(compstui)
On Thu Oct 27 18:58:14 2022 +0000, **** wrote:
Marvin replied on the mailing list:
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details: The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=125480 Your paranoid android. === w7u_2qxl (32 bit report) === compstui: compstui.c:255: Test failed: expected callback_PROPSHEETUI_REASON_BEFORE_INIT compstui.c:270: Test failed: expected callback_PROPSHEETUI_REASON_BEFORE_INIT === w7u_adm (32 bit report) === compstui: compstui.c:255: Test failed: expected callback_PROPSHEETUI_REASON_BEFORE_INIT compstui.c:270: Test failed: expected callback_PROPSHEETUI_REASON_BEFORE_INIT === w7u_el (32 bit report) === compstui: compstui.c:255: Test failed: expected callback_PROPSHEETUI_REASON_BEFORE_INIT compstui.c:270: Test failed: expected callback_PROPSHEETUI_REASON_BEFORE_INIT
The PROPSHEETUI_REASON_BEFORE_INIT callback was introduced in Win8. I've changed the tests to make it optional.