- Added a progress bar showing the status of the action on the service
[reactos.git] / reactos / subsys / system / servman / start.c
index b7710da..a001b18 100644 (file)
 #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
@@ -29,6 +31,11 @@ BOOL DoStartService(VOID)
     /* 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
@@ -53,12 +60,11 @@ BOOL DoStartService(VOID)
     }\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
@@ -66,10 +72,13 @@ BOOL DoStartService(VOID)
 \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
@@ -88,7 +97,11 @@ BOOL DoStartService(VOID)
     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