bool LoadVMOptions()
{
	TCHAR optionsFileName[_MAX_PATH];
	if (LoadString(hInst, IDS_VM_OPTIONS_PATH, optionsFileName, _MAX_PATH-1))
	{
		TCHAR fullOptionsFileName[_MAX_PATH];
		ExpandEnvironmentStrings(optionsFileName, fullOptionsFileName, _MAX_PATH-1);
		
		if (GetFileAttributes(fullOptionsFileName) == INVALID_FILE_ATTRIBUTES)
		{
			GetModuleFileName(NULL, fullOptionsFileName, _MAX_PATH-1);
			_tcscat_s(fullOptionsFileName, _T(".vmoptions"));
		}
		
		std::vector<std::string> vmOptionLines;
		if (LoadVMOptionsFile(fullOptionsFileName, vmOptionLines))
		{
			if (!AddClassPathOptions(vmOptionLines)) return false;
			AddPredefinedVMOptions(vmOptionLines);

			vmOptionCount = vmOptionLines.size();
			vmOptions = (JavaVMOption*) malloc(vmOptionCount * sizeof(JavaVMOption));
			for(int i=0; i<vmOptionLines.size(); i++)
			{
				vmOptions[i].optionString = _strdup(vmOptionLines[i].c_str());
				vmOptions[i].extraInfo = 0;
			}

			return true;
		}
	}
	MessageBox(NULL, _T("Cannot find VM options file"), _T("Error launching IntelliJ Platform"), MB_OK);
	return false;
}
//return VMOptions from one of the files in the following order:
//$<IDE-NAME>_VM_OPTIONS
//$CONFIG_DIRECTORY/<ide-name>[64][.exe].vmoptions
//bin/<ide-name>[64][.exe].vmoptions
bool FindValidVMOptions(std::vector<std::wstring> files, std::wstring& used, std::vector<std::string>& vmOptionLines)
{
    if (files.size() != 0)
    {
        for (int i = 0; i < files.size(); i++)
        {
            if (GetFileAttributes(files[i].c_str()) != INVALID_FILE_ATTRIBUTES)
            {
                if (LoadVMOptionsFile(files[i].c_str(), vmOptionLines))
                {
                    used += (used.size() ? L"," : L"") + files[i];
                    return true;
                }
            }
        }
    }
    return false;
}
Example #3
0
bool LoadVMOptions()
{
  TCHAR buffer[_MAX_PATH];
  TCHAR copy[_MAX_PATH];

  std::vector<std::wstring> files;

  GetModuleFileName(NULL, buffer, _MAX_PATH);
  std::wstring module(buffer);

  files.push_back(module + L".vmoptions");


  if (LoadString(hInst, IDS_VM_OPTIONS_PATH, buffer, _MAX_PATH))
  {
    ExpandEnvironmentStrings(buffer, copy, _MAX_PATH - 1);
    std::wstring selector(copy);
    files.push_back(selector + module.substr(module.find_last_of('\\')) + L".vmoptions");
  }

  if (LoadString(hInst, IDS_VM_OPTIONS_ENV_VAR, buffer, _MAX_PATH))
  {
    if (GetEnvironmentVariableW(buffer, copy, _MAX_PATH)) {
    ExpandEnvironmentStrings(copy, buffer, _MAX_PATH);
    files.push_back(std::wstring(buffer));
    }
  }

  if (files.size() == 0) {
    std::string error = LoadStdString(IDS_ERROR_LAUNCHING_APP);
    MessageBoxA(NULL, "Cannot find VM options file", error.c_str(), MB_OK);
    return false;
  }

  std::wstring used;
  std::vector<std::string> vmOptionLines;
  for (int i = 0; i < files.size(); i++)
  {
    if (GetFileAttributes(files[i].c_str()) != INVALID_FILE_ATTRIBUTES)
    {
      if (LoadVMOptionsFile(files[i].c_str(), vmOptionLines))
      {
        used += (used.size() ? L"," : L"") + files[i];
      }
    }
  }

  vmOptionLines.push_back(std::string("-Djb.vmOptions=") + EncodeWideACP(used));

  if (!AddClassPathOptions(vmOptionLines)) return false;
  AddPredefinedVMOptions(vmOptionLines);

  vmOptionCount = vmOptionLines.size();
  vmOptions = (JavaVMOption*)malloc(vmOptionCount * sizeof(JavaVMOption));
  for (int i = 0; i < vmOptionLines.size(); i++)
  {
    vmOptions[i].optionString = _strdup(vmOptionLines[i].c_str());
    vmOptions[i].extraInfo = 0;
  }

  return true;
}