5575edd6d53a2f5d8a9b5520ffe7f0a243af2dfd
[reactos.git] / reactos / base / applications / mscutils / servman / propsheet_general.c
1 /*
2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/propsheet_general.c
5 * PURPOSE: Property dialog box message handler
6 * COPYRIGHT: Copyright 2006-2009 Ged Murphy <gedmurphy@reactos.org>
7 *
8 */
9
10 #include "precomp.h"
11
12
13 typedef struct _PAGEDATA
14 {
15 PSERVICEPROPSHEET dlgInfo;
16 BOOL bPageChanged;
17 } PAGEDATA, *PPAGEDATA;
18
19
20 static VOID
21 SetButtonStates(PSERVICEPROPSHEET dlgInfo,
22 HWND hwndDlg)
23 {
24 HWND hButton;
25 LPQUERY_SERVICE_CONFIG lpServiceConfig;
26 DWORD Flags, State;
27 UINT i;
28
29 Flags = dlgInfo->pService->ServiceStatusProcess.dwControlsAccepted;
30 State = dlgInfo->pService->ServiceStatusProcess.dwCurrentState;
31
32 for (i = IDC_START; i <= IDC_RESUME; i++)
33 {
34 hButton = GetDlgItem(hwndDlg, i);
35 EnableWindow (hButton, FALSE);
36 }
37
38 lpServiceConfig = GetServiceConfig(dlgInfo->pService->lpServiceName);
39 if (State == SERVICE_STOPPED &&
40 lpServiceConfig && lpServiceConfig->dwStartType != SERVICE_DISABLED)
41 {
42 hButton = GetDlgItem(hwndDlg, IDC_START);
43 EnableWindow (hButton, TRUE);
44 }
45 else if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )
46 {
47 hButton = GetDlgItem(hwndDlg, IDC_STOP);
48 EnableWindow (hButton, TRUE);
49 }
50 else if ( (Flags & SERVICE_ACCEPT_PAUSE_CONTINUE) && (State == SERVICE_RUNNING) )
51 {
52 hButton = GetDlgItem(hwndDlg, IDC_PAUSE);
53 EnableWindow (hButton, TRUE);
54 }
55
56 if(lpServiceConfig)
57 HeapFree(GetProcessHeap(), 0, lpServiceConfig);
58
59 hButton = GetDlgItem(hwndDlg, IDC_START_PARAM);
60 EnableWindow(hButton, (State == SERVICE_STOPPED));
61
62 /* set the main toolbar */
63 SetMenuAndButtonStates(dlgInfo->Info);
64 }
65
66 static VOID
67 SetServiceStatusText(PSERVICEPROPSHEET dlgInfo,
68 HWND hwndDlg)
69 {
70 LPWSTR lpStatus;
71 UINT id;
72
73 if (dlgInfo->pService->ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)
74 {
75 id = IDS_SERVICES_STARTED;
76 }
77 else
78 {
79 id = IDS_SERVICES_STOPPED;
80 }
81
82 if (AllocAndLoadString(&lpStatus,
83 hInstance,
84 id))
85 {
86 SendDlgItemMessageW(hwndDlg,
87 IDC_SERV_STATUS,
88 WM_SETTEXT,
89 0,
90 (LPARAM)lpStatus);
91 LocalFree(lpStatus);
92 }
93 }
94
95 /*
96 * Fills the 'startup type' combo box with possible
97 * values and sets it to value of the selected item
98 */
99 static VOID
100 SetStartupType(LPWSTR lpServiceName,
101 HWND hwndDlg)
102 {
103 HWND hList;
104 LPQUERY_SERVICE_CONFIG pServiceConfig;
105 LPWSTR lpBuf;
106 DWORD StartUp = 0;
107 UINT i;
108
109 hList = GetDlgItem(hwndDlg, IDC_START_TYPE);
110
111 for (i = IDS_SERVICES_AUTO; i <= IDS_SERVICES_DIS; i++)
112 {
113 if (AllocAndLoadString(&lpBuf,
114 hInstance,
115 i))
116 {
117 SendMessageW(hList,
118 CB_ADDSTRING,
119 0,
120 (LPARAM)lpBuf);
121 LocalFree(lpBuf);
122 }
123 }
124
125 pServiceConfig = GetServiceConfig(lpServiceName);
126
127 if (pServiceConfig)
128 {
129 switch (pServiceConfig->dwStartType)
130 {
131 case SERVICE_AUTO_START: StartUp = 0; break;
132 case SERVICE_DEMAND_START: StartUp = 1; break;
133 case SERVICE_DISABLED: StartUp = 2; break;
134 }
135
136 SendMessageW(hList,
137 CB_SETCURSEL,
138 StartUp,
139 0);
140
141 HeapFree(ProcessHeap,
142 0,
143 pServiceConfig);
144 }
145 }
146
147 /*
148 * Populates the General Properties dialog with
149 * the relevant service information
150 */
151 static VOID
152 InitGeneralPage(PSERVICEPROPSHEET dlgInfo,
153 HWND hwndDlg)
154 {
155 LPQUERY_SERVICE_CONFIG pServiceConfig;
156 LPWSTR lpDescription;
157
158 /* set the service name */
159 SendDlgItemMessageW(hwndDlg,
160 IDC_SERV_NAME,
161 WM_SETTEXT,
162 0,
163 (LPARAM)dlgInfo->pService->lpServiceName);
164
165 /* set the display name */
166 SendDlgItemMessageW(hwndDlg,
167 IDC_DISP_NAME,
168 WM_SETTEXT,
169 0,
170 (LPARAM)dlgInfo->pService->lpDisplayName);
171
172 /* set the description */
173 if ((lpDescription = GetServiceDescription(dlgInfo->pService->lpServiceName)))
174 {
175 SendDlgItemMessageW(hwndDlg,
176 IDC_DESCRIPTION,
177 WM_SETTEXT,
178 0,
179 (LPARAM)lpDescription);
180
181 HeapFree(ProcessHeap,
182 0,
183 lpDescription);
184 }
185
186 pServiceConfig = GetServiceConfig(dlgInfo->pService->lpServiceName);
187 if (pServiceConfig)
188 {
189 SendDlgItemMessageW(hwndDlg,
190 IDC_EXEPATH,
191 WM_SETTEXT,
192 0,
193 (LPARAM)pServiceConfig->lpBinaryPathName);
194 HeapFree(ProcessHeap,
195 0,
196 pServiceConfig);
197 }
198
199
200 /* set startup type */
201 SetStartupType(dlgInfo->pService->lpServiceName, hwndDlg);
202
203 SetServiceStatusText(dlgInfo,
204 hwndDlg);
205
206 if (dlgInfo->Info->bIsUserAnAdmin)
207 {
208 EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT), TRUE);
209 }
210 }
211
212 VOID
213 SaveDlgInfo(PSERVICEPROPSHEET dlgInfo,
214 HWND hwndDlg)
215 {
216 LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
217 HWND hList;
218 DWORD StartUp;
219
220 pServiceConfig = HeapAlloc(ProcessHeap,
221 HEAP_ZERO_MEMORY,
222 sizeof(*pServiceConfig));
223 if (pServiceConfig)
224 {
225 pServiceConfig->dwServiceType = SERVICE_NO_CHANGE;
226 pServiceConfig->dwErrorControl = SERVICE_NO_CHANGE;
227
228 hList = GetDlgItem(hwndDlg, IDC_START_TYPE);
229 StartUp = SendMessage(hList,
230 CB_GETCURSEL,
231 0,
232 0);
233 switch (StartUp)
234 {
235 case 0: pServiceConfig->dwStartType = SERVICE_AUTO_START; break;
236 case 1: pServiceConfig->dwStartType = SERVICE_DEMAND_START; break;
237 case 2: pServiceConfig->dwStartType = SERVICE_DISABLED; break;
238 }
239
240 if (SetServiceConfig(pServiceConfig,
241 dlgInfo->pService->lpServiceName,
242 NULL))
243 {
244 ChangeListViewText(dlgInfo->Info,
245 dlgInfo->pService,
246 LVSTARTUP);
247 }
248
249 HeapFree(ProcessHeap,
250 0,
251 pServiceConfig);
252 }
253 }
254
255 /*
256 * General Property dialog callback.
257 * Controls messages to the General dialog
258 */
259 INT_PTR CALLBACK
260 GeneralPageProc(HWND hwndDlg,
261 UINT uMsg,
262 WPARAM wParam,
263 LPARAM lParam)
264 {
265 PPAGEDATA pPageData;
266
267 /* Get the window context */
268 pPageData = (PPAGEDATA)GetWindowLongPtr(hwndDlg,
269 GWLP_USERDATA);
270 if (pPageData == NULL && uMsg != WM_INITDIALOG)
271 {
272 return FALSE;
273 }
274
275 switch (uMsg)
276 {
277 case WM_INITDIALOG:
278 pPageData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PAGEDATA));
279 if (pPageData != NULL)
280 {
281 SetWindowLongPtr(hwndDlg,
282 GWLP_USERDATA,
283 (LONG_PTR)pPageData);
284
285 pPageData->dlgInfo = (PSERVICEPROPSHEET)(((LPPROPSHEETPAGE)lParam)->lParam);
286 if (pPageData->dlgInfo != NULL)
287 {
288 InitGeneralPage(pPageData->dlgInfo, hwndDlg);
289 SetButtonStates(pPageData->dlgInfo, hwndDlg);
290 }
291 }
292 break;
293
294 case WM_DESTROY:
295 HeapFree(GetProcessHeap(), 0, pPageData);
296 break;
297
298 case WM_COMMAND:
299 switch(LOWORD(wParam))
300 {
301 case IDC_START_TYPE:
302 if (HIWORD(wParam) == CBN_SELCHANGE)
303 {
304 pPageData->bPageChanged = TRUE;
305 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
306 }
307 break;
308
309 case IDC_START:
310 {
311 WCHAR szStartParams[256];
312 LPWSTR lpStartParams = NULL;
313
314 if (GetDlgItemText(hwndDlg, IDC_START_PARAM, szStartParams, 256) > 0)
315 lpStartParams = szStartParams;
316
317 RunActionWithProgress(hwndDlg,
318 pPageData->dlgInfo->pService->lpServiceName,
319 pPageData->dlgInfo->pService->lpDisplayName,
320 ACTION_START,
321 lpStartParams);
322
323 UpdateServiceStatus(pPageData->dlgInfo->pService);
324 ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
325 SetButtonStates(pPageData->dlgInfo, hwndDlg);
326 SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
327 break;
328 }
329
330 case IDC_STOP:
331 RunActionWithProgress(hwndDlg,
332 pPageData->dlgInfo->pService->lpServiceName,
333 pPageData->dlgInfo->pService->lpDisplayName,
334 ACTION_STOP,
335 NULL);
336
337 UpdateServiceStatus(pPageData->dlgInfo->pService);
338 ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
339 SetButtonStates(pPageData->dlgInfo, hwndDlg);
340 SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
341 break;
342
343 case IDC_PAUSE:
344 RunActionWithProgress(hwndDlg,
345 pPageData->dlgInfo->pService->lpServiceName,
346 pPageData->dlgInfo->pService->lpDisplayName,
347 ACTION_PAUSE,
348 NULL);
349
350 UpdateServiceStatus(pPageData->dlgInfo->pService);
351 ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
352 SetButtonStates(pPageData->dlgInfo, hwndDlg);
353 SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
354 break;
355
356 case IDC_RESUME:
357 RunActionWithProgress(hwndDlg,
358 pPageData->dlgInfo->pService->lpServiceName,
359 pPageData->dlgInfo->pService->lpDisplayName,
360 ACTION_RESUME,
361 NULL);
362
363 UpdateServiceStatus(pPageData->dlgInfo->pService);
364 ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
365 SetButtonStates(pPageData->dlgInfo, hwndDlg);
366 SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
367 break;
368
369 case IDC_EDIT:
370 SendDlgItemMessage(hwndDlg, IDC_DISP_NAME, EM_SETREADONLY, FALSE, 0);
371 SendDlgItemMessage(hwndDlg, IDC_DESCRIPTION, EM_SETREADONLY, FALSE, 0);
372 SendDlgItemMessage(hwndDlg, IDC_EXEPATH, EM_SETREADONLY, FALSE, 0);
373 break;
374
375 case IDC_DISP_NAME:
376 case IDC_DESCRIPTION:
377 case IDC_EXEPATH:
378 case IDC_START_PARAM:
379 if (HIWORD(wParam) == EN_CHANGE)
380 {
381 pPageData->bPageChanged = TRUE;
382 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
383 }
384 break;
385 }
386 break;
387
388 case WM_NOTIFY:
389 switch (((LPNMHDR)lParam)->code)
390 {
391 case PSN_APPLY:
392 if (pPageData->bPageChanged)
393 {
394 SaveDlgInfo(pPageData->dlgInfo, hwndDlg);
395 SetButtonStates(pPageData->dlgInfo, hwndDlg);
396 pPageData->bPageChanged = FALSE;
397 }
398 break;
399 }
400 break;
401 }
402
403 return FALSE;
404 }