[MSGINA] Make DLG_DATA object-oriented (#2353)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Tue, 18 Feb 2020 05:35:44 +0000 (14:35 +0900)
committerGitHub <noreply@github.com>
Tue, 18 Feb 2020 05:35:44 +0000 (14:35 +0900)
- Rename hBitmap as hLogoBitmap of DLG_DATA structure.
- Add DlgData_Create. DlgData_LoadBitmaps, and DlgData_Destroy functions.
CORE-16697

dll/win32/msgina/gui.c

index c542d86..dd195d3 100644 (file)
@@ -2,7 +2,8 @@
  * PROJECT:         ReactOS msgina.dll
  * FILE:            dll/win32/msgina/gui.c
  * PURPOSE:         ReactOS Logon GINA DLL
- * PROGRAMMER:      HervĂ© Poussineau (hpoussin@reactos.org)
+ * PROGRAMMERS:     HervĂ© Poussineau (hpoussin@reactos.org)
+ *                  Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
  */
 
 #include "msgina.h"
@@ -30,14 +31,62 @@ typedef struct _LEGALNOTICEDATA
 typedef struct _DLG_DATA
 {
     PGINA_CONTEXT pgContext;
-    HBITMAP hBitmap;
+    HBITMAP hLogoBitmap;
     HBITMAP hBarBitmap;
     UINT_PTR TimerID;
     DWORD BarCounter;
+    DWORD LogoWidth;
+    DWORD LogoHeight;
     DWORD BarWidth;
     DWORD BarHeight;
 } DLG_DATA, *PDLG_DATA;
 
+static PDLG_DATA
+DlgData_Create(HWND hwndDlg)
+{
+    PDLG_DATA pDlgData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*pDlgData));
+    if (pDlgData)
+    {
+        SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)pDlgData);
+    }
+    return pDlgData;
+}
+
+static BOOL
+DlgData_LoadBitmaps(PDLG_DATA pDlgData)
+{
+    BITMAP bm;
+
+    if (!pDlgData)
+        return FALSE;
+
+    pDlgData->hLogoBitmap = LoadImageW(pDlgData->pgContext->hDllInstance,
+                                       MAKEINTRESOURCEW(IDI_ROSLOGO), IMAGE_BITMAP,
+                                       0, 0, LR_DEFAULTCOLOR);
+    GetObject(pDlgData->hLogoBitmap, sizeof(bm), &bm);
+    pDlgData->LogoWidth = bm.bmWidth;
+    pDlgData->LogoHeight = bm.bmHeight;
+
+    pDlgData->hBarBitmap = LoadImageW(hDllInstance, MAKEINTRESOURCEW(IDI_BAR),
+                                      IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
+    GetObject(pDlgData->hBarBitmap, sizeof(bm), &bm);
+    pDlgData->BarWidth = bm.bmWidth;
+    pDlgData->BarHeight = bm.bmHeight;
+
+    return (pDlgData->hLogoBitmap != NULL && pDlgData->hBarBitmap != NULL);
+}
+
+static void
+DlgData_Destroy(PDLG_DATA pDlgData)
+{
+    if (!pDlgData)
+        return;
+
+    DeleteObject(pDlgData->hLogoBitmap);
+    DeleteObject(pDlgData->hBarBitmap);
+    HeapFree(GetProcessHeap(), 0, pDlgData);
+}
+
 static BOOL
 GUIInitialize(
     IN OUT PGINA_CONTEXT pgContext)
@@ -46,7 +95,6 @@ GUIInitialize(
     return TRUE;
 }
 
-
 static
 VOID
 SetWelcomeText(HWND hWnd)
@@ -136,21 +184,12 @@ StatusDialogProc(
             SetDlgItemTextW(hwndDlg, IDC_STATUS_MESSAGE, msg->pMessage);
             SetEvent(msg->StartupEvent);
 
-            pDlgData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DLG_DATA));
-            SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)pDlgData);
-
+            pDlgData = DlgData_Create(hwndDlg);
             if (pDlgData == NULL)
                 return FALSE;
 
-            /* Load the bar bitmap */
-            pDlgData->hBarBitmap = LoadImageW(hDllInstance, MAKEINTRESOURCEW(IDI_BAR), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
-            if (pDlgData->hBarBitmap)
+            if (DlgData_LoadBitmaps(pDlgData))
             {
-                BITMAP bm;
-
-                GetObject(pDlgData->hBarBitmap, sizeof(BITMAP), &bm);
-                pDlgData->BarWidth = bm.bmWidth;
-                pDlgData->BarHeight = bm.bmHeight;
                 pDlgData->TimerID = SetTimer(hwndDlg, -1, 20, NULL);
             }
             return TRUE;
@@ -158,7 +197,7 @@ StatusDialogProc(
 
         case WM_TIMER:
         {
-            if (pDlgData)
+            if (pDlgData && pDlgData->hBarBitmap)
             {
                 /*
                  * Default rotation bar image width is 413 (same as logo)
@@ -202,15 +241,11 @@ StatusDialogProc(
 
         case WM_DESTROY:
         {
-            if (pDlgData)
+            if (pDlgData && pDlgData->hBarBitmap)
             {
-                if (pDlgData->hBarBitmap)
-                {
-                    KillTimer(hwndDlg, pDlgData->TimerID);
-                    DeleteObject(pDlgData->hBarBitmap);
-                }
-                HeapFree(GetProcessHeap(), 0, pDlgData);
+                KillTimer(hwndDlg, pDlgData->TimerID);
             }
+            DlgData_Destroy(pDlgData);
             return TRUE;
         }
     }
@@ -359,34 +394,30 @@ WelcomeDialogProc(
     {
         case WM_INITDIALOG:
         {
-            pDlgData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DLG_DATA));
+            pDlgData = DlgData_Create(hwndDlg);
             if (pDlgData == NULL)
                 return FALSE;
 
-            SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)pDlgData);
-
             pDlgData->pgContext = (PGINA_CONTEXT)lParam;
 
-            /* Load the logo bitmap */
-            pDlgData->hBitmap = LoadImageW(pDlgData->pgContext->hDllInstance, MAKEINTRESOURCEW(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
+            DlgData_LoadBitmaps(pDlgData);
             return TRUE;
         }
 
         case WM_PAINT:
         {
             PAINTSTRUCT ps;
-            if (pDlgData->hBitmap)
+            if (pDlgData && pDlgData->hLogoBitmap)
             {
                 BeginPaint(hwndDlg, &ps);
-                DrawStateW(ps.hdc, NULL, NULL, (LPARAM)pDlgData->hBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
+                DrawStateW(ps.hdc, NULL, NULL, (LPARAM)pDlgData->hLogoBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
                 EndPaint(hwndDlg, &ps);
             }
             return TRUE;
         }
         case WM_DESTROY:
         {
-            DeleteObject(pDlgData->hBitmap);
-            HeapFree(GetProcessHeap(), 0, pDlgData);
+            DlgData_Destroy(pDlgData);
             return TRUE;
         }
     }
@@ -1137,17 +1168,14 @@ LogonDialogProc(
     {
         case WM_INITDIALOG:
         {
-            pDlgData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DLG_DATA));
+            pDlgData = DlgData_Create(hwndDlg);
             if (pDlgData == NULL)
                 return FALSE;
 
-            SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)pDlgData);
-
             /* FIXME: take care of NoDomainUI */
             pDlgData->pgContext = (PGINA_CONTEXT)lParam;
 
-            /* Draw the logo bitmap */
-            pDlgData->hBitmap = LoadImageW(pDlgData->pgContext->hDllInstance, MAKEINTRESOURCEW(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
+            DlgData_LoadBitmaps(pDlgData);
 
             SetWelcomeText(hwndDlg);
 
@@ -1177,18 +1205,17 @@ LogonDialogProc(
         case WM_PAINT:
         {
             PAINTSTRUCT ps;
-            if (pDlgData->hBitmap)
+            if (pDlgData && pDlgData->hLogoBitmap)
             {
                 BeginPaint(hwndDlg, &ps);
-                DrawStateW(ps.hdc, NULL, NULL, (LPARAM)pDlgData->hBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
+                DrawStateW(ps.hdc, NULL, NULL, (LPARAM)pDlgData->hLogoBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
                 EndPaint(hwndDlg, &ps);
             }
             return TRUE;
         }
 
         case WM_DESTROY:
-            DeleteObject(pDlgData->hBitmap);
-            HeapFree(GetProcessHeap(), 0, pDlgData);
+            DlgData_Destroy(pDlgData);
             return TRUE;
 
         case WM_COMMAND:
@@ -1417,12 +1444,10 @@ UnlockDialogProc(
     {
         case WM_INITDIALOG:
         {
-            pDlgData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DLG_DATA));
+            pDlgData = DlgData_Create(hwndDlg);
             if (pDlgData == NULL)
                 return FALSE;
 
-            SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)pDlgData);
-
             pDlgData->pgContext = (PGINA_CONTEXT)lParam;
 
             SetWelcomeText(hwndDlg);
@@ -1435,25 +1460,23 @@ UnlockDialogProc(
             if (pDlgData->pgContext->bDisableCAD)
                 EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), FALSE);
 
-            /* Load the logo bitmap */
-            pDlgData->hBitmap = LoadImageW(pDlgData->pgContext->hDllInstance, MAKEINTRESOURCEW(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
+            DlgData_LoadBitmaps(pDlgData);
             return TRUE;
         }
 
         case WM_PAINT:
         {
             PAINTSTRUCT ps;
-            if (pDlgData->hBitmap)
+            if (pDlgData && pDlgData->hLogoBitmap)
             {
                 BeginPaint(hwndDlg, &ps);
-                DrawStateW(ps.hdc, NULL, NULL, (LPARAM)pDlgData->hBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
+                DrawStateW(ps.hdc, NULL, NULL, (LPARAM)pDlgData->hLogoBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
                 EndPaint(hwndDlg, &ps);
             }
             return TRUE;
         }
         case WM_DESTROY:
-            DeleteObject(pDlgData->hBitmap);
-            HeapFree(GetProcessHeap(), 0, pDlgData);
+            DlgData_Destroy(pDlgData);
             return TRUE;
 
         case WM_COMMAND:
@@ -1517,16 +1540,13 @@ LockedDialogProc(
     {
         case WM_INITDIALOG:
         {
-            pDlgData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DLG_DATA));
+            pDlgData = DlgData_Create(hwndDlg);
             if (pDlgData == NULL)
                 return FALSE;
 
-            SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)pDlgData);
-
             pDlgData->pgContext = (PGINA_CONTEXT)lParam;
 
-            /* Load the logo bitmap */
-            pDlgData->hBitmap = LoadImageW(pDlgData->pgContext->hDllInstance, MAKEINTRESOURCEW(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
+            DlgData_LoadBitmaps(pDlgData);
 
             SetWelcomeText(hwndDlg);
 
@@ -1536,18 +1556,17 @@ LockedDialogProc(
         case WM_PAINT:
         {
             PAINTSTRUCT ps;
-            if (pDlgData->hBitmap)
+            if (pDlgData && pDlgData->hLogoBitmap)
             {
                 BeginPaint(hwndDlg, &ps);
-                DrawStateW(ps.hdc, NULL, NULL, (LPARAM)pDlgData->hBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
+                DrawStateW(ps.hdc, NULL, NULL, (LPARAM)pDlgData->hLogoBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP);
                 EndPaint(hwndDlg, &ps);
             }
             return TRUE;
         }
         case WM_DESTROY:
         {
-            DeleteObject(pDlgData->hBitmap);
-            HeapFree(GetProcessHeap(), 0, pDlgData);
+            DlgData_Destroy(pDlgData);
             return TRUE;
         }
     }