[SERVMAN] Fix return check on PropSheet_IsDialogMessage.
[reactos.git] / base / applications / mscutils / servman / propsheet.c
1 /*
2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/propsheet.c
5 * PURPOSE: Property dialog box message handler
6 * COPYRIGHT: Copyright 2006-2017 Ged Murphy <gedmurphy@reactos.org>
7 *
8 */
9
10 #include "precomp.h"
11
12 unsigned int __stdcall PropSheetThread(void* Param);
13
14 static VOID
15 InitPropSheetPage(PROPSHEETPAGE *psp,
16 PSERVICEPROPSHEET dlgInfo,
17 WORD idDlg,
18 DLGPROC DlgProc)
19 {
20 ZeroMemory(psp, sizeof(PROPSHEETPAGE));
21 psp->dwSize = sizeof(PROPSHEETPAGE);
22 psp->dwFlags = PSP_DEFAULT;
23 psp->hInstance = hInstance;
24 psp->pszTemplate = MAKEINTRESOURCE(idDlg);
25 psp->pfnDlgProc = DlgProc;
26 psp->lParam = (LPARAM)dlgInfo;
27 }
28
29 VOID
30 OpenPropSheet(PMAIN_WND_INFO Info)
31 {
32 PSERVICEPROPSHEET pServicePropSheet;
33 HANDLE hThread;
34
35 pServicePropSheet = HeapAlloc(ProcessHeap,
36 0,
37 sizeof(*pServicePropSheet));
38 if (!pServicePropSheet) return;
39
40 /* Set the current service in this calling thread to avoid
41 * it being updated before the thread is up */
42 pServicePropSheet->pService = Info->pCurrentService;
43 pServicePropSheet->Info = Info;
44
45 hThread = (HANDLE)_beginthreadex(NULL, 0, &PropSheetThread, pServicePropSheet, 0, NULL);
46 if (hThread)
47 {
48 CloseHandle(hThread);
49 }
50 }
51
52
53 unsigned int __stdcall PropSheetThread(void* Param)
54 {
55 PSERVICEPROPSHEET pServicePropSheet;
56 PROPSHEETHEADER psh;
57 PROPSHEETPAGE psp[4];
58 HWND hDlg = NULL;
59 MSG Msg;
60
61 pServicePropSheet = (PSERVICEPROPSHEET)Param;
62
63 ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
64 psh.dwSize = sizeof(PROPSHEETHEADER);
65 psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE | PSH_MODELESS;
66 psh.hwndParent = pServicePropSheet->Info->hMainWnd;
67 psh.hInstance = hInstance;
68 psh.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON));
69 psh.pszCaption = pServicePropSheet->Info->pCurrentService->lpDisplayName;
70 psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
71 psh.nStartPage = 0;
72 psh.ppsp = psp;
73
74 /* Initialize the tabs */
75 InitPropSheetPage(&psp[0], pServicePropSheet, IDD_DLG_GENERAL, GeneralPageProc);
76 InitPropSheetPage(&psp[1], pServicePropSheet, IDD_LOGON, LogonPageProc);
77 InitPropSheetPage(&psp[2], pServicePropSheet, IDD_RECOVERY, RecoveryPageProc);
78 InitPropSheetPage(&psp[3], pServicePropSheet, IDD_DLG_DEPEND, DependenciesPageProc);
79
80 hDlg = (HWND)PropertySheetW(&psh);
81 if (hDlg)
82 {
83 /* Pump the message queue */
84 while (GetMessageW(&Msg, NULL, 0, 0))
85 {
86 if (!PropSheet_GetCurrentPageHwnd(hDlg))
87 {
88 /* The user hit the ok / cancel button, pull it down */
89 EnableWindow(pServicePropSheet->Info->hMainWnd, TRUE);
90 DestroyWindow(hDlg);
91 }
92
93 if (!PropSheet_IsDialogMessage(hDlg, &Msg))
94 {
95 TranslateMessage(&Msg);
96 DispatchMessageW(&Msg);
97 }
98 }
99 }
100
101 HeapFree(GetProcessHeap(), 0, pServicePropSheet);
102
103 return (hDlg != NULL);
104 }
105