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>
13 typedef struct _PAGEDATA
15 PSERVICEPROPSHEET dlgInfo
;
16 BOOL bDisplayNameChanged
;
17 BOOL bDescriptionChanged
;
18 BOOL bBinaryPathChanged
;
19 BOOL bStartTypeChanged
;
20 } PAGEDATA
, *PPAGEDATA
;
24 SetButtonStates(PSERVICEPROPSHEET dlgInfo
,
28 LPQUERY_SERVICE_CONFIG lpServiceConfig
;
32 Flags
= dlgInfo
->pService
->ServiceStatusProcess
.dwControlsAccepted
;
33 State
= dlgInfo
->pService
->ServiceStatusProcess
.dwCurrentState
;
35 for (i
= IDC_START
; i
<= IDC_RESUME
; i
++)
37 hButton
= GetDlgItem(hwndDlg
, i
);
38 EnableWindow (hButton
, FALSE
);
41 lpServiceConfig
= GetServiceConfig(dlgInfo
->pService
->lpServiceName
);
42 if (State
== SERVICE_STOPPED
&&
43 lpServiceConfig
&& lpServiceConfig
->dwStartType
!= SERVICE_DISABLED
)
45 hButton
= GetDlgItem(hwndDlg
, IDC_START
);
46 EnableWindow (hButton
, TRUE
);
48 else if ( (Flags
& SERVICE_ACCEPT_STOP
) && (State
== SERVICE_RUNNING
) )
50 hButton
= GetDlgItem(hwndDlg
, IDC_STOP
);
51 EnableWindow (hButton
, TRUE
);
53 else if ( (Flags
& SERVICE_ACCEPT_PAUSE_CONTINUE
) && (State
== SERVICE_RUNNING
) )
55 hButton
= GetDlgItem(hwndDlg
, IDC_PAUSE
);
56 EnableWindow (hButton
, TRUE
);
59 hButton
= GetDlgItem(hwndDlg
, IDC_START_PARAM
);
60 EnableWindow(hButton
, (State
== SERVICE_STOPPED
&& lpServiceConfig
&& lpServiceConfig
->dwStartType
!= SERVICE_DISABLED
));
63 HeapFree(GetProcessHeap(), 0, lpServiceConfig
);
65 /* set the main toolbar */
66 SetMenuAndButtonStates(dlgInfo
->Info
);
70 SetServiceStatusText(PSERVICEPROPSHEET dlgInfo
,
76 if (dlgInfo
->pService
->ServiceStatusProcess
.dwCurrentState
== SERVICE_RUNNING
)
78 id
= IDS_SERVICES_STARTED
;
82 id
= IDS_SERVICES_STOPPED
;
85 if (AllocAndLoadString(&lpStatus
,
89 SendDlgItemMessageW(hwndDlg
,
99 * Fills the 'startup type' combo box with possible
100 * values and sets it to value of the selected item
103 SetStartupType(LPWSTR lpServiceName
,
107 LPQUERY_SERVICE_CONFIG pServiceConfig
;
112 hList
= GetDlgItem(hwndDlg
, IDC_START_TYPE
);
114 for (i
= IDS_SERVICES_AUTO
; i
<= IDS_SERVICES_DIS
; i
++)
116 if (AllocAndLoadString(&lpBuf
,
128 pServiceConfig
= GetServiceConfig(lpServiceName
);
132 switch (pServiceConfig
->dwStartType
)
134 case SERVICE_AUTO_START
: StartUp
= 0; break;
135 case SERVICE_DEMAND_START
: StartUp
= 1; break;
136 case SERVICE_DISABLED
: StartUp
= 2; break;
144 HeapFree(ProcessHeap
,
151 * Populates the General Properties dialog with
152 * the relevant service information
155 InitGeneralPage(PSERVICEPROPSHEET dlgInfo
,
158 LPQUERY_SERVICE_CONFIG pServiceConfig
;
159 LPWSTR lpDescription
;
161 /* set the service name */
162 SendDlgItemMessageW(hwndDlg
,
166 (LPARAM
)dlgInfo
->pService
->lpServiceName
);
168 /* set the display name */
169 SendDlgItemMessageW(hwndDlg
,
173 (LPARAM
)dlgInfo
->pService
->lpDisplayName
);
175 /* set the description */
176 if ((lpDescription
= GetServiceDescription(dlgInfo
->pService
->lpServiceName
)))
178 SendDlgItemMessageW(hwndDlg
,
182 (LPARAM
)lpDescription
);
184 HeapFree(ProcessHeap
,
189 pServiceConfig
= GetServiceConfig(dlgInfo
->pService
->lpServiceName
);
192 SendDlgItemMessageW(hwndDlg
,
196 (LPARAM
)pServiceConfig
->lpBinaryPathName
);
197 HeapFree(ProcessHeap
,
203 /* set startup type */
204 SetStartupType(dlgInfo
->pService
->lpServiceName
, hwndDlg
);
206 SetServiceStatusText(dlgInfo
,
209 if (dlgInfo
->Info
->bIsUserAnAdmin
)
211 EnableWindow(GetDlgItem(hwndDlg
, IDC_EDIT
), TRUE
);
216 SaveDlgInfo(PPAGEDATA pPageData
,
219 LPQUERY_SERVICE_CONFIG pServiceConfig
= NULL
;
220 PWSTR pDisplayName
= NULL
;
225 pServiceConfig
= HeapAlloc(ProcessHeap
,
227 sizeof(*pServiceConfig
));
230 pServiceConfig
->dwServiceType
= SERVICE_NO_CHANGE
;
231 pServiceConfig
->dwErrorControl
= SERVICE_NO_CHANGE
;
232 pServiceConfig
->dwStartType
= SERVICE_NO_CHANGE
;
234 if (pPageData
->bStartTypeChanged
)
236 StartUp
= SendDlgItemMessageW(hwndDlg
, IDC_START_TYPE
, CB_GETCURSEL
, 0, 0);
240 pServiceConfig
->dwStartType
= SERVICE_AUTO_START
;
244 pServiceConfig
->dwStartType
= SERVICE_DEMAND_START
;
247 pServiceConfig
->dwStartType
= SERVICE_DISABLED
;
252 if (pPageData
->bBinaryPathChanged
)
254 nLength
= SendDlgItemMessageW(hwndDlg
, IDC_EXEPATH
, WM_GETTEXTLENGTH
, 0, 0);
255 pServiceConfig
->lpBinaryPathName
= HeapAlloc(ProcessHeap
,
257 (nLength
+ 1) * sizeof(WCHAR
));
258 if (pServiceConfig
->lpBinaryPathName
!= NULL
)
259 SendDlgItemMessageW(hwndDlg
, IDC_EXEPATH
, WM_GETTEXT
, nLength
+ 1, (LPARAM
)pServiceConfig
->lpBinaryPathName
);
262 if (pPageData
->bDisplayNameChanged
)
264 nLength
= SendDlgItemMessageW(hwndDlg
, IDC_DISP_NAME
, WM_GETTEXTLENGTH
, 0, 0);
265 pDisplayName
= HeapAlloc(ProcessHeap
,
267 (nLength
+ 1) * sizeof(WCHAR
));
268 if (pDisplayName
!= NULL
)
270 SendDlgItemMessageW(hwndDlg
, IDC_DISP_NAME
, WM_GETTEXT
, nLength
+ 1, (LPARAM
)pDisplayName
);
272 if (pPageData
->dlgInfo
->pService
->lpDisplayName
)
273 HeapFree(ProcessHeap
, 0, pPageData
->dlgInfo
->pService
->lpDisplayName
);
275 pPageData
->dlgInfo
->pService
->lpDisplayName
= pDisplayName
;
276 pServiceConfig
->lpDisplayName
= pDisplayName
;
280 if (SetServiceConfig(pServiceConfig
,
281 pPageData
->dlgInfo
->pService
->lpServiceName
,
284 if (pPageData
->bDisplayNameChanged
)
285 ChangeListViewText(pPageData
->dlgInfo
->Info
,
286 pPageData
->dlgInfo
->pService
,
289 if (pPageData
->bStartTypeChanged
)
290 ChangeListViewText(pPageData
->dlgInfo
->Info
,
291 pPageData
->dlgInfo
->pService
,
295 if (pServiceConfig
->lpBinaryPathName
!= NULL
)
296 HeapFree(ProcessHeap
, 0, pServiceConfig
->lpBinaryPathName
);
298 HeapFree(ProcessHeap
, 0, pServiceConfig
);
301 if (pPageData
->bDescriptionChanged
)
303 nLength
= SendDlgItemMessageW(hwndDlg
, IDC_DESCRIPTION
, WM_GETTEXTLENGTH
, 0, 0);
304 pDescription
= HeapAlloc(ProcessHeap
, HEAP_ZERO_MEMORY
, (nLength
+ 1) * sizeof(WCHAR
));
305 if (pDescription
!= NULL
)
307 SendDlgItemMessageW(hwndDlg
, IDC_DESCRIPTION
, WM_GETTEXT
, nLength
+ 1, (LPARAM
)pDescription
);
309 if (SetServiceDescription(pPageData
->dlgInfo
->pService
->lpServiceName
,
312 ChangeListViewText(pPageData
->dlgInfo
->Info
,
313 pPageData
->dlgInfo
->pService
,
317 HeapFree(ProcessHeap
, 0, pDescription
);
323 * General Property dialog callback.
324 * Controls messages to the General dialog
327 GeneralPageProc(HWND hwndDlg
,
334 /* Get the window context */
335 pPageData
= (PPAGEDATA
)GetWindowLongPtr(hwndDlg
,
337 if (pPageData
== NULL
&& uMsg
!= WM_INITDIALOG
)
345 pPageData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(PAGEDATA
));
346 if (pPageData
!= NULL
)
348 SetWindowLongPtr(hwndDlg
,
350 (LONG_PTR
)pPageData
);
352 pPageData
->dlgInfo
= (PSERVICEPROPSHEET
)(((LPPROPSHEETPAGE
)lParam
)->lParam
);
353 if (pPageData
->dlgInfo
!= NULL
)
355 InitGeneralPage(pPageData
->dlgInfo
, hwndDlg
);
356 SetButtonStates(pPageData
->dlgInfo
, hwndDlg
);
362 HeapFree(GetProcessHeap(), 0, pPageData
);
366 switch(LOWORD(wParam
))
369 if (HIWORD(wParam
) == CBN_SELCHANGE
)
371 pPageData
->bStartTypeChanged
= TRUE
;
372 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
377 if (HIWORD(wParam
) == EN_CHANGE
)
379 pPageData
->bDisplayNameChanged
= TRUE
;
380 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
384 case IDC_DESCRIPTION
:
385 if (HIWORD(wParam
) == EN_CHANGE
)
387 pPageData
->bDescriptionChanged
= TRUE
;
388 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
393 if (HIWORD(wParam
) == EN_CHANGE
)
395 pPageData
->bBinaryPathChanged
= TRUE
;
396 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
402 WCHAR szStartParams
[256];
403 LPWSTR lpStartParams
= NULL
;
405 if (GetDlgItemText(hwndDlg
, IDC_START_PARAM
, szStartParams
, 256) > 0)
406 lpStartParams
= szStartParams
;
408 EnableWindow(GetDlgItem(hwndDlg
, IDC_START_PARAM
), FALSE
);
410 RunActionWithProgress(hwndDlg
,
411 pPageData
->dlgInfo
->pService
->lpServiceName
,
412 pPageData
->dlgInfo
->pService
->lpDisplayName
,
416 UpdateServiceStatus(pPageData
->dlgInfo
->pService
);
417 ChangeListViewText(pPageData
->dlgInfo
->Info
, pPageData
->dlgInfo
->pService
, LVSTATUS
);
418 SetButtonStates(pPageData
->dlgInfo
, hwndDlg
);
419 SetServiceStatusText(pPageData
->dlgInfo
, hwndDlg
);
424 RunActionWithProgress(hwndDlg
,
425 pPageData
->dlgInfo
->pService
->lpServiceName
,
426 pPageData
->dlgInfo
->pService
->lpDisplayName
,
430 UpdateServiceStatus(pPageData
->dlgInfo
->pService
);
431 ChangeListViewText(pPageData
->dlgInfo
->Info
, pPageData
->dlgInfo
->pService
, LVSTATUS
);
432 SetButtonStates(pPageData
->dlgInfo
, hwndDlg
);
433 SetServiceStatusText(pPageData
->dlgInfo
, hwndDlg
);
437 RunActionWithProgress(hwndDlg
,
438 pPageData
->dlgInfo
->pService
->lpServiceName
,
439 pPageData
->dlgInfo
->pService
->lpDisplayName
,
443 UpdateServiceStatus(pPageData
->dlgInfo
->pService
);
444 ChangeListViewText(pPageData
->dlgInfo
->Info
, pPageData
->dlgInfo
->pService
, LVSTATUS
);
445 SetButtonStates(pPageData
->dlgInfo
, hwndDlg
);
446 SetServiceStatusText(pPageData
->dlgInfo
, hwndDlg
);
450 RunActionWithProgress(hwndDlg
,
451 pPageData
->dlgInfo
->pService
->lpServiceName
,
452 pPageData
->dlgInfo
->pService
->lpDisplayName
,
456 UpdateServiceStatus(pPageData
->dlgInfo
->pService
);
457 ChangeListViewText(pPageData
->dlgInfo
->Info
, pPageData
->dlgInfo
->pService
, LVSTATUS
);
458 SetButtonStates(pPageData
->dlgInfo
, hwndDlg
);
459 SetServiceStatusText(pPageData
->dlgInfo
, hwndDlg
);
463 SendDlgItemMessage(hwndDlg
, IDC_DISP_NAME
, EM_SETREADONLY
, FALSE
, 0);
464 SendDlgItemMessage(hwndDlg
, IDC_DESCRIPTION
, EM_SETREADONLY
, FALSE
, 0);
465 SendDlgItemMessage(hwndDlg
, IDC_EXEPATH
, EM_SETREADONLY
, FALSE
, 0);
466 EnableWindow(GetDlgItem(hwndDlg
, IDC_EDIT
), FALSE
);
472 switch (((LPNMHDR
)lParam
)->code
)
475 if (pPageData
->bDisplayNameChanged
||
476 pPageData
->bDescriptionChanged
||
477 pPageData
->bBinaryPathChanged
||
478 pPageData
->bStartTypeChanged
)
480 SaveDlgInfo(pPageData
, hwndDlg
);
481 SetButtonStates(pPageData
->dlgInfo
, hwndDlg
);
482 pPageData
->bDisplayNameChanged
= FALSE
;
483 pPageData
->bDescriptionChanged
= FALSE
;
484 pPageData
->bBinaryPathChanged
= FALSE
;
485 pPageData
->bStartTypeChanged
= FALSE
;