[SERVMAN]
[reactos.git] / reactos / base / applications / mscutils / servman / propsheet_logon.c
1 /*
2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/propsheet_logon.c
5 * PURPOSE: Logon property page
6 * COPYRIGHT: Eric Kohl
7 */
8
9 #include "precomp.h"
10
11 #define NDEBUG
12 #include <debug.h>
13
14 typedef struct _LOGONDATA
15 {
16 ENUM_SERVICE_STATUS_PROCESS *pService;
17 LPQUERY_SERVICE_CONFIG pServiceConfig;
18 WCHAR szAccountName[64];
19 WCHAR szPassword1[64];
20 WCHAR szPassword2[64];
21 BOOL bInitial;
22 BOOL bAccountNameChanged;
23 } LOGONDATA, *PLOGONDATA;
24
25 static
26 VOID
27 SetControlStates(
28 HWND hwndDlg,
29 PLOGONDATA pLogonData,
30 BOOL bLocalSystem)
31 {
32 BOOL y = bLocalSystem ? FALSE : TRUE;
33
34 EnableWindow(GetDlgItem(hwndDlg, IDC_LOGON_INTERACTIVE), bLocalSystem);
35 EnableWindow(GetDlgItem(hwndDlg, IDC_LOGON_ACCOUNTNAME), y);
36 EnableWindow(GetDlgItem(hwndDlg, IDC_LOGON_SEARCH), y);
37 EnableWindow(GetDlgItem(hwndDlg, IDC_LOGON_PW1TEXT), y);
38 EnableWindow(GetDlgItem(hwndDlg, IDC_LOGON_PASSWORD1), y);
39 EnableWindow(GetDlgItem(hwndDlg, IDC_LOGON_PW2TEXT), y);
40 EnableWindow(GetDlgItem(hwndDlg, IDC_LOGON_PASSWORD2), y);
41
42 if (bLocalSystem == TRUE && pLogonData->bInitial == FALSE)
43 {
44 GetDlgItemText(hwndDlg, IDC_LOGON_ACCOUNTNAME, pLogonData->szAccountName, 64);
45 GetDlgItemText(hwndDlg, IDC_LOGON_PASSWORD1, pLogonData->szPassword1, 64);
46 GetDlgItemText(hwndDlg, IDC_LOGON_PASSWORD2, pLogonData->szPassword2, 64);
47 }
48
49 SetDlgItemText(hwndDlg, IDC_LOGON_ACCOUNTNAME, bLocalSystem ? L"" : pLogonData->szAccountName);
50 SetDlgItemText(hwndDlg, IDC_LOGON_PASSWORD1, bLocalSystem ? L"" : pLogonData->szPassword1);
51 SetDlgItemText(hwndDlg, IDC_LOGON_PASSWORD2, bLocalSystem ? L"" : pLogonData->szPassword2);
52
53 pLogonData->bInitial = FALSE;
54 }
55
56
57 /*
58 * Logon Property dialog callback.
59 * Controls messages to the Logon dialog
60 */
61 INT_PTR
62 CALLBACK
63 LogonPageProc(
64 HWND hwndDlg,
65 UINT uMsg,
66 WPARAM wParam,
67 LPARAM lParam)
68 {
69 PLOGONDATA pLogonData;
70
71 /* Get the window context */
72 pLogonData = (PLOGONDATA)GetWindowLongPtr(hwndDlg,
73 GWLP_USERDATA);
74 if (pLogonData == NULL && uMsg != WM_INITDIALOG)
75 {
76 return FALSE;
77 }
78
79 switch (uMsg)
80 {
81 case WM_INITDIALOG:
82 pLogonData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOGONDATA));
83 if (pLogonData != NULL)
84 {
85 SetWindowLongPtr(hwndDlg,
86 GWLP_USERDATA,
87 (LONG_PTR)pLogonData);
88
89 pLogonData->bInitial = TRUE;
90 pLogonData->pService = ((PSERVICEPROPSHEET)(((LPPROPSHEETPAGE)lParam)->lParam))->pService;
91
92 pLogonData->pServiceConfig = GetServiceConfig(pLogonData->pService->lpServiceName);
93 if (pLogonData->pServiceConfig != NULL)
94 {
95 if (pLogonData->pServiceConfig->lpServiceStartName == NULL ||
96 _wcsicmp(pLogonData->pServiceConfig->lpServiceStartName, L"LocalSystem") == 0)
97 {
98 PostMessageW(GetDlgItem(hwndDlg, IDC_LOGON_SYSTEMACCOUNT), BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
99 PostMessageW(hwndDlg, WM_COMMAND, IDC_LOGON_SYSTEMACCOUNT, 0);
100 }
101 else
102 {
103 wcscpy(pLogonData->szAccountName, pLogonData->pServiceConfig->lpServiceStartName);
104 PostMessageW(GetDlgItem(hwndDlg, IDC_LOGON_THISACCOUNT), BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
105 PostMessageW(hwndDlg, WM_COMMAND, IDC_LOGON_THISACCOUNT, 0);
106 }
107 }
108 }
109
110 EnableWindow(GetDlgItem(hwndDlg, IDC_LOGON_HWPROFILE), FALSE);
111 break;
112
113 case WM_DESTROY:
114 if (pLogonData->pServiceConfig)
115 HeapFree(GetProcessHeap(), 0, pLogonData->pServiceConfig);
116
117 HeapFree(GetProcessHeap(), 0, pLogonData);
118 break;
119
120 case WM_COMMAND:
121 switch(LOWORD(wParam))
122 {
123 case IDC_LOGON_SYSTEMACCOUNT:
124 SetControlStates(hwndDlg, pLogonData, TRUE);
125 break;
126
127 case IDC_LOGON_THISACCOUNT:
128 SetControlStates(hwndDlg, pLogonData, FALSE);
129 break;
130
131 case IDC_LOGON_ACCOUNTNAME:
132 if (HIWORD(wParam) == EN_CHANGE)
133 {
134 pLogonData->bAccountNameChanged = TRUE;
135 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
136 }
137 break;
138
139
140 }
141 break;
142
143 case WM_NOTIFY:
144 switch (((LPNMHDR)lParam)->code)
145 {
146 case PSN_APPLY:
147 break;
148 }
149 break;
150 }
151
152 return FALSE;
153 }