/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "stdafx.h" #include "FindJava2.h" #include "utils.h" #include "JavaFinder.h" #include "FindJava2Dlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // The one and only MFC application object class CFindJava2App : public CWinApp { public: CFindJava2App() { } // Set CWinApp default registry key. Must be consistent with all apps using findjava2. void initRegistryKey() { SetRegistryKey(_T("Android-FindJava2")); } }; CFindJava2App theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { // Init utils; use default app name based on VERSIONINFO.FileDescription initUtils(NULL); // initialize MFC and print and error on failure HMODULE hModule = ::GetModuleHandle(NULL); if (hModule == NULL) { displayLastError(_T("Fatal Error: ")); return -2; } if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) { displayLastError(_T("Fatal Error: ")); return -3; } theApp.initRegistryKey(); gIsConsole = true; // tell utils to to print errors to stderr gIsDebug = (getenv("ANDROID_SDKMAN_DEBUG") != NULL); // Parse command line bool doTests = false; bool doShortPath = false; bool doVersion = false; bool doJavaW = false; bool doForceUi = false; bool doJava1_7 = false; for (int i = 1; i < argc; i++) { if (_tcsnccmp(argv[i], _T("-t"), 2) == 0) { doTests = true; } else if (_tcsnccmp(argv[i], _T("-d"), 2) == 0) { gIsDebug = true; } else if (_tcsnccmp(argv[i], _T("-s"), 2) == 0) { doShortPath = true; } else if (_tcsnccmp(argv[i], _T("-v"), 2) == 0) { doVersion = true; } else if (_tcsnccmp(argv[i], _T("-f"), 2) == 0) { doForceUi = true; } else if (_tcsnccmp(argv[i], _T("-7"), 2) == 0) { doJava1_7 = true; } else if (_tcscmp(argv[i], _T("-w")) == 0 || _tcscmp(argv[i], _T("-javaw")) == 0) { doJavaW = true; } else { printf( "Outputs the path of the first Java.exe found on the local system.\n" "Returns code 0 when found, 1 when not found.\n" "Options:\n" "-h / -help : This help.\n" "-t / -test : Internal test.\n" "-f / -force : Force UI selection.\n" "-7 : Java 1.7 minimum instead of 1.6.\n" "-s / -short : Print path in short DOS form.\n" "-w / -javaw : Search a matching javaw.exe; defaults to java.exe if not found.\n" "-v / -version: Only prints the Java version found.\n" ); return 2; } } CJavaFinder javaFinder(JAVA_VERS_TO_INT(1, doJava1_7 ? 7 : 6)); CJavaPath javaPath = javaFinder.getRegistryPath(); if (doTests) { std::set<CJavaPath> paths; javaFinder.findJavaPaths(&paths); bool regPrinted = false; for (const CJavaPath &p : paths) { bool isReg = (p == javaPath); if (isReg) { regPrinted = true; } _tprintf(_T("%c [%s] %s\n"), isReg ? '*' : ' ', p.getVersion(), p.mPath); } if (!regPrinted && !javaPath.isEmpty()) { const CJavaPath &p = javaPath; _tprintf(_T("* [%s] %s\n"), p.getVersion(), p.mPath); } return 0; } if (doForceUi || javaPath.isEmpty()) { CFindJava2Dlg dlg; dlg.setJavaFinder(&javaFinder); INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // Get java path selected by user and save into registry for later re-use javaPath = dlg.getSelectedPath(); javaFinder.setRegistryPath(javaPath); } else if (nResponse == -1) { // MFC boilerplate TRACE(traceAppMsg, 0, "Warning: dialog creation failed, so application is terminating unexpectedly.\n"); return 1; } } if (javaPath.isEmpty()) { fprintf(stderr, "No java.exe path found"); return 1; } if (doShortPath) { PVOID oldWow64Value = disableWow64FsRedirection(); if (!javaPath.toShortPath()) { revertWow64FsRedirection(&oldWow64Value); _ftprintf(stderr, _T("Failed to convert path to a short DOS path: %s\n"), javaPath.mPath); return 1; } revertWow64FsRedirection(&oldWow64Value); } if (doVersion) { // Print version found. We already have the version as an integer // so we don't need to run java -version a second time. _tprintf(_T("%s"), javaPath.getVersion()); return 0; } if (doJavaW) { // Try to find a javaw.exe instead of java.exe at the same location. CPath javawPath = javaPath.mPath; javawPath.RemoveFileSpec(); javawPath.Append(_T("javaw.exe")); javawPath.Canonicalize(); // Only accept it if we can actually find the exec PVOID oldWow64Value = disableWow64FsRedirection(); bool exists = javawPath.FileExists() == TRUE; // skip BOOL-to-bool warning revertWow64FsRedirection(&oldWow64Value); if (!exists) { _ftprintf(stderr, _T("Failed to find javaw at: %s\n"), javawPath); return 1; } javaPath.mPath = javawPath; } // Print java.exe path found _tprintf(_T("%s"), javaPath.mPath); return 0; }