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 
106