diff --git a/java/net/i2p/router/WinLauncher.java b/java/net/i2p/router/WinLauncher.java index 7b580e2..d982941 100644 --- a/java/net/i2p/router/WinLauncher.java +++ b/java/net/i2p/router/WinLauncher.java @@ -94,6 +94,12 @@ public class WinLauncher extends CopyConfigDir { "Service startup failure, please start I2P service with services.msc"); System.exit(2); } + continuerunning = promptUserInstallStartIfAvailable(); + if (!continuerunning) { + logger.severe( + "User-install startup required."); + System.exit(2); + } // This actually does most of what we use NSIS for if NSIS hasn't // already done it, which essentially makes this whole thing portable. diff --git a/java/net/i2p/router/WindowsServiceUtil.java b/java/net/i2p/router/WindowsServiceUtil.java index 03347ec..b7d8fff 100644 --- a/java/net/i2p/router/WindowsServiceUtil.java +++ b/java/net/i2p/router/WindowsServiceUtil.java @@ -1,6 +1,7 @@ package net.i2p.router; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import javax.swing.JOptionPane; @@ -142,6 +143,48 @@ public class WindowsServiceUtil { return "http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/news.su3"; } + public static boolean checkProgramFilesInstall() { + String programFiles = System.getenv("PROGRAMFILES"); + File programFilesI2P = new File(programFiles, "i2p/i2p.exe"); + if (programFilesI2P.exists()) + return true; + String programFiles86 = System.getenv("PROGRAMFILES86"); + File programFiles86I2P = new File(programFiles86, "i2p/i2p.exe"); + if (programFiles86I2P.exists()) + return true; + return false; + } + + public static boolean promptUserInstallStartIfAvailable() { + if (osName() != "windows") { + return true; + } + if (checkProgramFilesInstall()) { + int a; + String message = + "It appears you have an existing, unbundled I2P rotuer installed.\n"; + message += + "However, it is not running yet. Please start it using the shortcut on the desktop.\n"; + message += + "If you click \"No\", the jpackage router will be launched instead.\n"; + a = JOptionPane.showConfirmDialog(null, message, + "I2P Service detected not running", + JOptionPane.YES_NO_OPTION); + if (a == JOptionPane.NO_OPTION) { + // Do nothing here, this will continue on to launch a jpackaged router + return true; + } else { + // We can't just call `net start` or `sc start` directly, that throws + // a permission error. We can start services.msc though, where the + // user can start the service themselves. OR maybe we ask for + // elevation here? May need to refactor Elevator and Shell32X to + // achieve it though + return false; + } + } + return true; + } + public static String getServiceState(String serviceName) { String stateString = "uninstalled"; int state = getServiceStateInt(serviceName);