BEGIN\r
LTEXT "Service Manager v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 130, 26\r
PUSHBUTTON "Close", IDOK, 75, 162, 44, 15\r
- CONTROL "",IDI_SM_ICON,"Static",0x50000203,0,12,7,30\r
+ ICON IDI_SM_ICON, IDC_STATIC, 10, 10, 7, 30\r
EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE\r
END\r
\r
IDD_DLG_PROGRESS DIALOGEX 6,6,255,89\r
CAPTION "Service Control"\r
FONT 8,"MS Sans Serif",0,0\r
-STYLE WS_BORDER | WS_VISIBLE | WS_DLGFRAME | WS_SYSMENU | WS_THICKFRAME | WS_GROUP | WS_TABSTOP\r
+STYLE WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME\r
+EXSTYLE WS_EX_TOOLWINDOW\r
BEGIN\r
CONTROL "",IDC_SERVCON_PROGRESS,"msctls_progress32",0x50000000,8,46,238,13\r
CONTROL "",IDC_SERVCON_INFO,"Static",0x50000000,8,5,236,11\r
\r
STRINGTABLE DISCARDABLE\r
BEGIN\r
- IDS_PROGRESS_INFO "ReactOS is attempting to %s the following service on %s"\r
+ IDS_PROGRESS_INFO "ReactOS is attempting to %s the following service"\r
END\r
break;\r
}\r
\r
- return 0;\r
+ return FALSE;\r
}\r
extern HWND hListView;\r
\r
\r
-BOOL Control(DWORD Control)\r
+BOOL Control(HWND hProgDlg, DWORD Control)\r
{\r
+ HWND hProgBar;\r
SC_HANDLE hSCManager;\r
SC_HANDLE hSc;\r
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ SERVICE_STATUS_PROCESS ServiceStatus;\r
SERVICE_STATUS Status;\r
LVITEM item;\r
+ DWORD BytesNeeded = 0;\r
+ DWORD Loop = 5; //FIXME: testing value. needs better control\r
\r
item.mask = LVIF_PARAM;\r
item.iItem = GetSelectedItem();\r
/* copy pointer to selected service */\r
Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;\r
\r
+ /* set the progress bar range and step */\r
+ hProgBar = GetDlgItem(hProgDlg, IDC_SERVCON_PROGRESS);\r
+ SendMessage(hProgBar, PBM_SETRANGE, 0, MAKELPARAM(0, Loop));\r
+ SendMessage(hProgBar, PBM_SETSTEP, (WPARAM)1, 0);\r
+\r
/* open handle to the SCM */\r
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);\r
if (hSCManager == NULL)\r
\r
/* open handle to the service */\r
hSc = OpenService(hSCManager, Service->lpServiceName,\r
- SERVICE_PAUSE_CONTINUE | SERVICE_STOP);\r
+ SC_MANAGER_ALL_ACCESS);\r
if (hSc == NULL)\r
{\r
GetError(0);\r
return FALSE;\r
}\r
\r
+ /* query the state of the service */\r
+ if (! QueryServiceStatusEx(hSc,\r
+ SC_STATUS_PROCESS_INFO,\r
+ (LPBYTE)&ServiceStatus,\r
+ sizeof(SERVICE_STATUS_PROCESS),\r
+ &BytesNeeded))\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+\r
+ /* loop whilst service is not running */\r
+ /* FIXME: needs more control adding. 'Loop' is temparary */\r
+ while (ServiceStatus.dwCurrentState != Control || !Loop)\r
+ {\r
+ /* increment the progress bar */\r
+ SendMessage(hProgBar, PBM_STEPIT, 0, 0);\r
+\r
+ /* wait before checking status */\r
+ Sleep(ServiceStatus.dwWaitHint / 8);\r
+\r
+ /* check status again */\r
+ if (! QueryServiceStatusEx(\r
+ hSc,\r
+ SC_STATUS_PROCESS_INFO,\r
+ (LPBYTE)&ServiceStatus,\r
+ sizeof(SERVICE_STATUS_PROCESS),\r
+ &BytesNeeded))\r
+ {\r
+ GetError(0);\r
+ return FALSE;\r
+ }\r
+ Loop--;\r
+ }\r
+\r
CloseServiceHandle(hSc);\r
\r
- return TRUE;\r
+ if (ServiceStatus.dwCurrentState == Control)\r
+ {\r
+ SendMessage(hProgBar, PBM_DELTAPOS, Loop, 0);\r
+ Sleep(1000);\r
+ return TRUE;\r
+ }\r
+ else\r
+ return FALSE;\r
\r
}\r
--- /dev/null
+/*\r
+ * PROJECT: ReactOS Services\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: subsys/system/servman/progress.c\r
+ * PURPOSE: Progress dialog box message handler\r
+ * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>\r
+ *\r
+ */\r
+\r
+#include "servman.h"\r
+\r
+extern HINSTANCE hInstance;\r
+//extern HWND hMainWnd;\r
+\r
+\r
+BOOL CALLBACK ProgressDialogProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)\r
+{\r
+ switch(Message)\r
+ {\r
+ case WM_INITDIALOG:\r
+\r
+ break;\r
+\r
+ case WM_COMMAND:\r
+ switch(LOWORD(wParam))\r
+ {\r
+ case IDOK:\r
+ DestroyWindow(hDlg);\r
+ break;\r
+\r
+ }\r
+ break;\r
+\r
+ case WM_DESTROY:\r
+ DestroyWindow(hDlg);\r
+ break;\r
+\r
+ default:\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+\r
+}\r
+\r
{\r
HKEY hKey;\r
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
- LVITEM item;\r
PROP_DLG_INFO DlgInfo;\r
LPCTSTR Path = _T("System\\CurrentControlSet\\Services\\%s");\r
TCHAR buf[300];\r
\r
- item.mask = LVIF_PARAM;\r
- item.iItem = GetSelectedItem();\r
- SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);\r
-\r
- /* copy pointer to selected service */\r
- Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;\r
+ /* get pointer to selected service */\r
+ Service = GetSelectedService();\r
\r
/* open the registry key for the service */\r
_sntprintf(buf, sizeof(buf) / sizeof(TCHAR), Path, Service->lpServiceName);\r
}\r
\r
\r
+\r
+ENUM_SERVICE_STATUS_PROCESS* \r
+GetSelectedService(VOID)\r
+{\r
+ ENUM_SERVICE_STATUS_PROCESS *pSelectedService = NULL;\r
+ LVITEM item;\r
+\r
+ item.mask = LVIF_PARAM;\r
+ item.iItem = GetSelectedItem();\r
+ SendMessage(hListView, LVM_GETITEM, 0, (LPARAM)&item);\r
+\r
+ /* copy pointer to selected service */\r
+ pSelectedService = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;\r
+\r
+ return pSelectedService;\r
+}\r
+\r
+\r
/* Retrives the service description from the registry */\r
BOOL GetDescription(HKEY hKey, LPTSTR *retDescription)\r
{\r
HWND hListView;\r
HWND hStatus;\r
HWND hTool;\r
+HWND hProgDlg;\r
HMENU hShortcutMenu;\r
INT SelectedItem;\r
\r
break;\r
\r
case ID_START:\r
- if ( DoStartService() )\r
+ {\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ TCHAR buf1[100];\r
+ TCHAR buf2[100];\r
+ /* open the progress dialog */\r
+ hProgDlg = CreateDialog(GetModuleHandle(NULL), \r
+ MAKEINTRESOURCE(IDD_DLG_PROGRESS),\r
+ hMainWnd, \r
+ (DLGPROC)ProgressDialogProc);\r
+ if (hProgDlg != NULL)\r
+ {\r
+ ShowWindow(hProgDlg, SW_SHOW);\r
+\r
+ /* write the info to the progress dialog */\r
+ LoadString(hInstance, IDS_PROGRESS_INFO, buf1,\r
+ sizeof(buf1) / sizeof(TCHAR));\r
+ _sntprintf(buf2, 100, buf1, _T("start"));\r
+ SendDlgItemMessage(hProgDlg, IDC_SERVCON_INFO, WM_SETTEXT, 0, (LPARAM)buf2);\r
+\r
+ /* get pointer to selected service */\r
+ Service = GetSelectedService();\r
+\r
+ /* write the service name to the progress dialog */\r
+ SendDlgItemMessage(hProgDlg, IDC_SERVCON_NAME, WM_SETTEXT, 0, \r
+ (LPARAM)Service->lpServiceName);\r
+ }\r
+\r
+ if ( DoStartService(hProgDlg) )\r
{\r
LVITEM item;\r
TCHAR szStatus[64];\r
item.iSubItem = 2;\r
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
}\r
+\r
+ SendMessage(hProgDlg, WM_DESTROY, 0, 0);\r
+ }\r
break;\r
\r
case ID_STOP:\r
- if( Control(SERVICE_CONTROL_STOP) )\r
+ {\r
+ ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
+ TCHAR buf1[100];\r
+ TCHAR buf2[100];\r
+ /* open the progress dialog */\r
+ hProgDlg = CreateDialog(GetModuleHandle(NULL), \r
+ MAKEINTRESOURCE(IDD_DLG_PROGRESS),\r
+ hMainWnd, \r
+ (DLGPROC)ProgressDialogProc);\r
+ if (hProgDlg != NULL)\r
+ {\r
+ ShowWindow(hProgDlg, SW_SHOW);\r
+\r
+ /* write the info to the progress dialog */\r
+ LoadString(hInstance, IDS_PROGRESS_INFO, buf1,\r
+ sizeof(buf1) / sizeof(TCHAR));\r
+ _sntprintf(buf2, 100, buf1, _T("stop"));\r
+ SendDlgItemMessage(hProgDlg, IDC_SERVCON_INFO, WM_SETTEXT, 0, (LPARAM)buf2);\r
+\r
+ /* get pointer to selected service */\r
+ Service = GetSelectedService();\r
+\r
+ /* write the service name to the progress dialog */\r
+ SendDlgItemMessage(hProgDlg, IDC_SERVCON_NAME, WM_SETTEXT, 0, \r
+ (LPARAM)Service->lpServiceName);\r
+ }\r
+\r
+ if( Control(hProgDlg, SERVICE_CONTROL_STOP) )\r
{\r
LVITEM item;\r
\r
item.iSubItem = 2;\r
SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
}\r
+\r
+ SendMessage(hProgDlg, WM_DESTROY, 0, 0);\r
+ }\r
break;\r
\r
case ID_PAUSE:\r
- Control(SERVICE_CONTROL_PAUSE);\r
+ Control(hProgDlg, SERVICE_CONTROL_PAUSE);\r
break;\r
\r
case ID_RESUME:\r
- Control(SERVICE_CONTROL_CONTINUE );\r
+ Control(hProgDlg, SERVICE_CONTROL_CONTINUE );\r
break;\r
\r
case ID_RESTART:\r
- if( Control(SERVICE_CONTROL_STOP) )\r
- {\r
- LVITEM item;\r
-\r
- item.pszText = '\0';\r
- item.iItem = GetSelectedItem();\r
- item.iSubItem = 2;\r
- SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
-\r
- if ( DoStartService() )\r
- {\r
- LVITEM item;\r
- TCHAR szStatus[64];\r
-\r
- LoadString(hInstance, IDS_SERVICES_STARTED, szStatus,\r
- sizeof(szStatus) / sizeof(TCHAR));\r
- item.pszText = szStatus;\r
- item.iItem = GetSelectedItem();\r
- item.iSubItem = 2;\r
- SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);\r
- }\r
- }\r
+ SendMessage(hMainWnd, WM_COMMAND, 0, ID_STOP);\r
+ SendMessage(hMainWnd, WM_COMMAND, 0, ID_START);\r
break;\r
\r
case ID_NEW:\r
case ID_ABOUT:\r
DialogBox(hInstance,\r
MAKEINTRESOURCE(IDD_ABOUTBOX),\r
- hwnd,\r
- AboutDialogProc);\r
+ hMainWnd,\r
+ (DLGPROC)AboutDialogProc);\r
break;\r
\r
}\r
\r
while( GetMessage( &Msg, NULL, 0, 0 ) )\r
{\r
- TranslateMessage(&Msg);\r
- DispatchMessage(&Msg);\r
+ if(! IsDialogMessage(hProgDlg, &Msg) )\r
+ {\r
+ TranslateMessage(&Msg);\r
+ DispatchMessage(&Msg);\r
+ }\r
\r
}\r
return (int)Msg.wParam;\r
BOOL RefreshServiceList(VOID);\r
\r
BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+BOOL CALLBACK ProgressDialogProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam);\r
\r
-BOOL DoStartService(VOID);\r
-BOOL Control(DWORD Control);\r
+BOOL DoStartService(HWND hProgDlg);\r
+BOOL Control(HWND hProgBar, DWORD Control);\r
\r
INT GetSelectedItem(VOID);\r
\r
+ENUM_SERVICE_STATUS_PROCESS* GetSelectedService(VOID);\r
+\r
VOID GetError(DWORD);\r
VOID FreeMemory(VOID);\r
VOID DisplayString(PTCHAR);\r
<file>about.c</file>\r
<file>control.c</file>\r
<file>geterror.c</file>\r
+ <file>progress.c</file>\r
<file>propsheet.c</file>\r
<file>query.c</file>\r
<file>servman.c</file>\r
#include "servman.h"\r
\r
extern HWND hListView;\r
+extern HWND hMainWnd;\r
\r
-BOOL DoStartService(VOID)\r
+BOOL DoStartService(HWND hProgDlg)\r
{\r
+ HWND hProgBar;\r
SC_HANDLE hSCManager;\r
SC_HANDLE hSc;\r
SERVICE_STATUS_PROCESS ServiceStatus;\r
ENUM_SERVICE_STATUS_PROCESS *Service = NULL;\r
LVITEM item;\r
- DWORD BytesNeeded;\r
+ DWORD BytesNeeded = 0;\r
INT ArgCount = 0;\r
- BOOL Loop = 10; //FIXME: testing value. needs better control\r
+ DWORD Loop = 5; //FIXME: testing value. needs better control\r
\r
item.mask = LVIF_PARAM;\r
item.iItem = GetSelectedItem();\r
/* copy pointer to selected service */\r
Service = (ENUM_SERVICE_STATUS_PROCESS *)item.lParam;\r
\r
+ /* set the progress bar range and step */\r
+ hProgBar = GetDlgItem(hProgDlg, IDC_SERVCON_PROGRESS);\r
+ SendMessage(hProgBar, PBM_SETRANGE, 0, MAKELPARAM(0, Loop));\r
+ SendMessage(hProgBar, PBM_SETSTEP, (WPARAM)1, 0);\r
+\r
/* open handle to the SCM */\r
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);\r
if (hSCManager == NULL)\r
}\r
\r
/* query the state of the service */\r
- if (! QueryServiceStatusEx(\r
- hSc,\r
- SC_STATUS_PROCESS_INFO,\r
- (LPBYTE)&ServiceStatus,\r
- sizeof(SERVICE_STATUS_PROCESS),\r
- &BytesNeeded))\r
+ if (! QueryServiceStatusEx(hSc,\r
+ SC_STATUS_PROCESS_INFO,\r
+ (LPBYTE)&ServiceStatus,\r
+ sizeof(SERVICE_STATUS_PROCESS),\r
+ &BytesNeeded))\r
{\r
GetError(0);\r
return FALSE;\r
\r
/* loop whilst service is not running */\r
/* FIXME: needs more control adding. 'Loop' is temparary */\r
- while (ServiceStatus.dwCurrentState == SERVICE_START_PENDING || !Loop)\r
+ while (ServiceStatus.dwCurrentState != SERVICE_RUNNING || !Loop)\r
{\r
+ /* increment the progress bar */\r
+ SendMessage(hProgBar, PBM_STEPIT, 0, 0);\r
+\r
/* wait before checking status */\r
- Sleep(ServiceStatus.dwWaitHint);\r
+ Sleep(ServiceStatus.dwWaitHint / 8);\r
\r
/* check status again */\r
if (! QueryServiceStatusEx(\r
CloseServiceHandle(hSc);\r
\r
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)\r
+ {\r
+ SendMessage(hProgBar, PBM_DELTAPOS, Loop, 0);\r
+ Sleep(1000);\r
return TRUE;\r
+ }\r
else\r
return FALSE;\r
\r