IDEA-149864 Switch boot JDK on Windows shouldn't appear since unavailable
[idea/community.git] / native / WinLauncher / WinLauncher / WinLauncher.cpp
index 93c03bd7a2dc187d3f7987512473c24aabcd23da..af7a8fb266d49b6c168c701d45392d6178376652 100644 (file)
@@ -44,6 +44,8 @@ bool need64BitJRE = false;
 #define BITS_STR "32-bit"
 #endif
 
+void TrimLine(char* line);
+
 std::string EncodeWideACP(const std::wstring &str)
 {
   int cbANSI = WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), NULL, 0, NULL, NULL);
@@ -143,6 +145,34 @@ bool FindJVMInEnvVar(const char* envVarName, bool& result)
   return false;
 }
 
+bool FindJVMInSettings() {
+  TCHAR buffer[_MAX_PATH];
+  TCHAR copy[_MAX_PATH];
+
+  GetModuleFileName(NULL, buffer, _MAX_PATH);
+  std::wstring module(buffer);
+
+  if (LoadString(hInst, IDS_VM_OPTIONS_PATH, buffer, _MAX_PATH)) {
+    ExpandEnvironmentStrings(buffer, copy, _MAX_PATH - 1);
+    std::wstring path(copy);
+    path += L"\\config" + module.substr(module.find_last_of('\\')) + L".jdk";
+    FILE *f = _tfopen(path.c_str(), _T("rt"));
+    if (!f) return false;
+
+    char line[_MAX_PATH];
+    if (!fgets(line, _MAX_PATH, f)) {
+      fclose(f);
+      return false;
+    }
+
+    TrimLine(line);
+    fclose(f);
+
+    return FindValidJVM(line);
+  }
+  return false;
+}
+
 bool FindJVMInRegistryKey(const char* key, bool wow64_32)
 {
   HKEY hKey;
@@ -224,6 +254,8 @@ bool LocateJVM()
     return result;
   }
 
+  if (FindJVMInSettings()) return true;
+
   std::vector<std::string> jrePaths;
   if(need64BitJRE) jrePaths.push_back(GetAdjacentDir("jre64"));
   jrePaths.push_back(GetAdjacentDir("jre"));