diff --git a/java/net/i2p/router/WindowsServiceUtil.java b/java/net/i2p/router/WindowsServiceUtil.java index 17fb7ca..a1191a7 100644 --- a/java/net/i2p/router/WindowsServiceUtil.java +++ b/java/net/i2p/router/WindowsServiceUtil.java @@ -8,16 +8,17 @@ import java.io.InputStreamReader; * Provides querying of Windows services in order to discover I2P Routers * running as a service and avoid launching jpackaged routers redundantly. * It will prompt a user to start their I2P service if one is discovered. - * + * * see also: * https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/sc-query * https://learn.microsoft.com/en-us/dotnet/api/system.serviceprocess.servicecontrollerstatus?view=dotnet-plat-ext-6.0 - * https://stackoverflow.com/questions/10604844/how-to-verify-whether-service-exists-in-services-msc C#, API ideas only + * https://stackoverflow.com/questions/10604844/how-to-verify-whether-service-exists-in-services-msc + * C#, API ideas only * https://stackoverflow.com/questions/334471/need-a-way-to-check-status-of-windows-service-programmatically * https://stackoverflow.com/questions/5388888/find-status-of-windows-service-from-java-application * https://stackoverflow.com/questions/21566847/how-to-check-particular-windows-service-is-running-using * https://stackoverflow.com/questions/9792051/start-windows-service-with-java - * + * * There's a chance we can't tell ServiceController to do anything so if * that is the case then we'll just launch services.msc and tell the user to * take it from there. @@ -48,16 +49,34 @@ public class WindowsServiceUtil { } return result; } + private String getStatePrefix(String qResult) { + String statePrefix = "STATE : "; + // get the first occurrence of "STATE", then find the + // next occurrence of of ":" after that. Count the + // spaces between. + // numberOfSpaces = indexOf(":") - (indexOf(STATE)+5) + + int indexOfState = qResult.indexOf("STATE"); + if (indexOfState >= 0) { + int indexOfColon = qResult.indexOf(":", indexOfState); + statePrefix = "STATE"; + for (int f = 0; f == indexOfColon; f++) { + statePrefix += " "; + } + statePrefix += ": "; + } + return statePrefix; + } public String getServiceState(String serviceName) { - String STATE_PREFIX = "STATE : "; - String s = queryService(serviceName); + // String statePrefix = "STATE : "; + String qResult = queryService(serviceName); + String statePrefix = getStatePrefix(qResult); // check that the temp string contains the status prefix - int ix = s.indexOf(STATE_PREFIX); + int ix = qResult.indexOf(statePrefix); String stateString = "uninstalled"; if (ix >= 0) { // compare status number to one of the states - String stateStr = s.substring(ix + STATE_PREFIX.length(), - ix + STATE_PREFIX.length() + 1); + String stateStr = qResult.substring(ix + statePrefix.length(), + ix + statePrefix.length() + 1); int state = Integer.parseInt(stateStr); switch (state) { case (1): // service stopped @@ -67,7 +86,7 @@ public class WindowsServiceUtil { stateString = "starting"; break; case (3): // don't know yet - //stateString = "started"; + // stateString = "started"; break; case (4): // service started stateString = "started";