mirror of
https://github.com/reactos/reactos.git
synced 2024-08-28 22:28:36 +00:00
494 lines
16 KiB
C
494 lines
16 KiB
C
/*
|
|
* PROJECT: ReactOS Services
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
* FILE: base/applications/mscutils/servman/propsheet_general.c
|
|
* PURPOSE: Property dialog box message handler
|
|
* COPYRIGHT: Copyright 2006-2009 Ged Murphy <gedmurphy@reactos.org>
|
|
*
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
typedef struct _PAGEDATA
|
|
{
|
|
PSERVICEPROPSHEET dlgInfo;
|
|
BOOL bDisplayNameChanged;
|
|
BOOL bDescriptionChanged;
|
|
BOOL bBinaryPathChanged;
|
|
BOOL bStartTypeChanged;
|
|
} PAGEDATA, *PPAGEDATA;
|
|
|
|
|
|
static VOID
|
|
SetButtonStates(PSERVICEPROPSHEET dlgInfo,
|
|
HWND hwndDlg)
|
|
{
|
|
HWND hButton;
|
|
LPQUERY_SERVICE_CONFIG lpServiceConfig;
|
|
DWORD Flags, State;
|
|
UINT i;
|
|
|
|
Flags = dlgInfo->pService->ServiceStatusProcess.dwControlsAccepted;
|
|
State = dlgInfo->pService->ServiceStatusProcess.dwCurrentState;
|
|
|
|
for (i = IDC_START; i <= IDC_RESUME; i++)
|
|
{
|
|
hButton = GetDlgItem(hwndDlg, i);
|
|
EnableWindow (hButton, FALSE);
|
|
}
|
|
|
|
lpServiceConfig = GetServiceConfig(dlgInfo->pService->lpServiceName);
|
|
if (State == SERVICE_STOPPED &&
|
|
lpServiceConfig && lpServiceConfig->dwStartType != SERVICE_DISABLED)
|
|
{
|
|
hButton = GetDlgItem(hwndDlg, IDC_START);
|
|
EnableWindow (hButton, TRUE);
|
|
}
|
|
else if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )
|
|
{
|
|
hButton = GetDlgItem(hwndDlg, IDC_STOP);
|
|
EnableWindow (hButton, TRUE);
|
|
}
|
|
else if ( (Flags & SERVICE_ACCEPT_PAUSE_CONTINUE) && (State == SERVICE_RUNNING) )
|
|
{
|
|
hButton = GetDlgItem(hwndDlg, IDC_PAUSE);
|
|
EnableWindow (hButton, TRUE);
|
|
}
|
|
|
|
hButton = GetDlgItem(hwndDlg, IDC_START_PARAM);
|
|
EnableWindow(hButton, (State == SERVICE_STOPPED && lpServiceConfig && lpServiceConfig->dwStartType != SERVICE_DISABLED));
|
|
|
|
if (lpServiceConfig)
|
|
HeapFree(GetProcessHeap(), 0, lpServiceConfig);
|
|
|
|
/* set the main toolbar */
|
|
SetMenuAndButtonStates(dlgInfo->Info);
|
|
}
|
|
|
|
static VOID
|
|
SetServiceStatusText(PSERVICEPROPSHEET dlgInfo,
|
|
HWND hwndDlg)
|
|
{
|
|
LPWSTR lpStatus;
|
|
UINT id;
|
|
|
|
if (dlgInfo->pService->ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING)
|
|
{
|
|
id = IDS_SERVICES_STARTED;
|
|
}
|
|
else
|
|
{
|
|
id = IDS_SERVICES_STOPPED;
|
|
}
|
|
|
|
if (AllocAndLoadString(&lpStatus,
|
|
hInstance,
|
|
id))
|
|
{
|
|
SendDlgItemMessageW(hwndDlg,
|
|
IDC_SERV_STATUS,
|
|
WM_SETTEXT,
|
|
0,
|
|
(LPARAM)lpStatus);
|
|
LocalFree(lpStatus);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Fills the 'startup type' combo box with possible
|
|
* values and sets it to value of the selected item
|
|
*/
|
|
static VOID
|
|
SetStartupType(LPWSTR lpServiceName,
|
|
HWND hwndDlg)
|
|
{
|
|
HWND hList;
|
|
LPQUERY_SERVICE_CONFIG pServiceConfig;
|
|
LPWSTR lpBuf;
|
|
DWORD StartUp = 0;
|
|
UINT i;
|
|
|
|
hList = GetDlgItem(hwndDlg, IDC_START_TYPE);
|
|
|
|
for (i = IDS_SERVICES_AUTO; i <= IDS_SERVICES_DIS; i++)
|
|
{
|
|
if (AllocAndLoadString(&lpBuf,
|
|
hInstance,
|
|
i))
|
|
{
|
|
SendMessageW(hList,
|
|
CB_ADDSTRING,
|
|
0,
|
|
(LPARAM)lpBuf);
|
|
LocalFree(lpBuf);
|
|
}
|
|
}
|
|
|
|
pServiceConfig = GetServiceConfig(lpServiceName);
|
|
|
|
if (pServiceConfig)
|
|
{
|
|
switch (pServiceConfig->dwStartType)
|
|
{
|
|
case SERVICE_AUTO_START: StartUp = 0; break;
|
|
case SERVICE_DEMAND_START: StartUp = 1; break;
|
|
case SERVICE_DISABLED: StartUp = 2; break;
|
|
}
|
|
|
|
SendMessageW(hList,
|
|
CB_SETCURSEL,
|
|
StartUp,
|
|
0);
|
|
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
pServiceConfig);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Populates the General Properties dialog with
|
|
* the relevant service information
|
|
*/
|
|
static VOID
|
|
InitGeneralPage(PSERVICEPROPSHEET dlgInfo,
|
|
HWND hwndDlg)
|
|
{
|
|
LPQUERY_SERVICE_CONFIG pServiceConfig;
|
|
LPWSTR lpDescription;
|
|
|
|
/* set the service name */
|
|
SendDlgItemMessageW(hwndDlg,
|
|
IDC_SERV_NAME,
|
|
WM_SETTEXT,
|
|
0,
|
|
(LPARAM)dlgInfo->pService->lpServiceName);
|
|
|
|
/* set the display name */
|
|
SendDlgItemMessageW(hwndDlg,
|
|
IDC_DISP_NAME,
|
|
WM_SETTEXT,
|
|
0,
|
|
(LPARAM)dlgInfo->pService->lpDisplayName);
|
|
|
|
/* set the description */
|
|
if ((lpDescription = GetServiceDescription(dlgInfo->pService->lpServiceName)))
|
|
{
|
|
SendDlgItemMessageW(hwndDlg,
|
|
IDC_DESCRIPTION,
|
|
WM_SETTEXT,
|
|
0,
|
|
(LPARAM)lpDescription);
|
|
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
lpDescription);
|
|
}
|
|
|
|
pServiceConfig = GetServiceConfig(dlgInfo->pService->lpServiceName);
|
|
if (pServiceConfig)
|
|
{
|
|
SendDlgItemMessageW(hwndDlg,
|
|
IDC_EXEPATH,
|
|
WM_SETTEXT,
|
|
0,
|
|
(LPARAM)pServiceConfig->lpBinaryPathName);
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
pServiceConfig);
|
|
}
|
|
|
|
|
|
/* set startup type */
|
|
SetStartupType(dlgInfo->pService->lpServiceName, hwndDlg);
|
|
|
|
SetServiceStatusText(dlgInfo,
|
|
hwndDlg);
|
|
|
|
if (dlgInfo->Info->bIsUserAnAdmin)
|
|
{
|
|
EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT), TRUE);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
SaveDlgInfo(PPAGEDATA pPageData,
|
|
HWND hwndDlg)
|
|
{
|
|
LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
|
|
PWSTR pDisplayName = NULL;
|
|
PWSTR pDescription;
|
|
INT nLength;
|
|
DWORD StartUp;
|
|
|
|
pServiceConfig = HeapAlloc(ProcessHeap,
|
|
HEAP_ZERO_MEMORY,
|
|
sizeof(*pServiceConfig));
|
|
if (pServiceConfig)
|
|
{
|
|
pServiceConfig->dwServiceType = SERVICE_NO_CHANGE;
|
|
pServiceConfig->dwErrorControl = SERVICE_NO_CHANGE;
|
|
pServiceConfig->dwStartType = SERVICE_NO_CHANGE;
|
|
|
|
if (pPageData->bStartTypeChanged)
|
|
{
|
|
StartUp = SendDlgItemMessageW(hwndDlg, IDC_START_TYPE, CB_GETCURSEL, 0, 0);
|
|
switch (StartUp)
|
|
{
|
|
case 0:
|
|
pServiceConfig->dwStartType = SERVICE_AUTO_START;
|
|
break;
|
|
|
|
case 1:
|
|
pServiceConfig->dwStartType = SERVICE_DEMAND_START;
|
|
break;
|
|
case 2:
|
|
pServiceConfig->dwStartType = SERVICE_DISABLED;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (pPageData->bBinaryPathChanged)
|
|
{
|
|
nLength = SendDlgItemMessageW(hwndDlg, IDC_EXEPATH, WM_GETTEXTLENGTH, 0, 0);
|
|
pServiceConfig->lpBinaryPathName = HeapAlloc(ProcessHeap,
|
|
HEAP_ZERO_MEMORY,
|
|
(nLength + 1) * sizeof(WCHAR));
|
|
if (pServiceConfig->lpBinaryPathName != NULL)
|
|
SendDlgItemMessageW(hwndDlg, IDC_EXEPATH, WM_GETTEXT, nLength + 1, (LPARAM)pServiceConfig->lpBinaryPathName);
|
|
}
|
|
|
|
if (pPageData->bDisplayNameChanged)
|
|
{
|
|
nLength = SendDlgItemMessageW(hwndDlg, IDC_DISP_NAME, WM_GETTEXTLENGTH, 0, 0);
|
|
pDisplayName = HeapAlloc(ProcessHeap,
|
|
HEAP_ZERO_MEMORY,
|
|
(nLength + 1) * sizeof(WCHAR));
|
|
if (pDisplayName != NULL)
|
|
{
|
|
SendDlgItemMessageW(hwndDlg, IDC_DISP_NAME, WM_GETTEXT, nLength + 1, (LPARAM)pDisplayName);
|
|
|
|
if (pPageData->dlgInfo->pService->lpDisplayName)
|
|
HeapFree(ProcessHeap, 0, pPageData->dlgInfo->pService->lpDisplayName);
|
|
|
|
pPageData->dlgInfo->pService->lpDisplayName = pDisplayName;
|
|
pServiceConfig->lpDisplayName = pDisplayName;
|
|
}
|
|
}
|
|
|
|
if (SetServiceConfig(pServiceConfig,
|
|
pPageData->dlgInfo->pService->lpServiceName,
|
|
NULL))
|
|
{
|
|
if (pPageData->bDisplayNameChanged)
|
|
ChangeListViewText(pPageData->dlgInfo->Info,
|
|
pPageData->dlgInfo->pService,
|
|
LVNAME);
|
|
|
|
if (pPageData->bStartTypeChanged)
|
|
ChangeListViewText(pPageData->dlgInfo->Info,
|
|
pPageData->dlgInfo->pService,
|
|
LVSTARTUP);
|
|
}
|
|
|
|
if (pServiceConfig->lpBinaryPathName != NULL)
|
|
HeapFree(ProcessHeap, 0, pServiceConfig->lpBinaryPathName);
|
|
|
|
HeapFree(ProcessHeap, 0, pServiceConfig);
|
|
}
|
|
|
|
if (pPageData->bDescriptionChanged)
|
|
{
|
|
nLength = SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_GETTEXTLENGTH, 0, 0);
|
|
pDescription = HeapAlloc(ProcessHeap, HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));
|
|
if (pDescription != NULL)
|
|
{
|
|
SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_GETTEXT, nLength + 1, (LPARAM)pDescription);
|
|
|
|
if (SetServiceDescription(pPageData->dlgInfo->pService->lpServiceName,
|
|
pDescription))
|
|
{
|
|
ChangeListViewText(pPageData->dlgInfo->Info,
|
|
pPageData->dlgInfo->pService,
|
|
LVDESC);
|
|
}
|
|
|
|
HeapFree(ProcessHeap, 0, pDescription);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* General Property dialog callback.
|
|
* Controls messages to the General dialog
|
|
*/
|
|
INT_PTR CALLBACK
|
|
GeneralPageProc(HWND hwndDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
PPAGEDATA pPageData;
|
|
|
|
/* Get the window context */
|
|
pPageData = (PPAGEDATA)GetWindowLongPtr(hwndDlg,
|
|
GWLP_USERDATA);
|
|
if (pPageData == NULL && uMsg != WM_INITDIALOG)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
pPageData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PAGEDATA));
|
|
if (pPageData != NULL)
|
|
{
|
|
SetWindowLongPtr(hwndDlg,
|
|
GWLP_USERDATA,
|
|
(LONG_PTR)pPageData);
|
|
|
|
pPageData->dlgInfo = (PSERVICEPROPSHEET)(((LPPROPSHEETPAGE)lParam)->lParam);
|
|
if (pPageData->dlgInfo != NULL)
|
|
{
|
|
InitGeneralPage(pPageData->dlgInfo, hwndDlg);
|
|
SetButtonStates(pPageData->dlgInfo, hwndDlg);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
HeapFree(GetProcessHeap(), 0, pPageData);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDC_START_TYPE:
|
|
if (HIWORD(wParam) == CBN_SELCHANGE)
|
|
{
|
|
pPageData->bStartTypeChanged = TRUE;
|
|
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
|
}
|
|
break;
|
|
|
|
case IDC_DISP_NAME:
|
|
if (HIWORD(wParam) == EN_CHANGE)
|
|
{
|
|
pPageData->bDisplayNameChanged = TRUE;
|
|
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
|
}
|
|
break;
|
|
|
|
case IDC_DESCRIPTION:
|
|
if (HIWORD(wParam) == EN_CHANGE)
|
|
{
|
|
pPageData->bDescriptionChanged = TRUE;
|
|
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
|
}
|
|
break;
|
|
|
|
case IDC_EXEPATH:
|
|
if (HIWORD(wParam) == EN_CHANGE)
|
|
{
|
|
pPageData->bBinaryPathChanged = TRUE;
|
|
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
|
|
}
|
|
break;
|
|
|
|
case IDC_START:
|
|
{
|
|
WCHAR szStartParams[256];
|
|
LPWSTR lpStartParams = NULL;
|
|
|
|
if (GetDlgItemText(hwndDlg, IDC_START_PARAM, szStartParams, 256) > 0)
|
|
lpStartParams = szStartParams;
|
|
|
|
EnableWindow(GetDlgItem(hwndDlg, IDC_START_PARAM), FALSE);
|
|
|
|
RunActionWithProgress(hwndDlg,
|
|
pPageData->dlgInfo->pService->lpServiceName,
|
|
pPageData->dlgInfo->pService->lpDisplayName,
|
|
ACTION_START,
|
|
lpStartParams);
|
|
|
|
UpdateServiceStatus(pPageData->dlgInfo->pService);
|
|
ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
|
|
SetButtonStates(pPageData->dlgInfo, hwndDlg);
|
|
SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
|
|
break;
|
|
}
|
|
|
|
case IDC_STOP:
|
|
RunActionWithProgress(hwndDlg,
|
|
pPageData->dlgInfo->pService->lpServiceName,
|
|
pPageData->dlgInfo->pService->lpDisplayName,
|
|
ACTION_STOP,
|
|
NULL);
|
|
|
|
UpdateServiceStatus(pPageData->dlgInfo->pService);
|
|
ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
|
|
SetButtonStates(pPageData->dlgInfo, hwndDlg);
|
|
SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
|
|
break;
|
|
|
|
case IDC_PAUSE:
|
|
RunActionWithProgress(hwndDlg,
|
|
pPageData->dlgInfo->pService->lpServiceName,
|
|
pPageData->dlgInfo->pService->lpDisplayName,
|
|
ACTION_PAUSE,
|
|
NULL);
|
|
|
|
UpdateServiceStatus(pPageData->dlgInfo->pService);
|
|
ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
|
|
SetButtonStates(pPageData->dlgInfo, hwndDlg);
|
|
SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
|
|
break;
|
|
|
|
case IDC_RESUME:
|
|
RunActionWithProgress(hwndDlg,
|
|
pPageData->dlgInfo->pService->lpServiceName,
|
|
pPageData->dlgInfo->pService->lpDisplayName,
|
|
ACTION_RESUME,
|
|
NULL);
|
|
|
|
UpdateServiceStatus(pPageData->dlgInfo->pService);
|
|
ChangeListViewText(pPageData->dlgInfo->Info, pPageData->dlgInfo->pService, LVSTATUS);
|
|
SetButtonStates(pPageData->dlgInfo, hwndDlg);
|
|
SetServiceStatusText(pPageData->dlgInfo, hwndDlg);
|
|
break;
|
|
|
|
case IDC_EDIT:
|
|
SendDlgItemMessage(hwndDlg, IDC_DISP_NAME, EM_SETREADONLY, FALSE, 0);
|
|
SendDlgItemMessage(hwndDlg, IDC_DESCRIPTION, EM_SETREADONLY, FALSE, 0);
|
|
SendDlgItemMessage(hwndDlg, IDC_EXEPATH, EM_SETREADONLY, FALSE, 0);
|
|
EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT), FALSE);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch (((LPNMHDR)lParam)->code)
|
|
{
|
|
case PSN_APPLY:
|
|
if (pPageData->bDisplayNameChanged ||
|
|
pPageData->bDescriptionChanged ||
|
|
pPageData->bBinaryPathChanged ||
|
|
pPageData->bStartTypeChanged)
|
|
{
|
|
SaveDlgInfo(pPageData, hwndDlg);
|
|
SetButtonStates(pPageData->dlgInfo, hwndDlg);
|
|
pPageData->bDisplayNameChanged = FALSE;
|
|
pPageData->bDescriptionChanged = FALSE;
|
|
pPageData->bBinaryPathChanged = FALSE;
|
|
pPageData->bStartTypeChanged = FALSE;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|