1 /*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 
17 
18 #include "stdafx.h"
19 #include "WinLauncher2App.h"
20 
21 #include "utils.h"
22 #include "JavaFinder.h"
23 #include "FindJava2Dlg.h"
24 
25 #ifdef _DEBUG
26 #define new DEBUG_NEW
27 #endif
28 
29 
30 // CWinLauncher2App
31 
32 BEGIN_MESSAGE_MAP(CWinLauncher2App, CWinApp)
33     ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
34 END_MESSAGE_MAP()
35 
36 
37 // The one and only CWinLauncher2App object
38 CWinLauncher2App theApp;
39 
40 class CLauncherCmdLineInfo : public CCommandLineInfo {
41 public:
42     bool mDoHelp;
43     bool mDoForceUi;
44     bool mDoJava1_7;
45     CString mFilename;
46 
CLauncherCmdLineInfo()47     CLauncherCmdLineInfo() : mDoHelp(false), mDoForceUi(false), mDoJava1_7(false) {}
48 
ParseParam(const TCHAR * pszParam,BOOL bFlag,BOOL bLast)49     virtual void ParseParam(const TCHAR* pszParam, BOOL bFlag, BOOL bLast) {
50         // Expected command line:
51         // /h | help  : msg box with command line arguments
52         // /f | force : force UI selection
53         // /7         : require java 1.7
54         // path-to-launch
55 
56         if (!bFlag) {
57             mFilename = pszParam;
58         } else if (_tcsnccmp(pszParam, _T("h"), 2) == 0) {
59             mDoHelp = true;
60         } else if (_tcsnccmp(pszParam, _T("f"), 2) == 0) {
61             mDoForceUi = true;
62         } else if (_tcsnccmp(pszParam, _T("7"), 2) == 0) {
63             mDoJava1_7 = true;
64         }
65     }
66 };
67 
68 
CWinLauncher2App()69 CWinLauncher2App::CWinLauncher2App() {
70     // support Restart Manager
71     m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
72 
73     // TODO: add construction code here,
74     // Place all significant initialization in InitInstance
75 }
76 
InitInstance()77 BOOL CWinLauncher2App::InitInstance() {
78     // InitCommonControlsEx() is required on Windows XP if an application
79     // manifest specifies use of ComCtl32.dll version 6 or later to enable
80     // visual styles.  Otherwise, any window creation will fail.
81     INITCOMMONCONTROLSEX InitCtrls;
82     InitCtrls.dwSize = sizeof(InitCtrls);
83     // Set this to include all the common control classes you want to use
84     // in your application.
85     InitCtrls.dwICC = ICC_WIN95_CLASSES;
86     InitCommonControlsEx(&InitCtrls);
87 
88     CWinApp::InitInstance();
89     AfxEnableControlContainer();
90 
91     // Create the shell manager, in case the dialog contains
92     // any shell tree view or shell list view controls.
93     CShellManager *pShellManager = new CShellManager;
94 
95     // Activate "Windows Native" visual manager for enabling themes in MFC controls
96     CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
97 
98     // Set CWinApp default registry key. Must be consistent with all apps using findjava2.
99     SetRegistryKey(_T("Android-FindJava2"));
100 
101     // Use VERSIONINFO.FileDescription as the canonical app name
102     initUtils(NULL);
103 
104     CLauncherCmdLineInfo cmdLine;
105     ParseCommandLine(cmdLine);
106 
107     if (cmdLine.mDoHelp) {
108         const TCHAR *msg =
109             _T("WinLauncher2 [/7|/f|/h]\r\n")
110             _T("/7 : Requires Java 1.7 instead of 1.6\r\n")
111             _T("/f : Force UI\r\n")
112             _T("/h : Help\r\n");
113             AfxMessageBox(msg);
114         return FALSE; // quit without starting MFC app msg loop
115     }
116 
117     CJavaFinder javaFinder(JAVA_VERS_TO_INT(1, cmdLine.mDoJava1_7 ? 7 : 6));
118     CJavaPath javaPath = javaFinder.getRegistryPath();
119     if (cmdLine.mDoForceUi || javaPath.isEmpty()) {
120         javaPath.clear();
121 
122         CFindJava2Dlg dlg;
123         dlg.setJavaFinder(&javaFinder);
124         m_pMainWnd = &dlg;
125         INT_PTR nResponse = dlg.DoModal();
126 
127         if (nResponse == IDOK) {
128             // Use choice selected by user and save in registry.
129             javaPath = dlg.getSelectedPath();
130             javaFinder.setRegistryPath(javaPath);
131         } else if (nResponse == IDCANCEL) {
132             // Canceled by user, exit silently.
133         } else if (nResponse == -1) {
134             TRACE(traceAppMsg, 0, "Warning: dialog creation failed, so application is terminating unexpectedly.\n");
135         }
136     }
137 
138     if (!javaPath.isEmpty()) {
139         // TODO actually launch configured app instead of just printing path.
140         CString msg(_T("PLACEHOLDER TODO run app using "));
141         msg.Append(javaPath.mPath);
142         AfxMessageBox(msg);
143     }
144 
145     // Delete the shell manager created above.
146     if (pShellManager != NULL) {
147         delete pShellManager;
148     }
149 
150     // Since the dialog has been closed, return FALSE so that we exit the
151     // application, rather than start the application's message pump.
152     return FALSE;
153 }
154 
155