aboutsummaryrefslogtreecommitdiff
path: root/find_java2/FindJava2/FindJava2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'find_java2/FindJava2/FindJava2.cpp')
-rwxr-xr-xfind_java2/FindJava2/FindJava2.cpp199
1 files changed, 199 insertions, 0 deletions
diff --git a/find_java2/FindJava2/FindJava2.cpp b/find_java2/FindJava2/FindJava2.cpp
new file mode 100755
index 000000000..1435e1b0d
--- /dev/null
+++ b/find_java2/FindJava2/FindJava2.cpp
@@ -0,0 +1,199 @@
+/*
+* 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;
+
+}