[PATCH 2/2] comctl32/propsheet: Implement PSPCB_ADDREF/PSPCB_RELEASE notifications

Nikolay Sivov nsivov at codeweavers.com
Wed Mar 1 13:47:21 CST 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/comctl32/propsheet.c       | 41 +++++++++++++++++++++++++++++++++++------
 dlls/comctl32/tests/propsheet.c |  4 ----
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c
index 88a44cd15d..0cfc799734 100644
--- a/dlls/comctl32/propsheet.c
+++ b/dlls/comctl32/propsheet.c
@@ -2962,10 +2962,20 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
     if (lpPropSheetPage->dwSize < PROPSHEETPAGEA_V1_SIZE)
         return NULL;
 
-    ppsp = Alloc(sizeof(PROPSHEETPAGEW));
-  memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEA)));
+    /* original data is used for callback notifications */
+    if ((lpPropSheetPage->dwFlags & PSP_USECALLBACK) && lpPropSheetPage->pfnCallback)
+    {
+        ppsp = Alloc(2 * sizeof(*ppsp));
+        memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
+        memcpy(ppsp + 1, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
+    }
+    else
+    {
+        ppsp = Alloc(sizeof(*ppsp));
+        memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
+    }
 
-  ppsp->dwFlags &= ~ PSP_INTERNAL_UNICODE;
+    ppsp->dwFlags &= ~PSP_INTERNAL_UNICODE;
 
     if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) )
     {
@@ -3017,6 +3027,9 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
     else
         ppsp->pszHeaderSubTitle = NULL;
 
+    if ((ppsp->dwFlags & PSP_USECALLBACK) && ppsp->dwSize > PROPSHEETPAGEA_V1_SIZE && ppsp->pfnCallback)
+        ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp + 1);
+
     return (HPROPSHEETPAGE)ppsp;
 }
 
@@ -3032,10 +3045,20 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage
     if (lpPropSheetPage->dwSize < PROPSHEETPAGEW_V1_SIZE)
         return NULL;
 
-    ppsp = Alloc(sizeof(PROPSHEETPAGEW));
-  memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEW)));
+    /* original data is used for callback notifications */
+    if ((lpPropSheetPage->dwFlags & PSP_USECALLBACK) && lpPropSheetPage->pfnCallback)
+    {
+        ppsp = Alloc(2 * sizeof(*ppsp));
+        memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
+        memcpy(ppsp + 1, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
+    }
+    else
+    {
+        ppsp = Alloc(sizeof(*ppsp));
+        memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
+    }
 
-  ppsp->dwFlags |= PSP_INTERNAL_UNICODE;
+    ppsp->dwFlags |= PSP_INTERNAL_UNICODE;
 
     if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) )
     {
@@ -3067,6 +3090,9 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage
     else
         ppsp->pszHeaderSubTitle = NULL;
 
+    if ((ppsp->dwFlags & PSP_USECALLBACK) && ppsp->dwSize > PROPSHEETPAGEW_V1_SIZE && ppsp->pfnCallback)
+        ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp + 1);
+
     return (HPROPSHEETPAGE)ppsp;
 }
 
@@ -3088,6 +3114,9 @@ BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
   if (!psp)
      return FALSE;
 
+  if ((psp->dwFlags & PSP_USECALLBACK) && psp->pfnCallback)
+     psp->pfnCallback(0, PSPCB_RELEASE, psp + 1);
+
   if (!(psp->dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE( psp->u.pszTemplate ))
      Free ((LPVOID)psp->u.pszTemplate);
 
diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c
index 8a4e6d187c..9405965a13 100644
--- a/dlls/comctl32/tests/propsheet.c
+++ b/dlls/comctl32/tests/propsheet.c
@@ -1080,7 +1080,6 @@ static void test_CreatePropertySheetPage(void)
         else
         {
             ok(hpsp != NULL, "Failed to create a page, size %u\n", page.u.pageA.dwSize);
-        todo_wine_if(page.u.pageA.dwSize > PROPSHEETPAGEA_V1_SIZE)
             ok(page.addref_called == (page.u.pageA.dwSize > PROPSHEETPAGEA_V1_SIZE) ? 1 : 0, "Expected ADDREF callback message\n");
         }
 
@@ -1089,7 +1088,6 @@ static void test_CreatePropertySheetPage(void)
             page.release_called = 0;
             ret = DestroyPropertySheetPage(hpsp);
             ok(ret, "Failed to destroy a page\n");
-        todo_wine
             ok(page.release_called == 1, "Expected RELEASE callback message\n");
         }
     }
@@ -1111,7 +1109,6 @@ static void test_CreatePropertySheetPage(void)
         else
         {
             ok(hpsp != NULL, "Failed to create a page, size %u\n", page.u.pageW.dwSize);
-        todo_wine_if(page.u.pageW.dwSize > PROPSHEETPAGEW_V1_SIZE)
             ok(page.addref_called == (page.u.pageW.dwSize > PROPSHEETPAGEW_V1_SIZE) ? 1 : 0, "Expected ADDREF callback message\n");
         }
 
@@ -1120,7 +1117,6 @@ static void test_CreatePropertySheetPage(void)
             page.release_called = 0;
             ret = DestroyPropertySheetPage(hpsp);
             ok(ret, "Failed to destroy a page\n");
-        todo_wine
             ok(page.release_called == 1, "Expected RELEASE callback message\n");
         }
     }
-- 
2.11.0




More information about the wine-patches mailing list