/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
#include "java.h"
#include "resource.h"
struct jvminfo {
char *version;
char *path;
};
/*
* Prototypes.
*/
static void
HideStatusWindow(void);
const char *
GetArch()
{
#ifdef _WIN64
return "ia64";
#else
return "i386";
#endif
}
static void
DeleteLockFile(void)
{
if (lockfile)
}
void
{
const char *execname;
/*
* Use an exclusive lock on the executable file to determine if another
* instance is already running.
*/
if ((execname = GetExecName()) != NULL && (lockfile = CreateFile(execname, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != NULL)
{
{
exit(1);
}
}
return;
}
{
{
{
size += MAXPATHLEN;
}
}
else
{
}
if (access(tmppath, R_OK | W_OK) == 0 && stat(tmppath, &sb) == 0 && (sb.st_mode & S_IFDIR) == S_IFDIR)
{
if (tmpdir)
return JNI_TRUE;
}
return JNI_FALSE;
}
#ifndef RES_BUNDLE_NAME
#endif
/*
* Retrieve a localized message from the resource bundle compiled into the
* executable.
*/
char *
{
int size;
) + 3);
while (!sym)
{
{
}
{
{
char *s;
*s = '\0';
else
*lc = '\0';
}
else
{
goto error;
}
}
else
{
break;
}
}
goto error;
if ((size = WideCharToMultiByte(GetACP() ? CP_ACP : CP_UTF8, 0, value, -1, NULL, 0, NULL, NULL)) < 0)
goto error;
if ((size = WideCharToMultiByte(GetACP() ? CP_ACP : CP_UTF8, 0, value, -1, ret, size, NULL, NULL)) < 0)
goto error;
return ret;
/* Always return a valid string */
if (lc)
if (fullkey)
if (ret)
ret[0] = '\0';
return ret;
}
const char *
{
if (!tmpdir)
{
int ret;
{
}
if (ret)
{
}
else
{
}
}
return tmpdir;
}
/*
* Find path to JRE based on a user specified Java installation directory.
*/
char *
{
/* Is JRE co-located with the application? */
{
goto found;
}
/* Does the app ship a private JRE in <apphome>/jre directory? */
{
goto found;
}
if (libjava)
if (libjava)
{
/* Check that executables exist */
{
}
}
return libjava;
}
/*
* Helpers to look in the registry for a public JRE.
*/
static char *
{
{
{
}
}
return regvalue;
}
static DWORD
{
/* Create the dialog */
if ((statusdialog = CreateDialog(instance, MAKEINTRESOURCE(IDD_DIALOGBAR), NULL, StatusCallback)) == NULL)
return 1;
/* Set title */
while (dispatch)
{
{
}
Sleep(0);
}
/* Destry the dialog */
statusdialog = NULL;
return 0;
}
{
switch (uMsg)
{
case WM_PAINT:
{
int textheight;
/* Attempt to get the standard message box font */
if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &metrics, 0) && (font = CreateFontIndirect(&metrics.lfMessageFont)) != NULL)
/*
* Calculate how much space we need for the text and resize
* and resize dialog if necessary
*/
textheight = DrawText(dc, statusmessage, -1, &textrect, DT_CALCRECT | DT_CENTER | DT_EXPANDTABS | DT_NOPREFIX);
{
LONG adjust = ((textrect.right - oldtextrect.right) / 2) + ((textrect.right - oldtextrect.right) % 2);
}
{
LONG adjust = ((textrect.bottom - oldtextrect.bottom) / 2) + ((textrect.bottom - oldtextrect.bottom) % 2);
}
if (resize)
{
SetWindowPos(hWndDlg, HWND_TOP, dialogrect.left, dialogrect.top, dialogrect.right - dialogrect.left, dialogrect.bottom - dialogrect.top, 0);
}
textrect.top += (dialogrect.bottom - dialogrect.top - MIN_TEXT_MARGIN - textrect.top - textheight) / 2;
if (oldfont)
{
}
if (font)
{
}
}
break;
case WM_USER:
if (lParam)
{
statusmessage = (char *)lParam;
if (oldmessage)
oldmessage = NULL;
}
break;
default:
break;
}
return ret;
}
static jboolean
{
if (!instance)
return JNI_FALSE;
if (loadingwin)
return JNI_FALSE;
if (dispatch)
return JNI_TRUE;
/* Initialize the lock */
if (!dispatch)
/* Create the event loop thread */
goto error;
/* Raise the thread's priority so that it is guaranteed a time slice */
goto error;
return JNI_TRUE;
if (dispatch)
{
if (thrd)
{
}
}
return JNI_FALSE;
}
static int
{
int ret;
int cachedlen = 0;
if (cachedmessage)
for (;;)
{
if (cachedmessage)
{
continue;
}
break;
}
if (cachedmessage)
if (LoadWindows() && dispatch)
{
{
/* Chop off trailing newline */
}
else
{
/* If there is no newline, cache message and print later */
ret = 0;
}
if (statusdialog)
{
else
}
else
{
}
}
else
{
}
if (message)
return ret;
}
static void
{
}
static int
{
int ret;
int cachedlen = 0;
if (cachedmessage)
for (;;)
{
if (cachedmessage)
{
continue;
}
break;
}
if (cachedmessage)
if (LoadWindows() && dispatch)
{
{
/* Chop off trailing newline */
}
else
{
/* If there is no newline, cache message and print later */
ret = 0;
}
if (type == MB_ICONINFORMATION)
else
}
else
{
}
if (message)
return ret;
}
char *
{
const char *envvar;
int index;
int subkeySize;
{
);
bundledjdk = info;
else
bundledjre = info;
}
/* Look for a public JDK in the Windows registry. */
{
index = 0;
subkeySize = sizeof(subkeyName);
/* Iterate through each of the JDK version keys */
{
char *javapath;
subkeySize = sizeof(subkeyName);
continue;
/* Find a matching supported version */
if (!CheckVersion(subkeyName))
{
continue;
}
{
continue;
}
{
{
}
else
{
}
}
else
{
}
if (jdkfound)
{
goto found;
}
}
}
/* Look for a public JRE in the Windows registry. */
{
index = 0;
subkeySize = sizeof(subkeyName);
/* Iterate through each of the JRE version keys */
{
char *javapath;
subkeySize = sizeof(subkeyName);
continue;
/* Find a matching supported version */
if (!CheckVersion(subkeyName))
{
continue;
}
{
continue;
}
{
{
}
else
{
}
}
else
{
}
}
}
/* Make bundled JDK first choice */
if (bundledjdk)
{
if (!jrefoundpath)
else
bundledjdk = NULL;
}
/* Iterate through JDKs and use the one with the highest version */
{
{
}
else
{
}
}
if (jdks)
{
if (!jrefoundpath)
else
}
/* Make bundled JRE the next choice */
if (bundledjre)
{
if (!jrefoundpath)
else
bundledjre = NULL;
}
/* Iterate through JREs and use the one with the highest version */
{
{
}
else
{
}
}
if (jres)
{
if (!jrefoundpath)
else
}
return jrefoundpath;
}
{
;
/* Does the app ship a private JRE in <apphome>/jre directory? */
{
{
goto found;
}
}
/* Is JRE co-located with the application? */
else
{
{
goto found;
}
}
return isJDK;
}
/* Default to GUI mode */
{
return printToConsole;
}
void
{
}
int
{
int ret;
if (printToConsole || !LoadWindows())
else
return ret;
}
int
{
int ret;
if (printToConsole || !LoadWindows())
{
}
else
{
else
}
return ret;
}
int
{
int ret;
if (format)
{
if (printToConsole || !LoadWindows())
else
}
else
{
}
return ret;
}
/*
* Encodings for Windows language groups. Some locales do not have codepages,
* and are supported in Windows 2000 solely through Unicode, so we also add
* the appropriate Unicode variant.
*
* Note: this table is copied from the windows/native/common/locale_str.h
* header in the J2SE 1.4.1 source code and should be updated as new releases
* of J2SE come out.
*/
static const char *encoding_names[] = {
"Cp1250", /* 0:Latin 2 */
"Cp1251", /* 1:Cyrillic */
"Cp1252", /* 2:Latin 1 */
"Cp1253", /* 3:Greek */
"Cp1254", /* 4:Latin 5 */
"Cp1255", /* 5:Hebrew */
"Cp1256", /* 6:Arabic */
"Cp1257", /* 7:Baltic */
"Cp1258", /* 8:Viet Nam */
"MS874", /* 9:Thai */
"MS932", /* 10:Japanese */
"GBK", /* 11:PRC GBK */
"MS949", /* 12:Korean Extended Wansung */
"MS950", /* 13:Chinese (Taiwan, Hongkong, Macau) */
"utf-16le", /* 14:Unicode */
"MS1361", /* 15:Korean Johab */
};
/*
* List mapping from LanguageID to Java locale IDs.
*
* Note: this table is copied from the windows/native/common/locale_str.h
* header in the J2SE 1.4.1 source code and should be updated as new releases
* of J2SE come out.
*/
typedef struct LANGIDtoLocale {
const char* javaID;
/* fallback locales to use when the country code doesn't match anything we have */
0x01, 6, "ar",
0x02, 1, "bg",
0x03, 2, "ca",
0x04, 11, "zh",
0x05, 0, "cs",
0x06, 2, "da",
0x07, 2, "de",
0x08, 3, "el",
0x09, 2, "en",
0x0a, 2, "es",
0x0b, 2, "fi",
0x0c, 2, "fr",
0x0d, 5, "iw",
0x0e, 0, "hu",
0x0f, 2, "is",
0x10, 2, "it",
0x11, 10, "ja",
0x12, 12, "ko",
0x13, 2, "nl",
0x14, 2, "no",
0x15, 0, "pl",
0x16, 2, "pt",
0x17, 2, "rm",
0x18, 0, "ro",
0x19, 1, "ru",
0x1a, 0, "sh",
0x1b, 0, "sk",
0x1c, 0, "sq",
0x1d, 2, "sv",
0x1e, 9, "th",
0x1f, 4, "tr",
0x20, 2, "ur",
0x21, 2, "in",
0x22, 1, "uk",
0x23, 1, "be",
0x24, 0, "sl",
0x25, 7, "et",
0x26, 7, "lv",
0x27, 7, "lt",
0x29, 6, "fa",
0x2a, 8, "vi",
0x2b, 14, "hy",
0x2c, 4, "az",
0x2d, 2, "eu",
0x2f, 1, "mk",
0x31, 2, "ts",
0x32, 2, "tn",
0x34, 2, "xh",
0x35, 2, "zu",
0x36, 2, "af",
0x37, 14, "ka",
0x38, 2, "fo",
0x39, 14, "hi",
0x3a, 2, "mt",
0x3c, 2, "gd",
0x3d, 2, "yi",
0x3e, 2, "ms",
0x3f, 1, "kk",
0x40, 1, "ky",
0x41, 2, "sw",
0x43, 1, "uz",
0x44, 1, "tt",
0x46, 14, "pa",
0x47, 14, "gu",
0x49, 14, "ta",
0x4a, 14, "te",
0x4b, 14, "kn",
0x4e, 14, "mr",
0x4f, 14, "sa",
0x50, 1, "mn",
0x56, 2, "gl",
/* mappings for real Windows LCID values */
0x0401, 6, "ar_SA",
0x0402, 1, "bg_BG",
0x0403, 2, "ca_ES",
0x0404, 13, "zh_TW",
0x0405, 0, "cs_CZ",
0x0406, 2, "da_DK",
0x0407, 2, "de_DE",
0x0408, 3, "el_GR",
0x0409, 2, "en_US",
0x040a, 2, "es_ES", /* (traditional sort) */
0x040b, 2, "fi_FI",
0x040c, 2, "fr_FR",
0x040d, 5, "iw_IL",
0x040e, 0, "hu_HU",
0x040f, 2, "is_IS",
0x0410, 2, "it_IT",
0x0411, 10, "ja_JP",
0x0412, 12, "ko_KR",
0x0413, 2, "nl_NL",
0x0414, 2, "no_NO",
0x0415, 0, "pl_PL",
0x0416, 2, "pt_BR",
0x0417, 2, "rm_CH",
0x0418, 0, "ro_RO",
0x0419, 1, "ru_RU",
0x041a, 0, "hr_HR",
0x041b, 0, "sk_SK",
0x041c, 0, "sq_AL",
0x041d, 2, "sv_SE",
0x041e, 9, "th_TH",
0x041f, 4, "tr_TR",
0x0420, 6, "ur_PK",
0x0421, 2, "in_ID",
0x0422, 1, "uk_UA",
0x0423, 1, "be_BY",
0x0424, 0, "sl_SI",
0x0425, 7, "et_EE",
0x0426, 7, "lv_LV",
0x0427, 7, "lt_LT",
0x0429, 6, "fa_IR",
0x042a, 8, "vi_VN",
0x042b, 14, "hy_AM", /* Armenian */
0x042c, 4, "az_AZ", /* Azeri_Latin */
0x042d, 2, "eu_ES",
/* 0x042e, 2, "??", no ISO-639 abbreviation for Sorbian */
0x042f, 1, "mk_MK",
/* 0x0430, 2, "??", no ISO-639 abbreviation for Sutu */
0x0431, 2, "ts", /* (country?) */
0x0432, 2, "tn_BW",
/* 0x0433, 2, "??", no ISO-639 abbreviation for Venda */
0x0434, 2, "xh", /* (country?) */
0x0435, 2, "zu", /* (country?) */
0x0436, 2, "af_ZA",
0x0437, 14, "ka_GE", /* Georgian */
0x0438, 2, "fo_FO",
0x0439, 14, "hi_IN",
0x043a, 2, "mt_MT",
/* 0x043b, 2, "??", no ISO-639 abbreviation for Sami */
0x043c, 2, "gd_GB",
0x043d, 2, "yi", /* (country?) */
0x043e, 2, "ms_MY",
0x043f, 1, "kk_KZ", /* Kazakh */
0x0440, 1, "ky_KG", /* Kyrgyz */
0x0441, 2, "sw_KE",
0x0443, 1, "uz_UZ", /* Uzbek_Cyrillic*/
0x0444, 1, "tt", /* Tatar, no ISO-3166 abbreviation */
0x0446, 14, "pa_IN", /* Punjabi */
0x0447, 14, "gu_IN", /* Gujarati */
0x0449, 14, "ta_IN", /* Tamil */
0x044a, 14, "te_IN", /* Telugu */
0x044b, 14, "kn_IN", /* Kannada */
0x044e, 14, "mr_IN", /* Marathi */
0x044f, 14, "sa_IN", /* Sanskrit */
0x0450, 1, "mn_MN", /* Mongolian */
0x0456, 2, "gl_ES", /* Galician */
/* 0x0457, 14, "??_IN", /* Konkani, no ISO-639 abbreviation*/
/* 0x045a, 14, "??_SY", /* Syriac, no ISO-639 abbreviation*/
/* 0x0465, 14, "??_MV", /* Divehi, no ISO-639 abbreviation*/
0x0801, 6, "ar_IQ",
0x0804, 11, "zh_CN",
0x0807, 2, "de_CH",
0x0809, 2, "en_GB",
0x080a, 2, "es_MX",
0x080c, 2, "fr_BE",
0x0810, 2, "it_CH",
0x0812, 15, "ko_KR", /* Korean(Johab)*/
0x0813, 2, "nl_BE",
0x0814, 2, "no_NO_NY",
0x0816, 2, "pt_PT",
0x0818, 0, "ro_MD",
0x0819, 1, "ru_MD",
0x081a, 0, "sh_YU",
0x081d, 2, "sv_FI",
0x082c, 1, "az_AZ", /* Azeri_Cyrillic */
0x083c, 2, "ga_IE",
0x083e, 2, "ms_BN",
0x0843, 4, "uz_UZ", /* Uzbek_Latin */
0x0c01, 6, "ar_EG",
0x0c04, 13, "zh_HK",
0x0c07, 2, "de_AT",
0x0c09, 2, "en_AU",
0x0c0a, 2, "es_ES", /* (modern sort) */
0x0c0c, 2, "fr_CA",
0x0c1a, 1, "sr_YU",
0x1001, 6, "ar_LY",
0x1004, 11, "zh_SG",
0x1007, 2, "de_LU",
0x1009, 2, "en_CA",
0x100a, 2, "es_GT",
0x100c, 2, "fr_CH",
0x1401, 6, "ar_DZ",
0x1404, 13, "zh_MO",
0x1407, 2, "de_LI",
0x1409, 2, "en_NZ",
0x140a, 2, "es_CR",
0x140c, 2, "fr_LU",
0x1801, 6, "ar_MA",
0x1809, 2, "en_IE",
0x180a, 2, "es_PA",
0x180c, 2, "fr_MC",
0x1c01, 6, "ar_TN",
0x1c09, 2, "en_ZA",
0x1c0a, 2, "es_DO",
0x2001, 6, "ar_OM",
0x2009, 2, "en_JM",
0x200a, 2, "es_VE",
0x2401, 6, "ar_YE",
0x2409, 2, "en", /* ("Caribbean", which could be any of many countries) */
0x240a, 2, "es_CO",
0x2801, 6, "ar_SY",
0x2809, 2, "en_BZ",
0x280a, 2, "es_PE",
0x2c01, 6, "ar_JO",
0x2c09, 2, "en_TT",
0x2c0a, 2, "es_AR",
0x3001, 6, "ar_LB",
0x3009, 2, "en_ZW",
0x300a, 2, "es_EC",
0x3401, 6, "ar_KW",
0x3409, 2, "en_PH",
0x340a, 2, "es_CL",
0x3801, 6, "ar_AE",
0x380a, 2, "es_UY",
0x3c01, 6, "ar_BH",
0x3c0a, 2, "es_PY",
0x4001, 6, "ar_QA",
0x400a, 2, "es_BO",
0x440a, 2, "es_SV",
0x480a, 2, "es_HN",
0x4c0a, 2, "es_NI",
0x500a, 2, "es_PR"
};
const char *
{
if (!locale)
{
int tries = 0;
/*
* Query the system for the current system default locale
* (which is a Windows LCID value),
*/
/*
* binary-search our list of LANGID values. If we don't find the
* one we're looking for, mask out the country code and try again
* with just the primary language ID
*/
do
{
lo = 0;
{
else
}
++tries;
/*
* If we found the LCID, look up the corresponding Java locale ID from
* the list of Java locale IDs and set up the system properties
* accordingly. Otherwise, fall back to "en".
*/
if (index != -1)
else
locale = "en";
}
return locale;
}
{
char *t = NULL;
int lenwith;
int lenwithout;
/* Make sure that preceding character is not a multi-byte character */
t = StrDup(s);
goto leave;
t[pos] = '\0';
goto leave;
free(t);
t = NULL;
return ret;
}
char *
{
{
if (!CreatePipe(&inpipe[0], &inpipe[1], &sa, PIPE_SIZE) || !CreatePipe(&outpipe[0], &outpipe[1], &sa, PIPE_SIZE) || !CreatePipe(&errpipe[0], &errpipe[1], &sa, PIPE_SIZE))
goto leave;
/*
* Determine the amount of memory to allocate assuming the individual
* components will be quoted and space separated
*/
{
CloseHandle(inpipe[0]);
/*
* Read the first line of output. We only need to read once since
* the standard buffer size is far larger than the longest
* version string.
*/
if (bytes <= 0)
bytes = 0;
/* Chop off any garbage after the first newline */
*str = '\0';
/* Parse version string */
*str = '\0';
{
*str++ = '\0';
}
if (!CheckVersion(version))
{
}
}
if (cmdline)
CloseHandle(inpipe[0]);
CloseHandle(outpipe[0]);
CloseHandle(errpipe[0]);
}
return version;
}
/*
* Execute a Java subprocess with the specified arguments.
*/
int
ExecuteJava(const char *jrepath, int numOptions, const JavaVMOption *options,int numProps, const JavaPropsOption *props)
{
int i = 0;
/*
if (!CheckJavaClassFile(class))
{
char *key = NULL;
char *message = NULL;
key = GetMessageKeyPrefix("no_files");
message = GetLocalizedMessage(key);
free(key);
key = NULL;
fprintf(stderr, message);
free(message);
message = NULL;
return ret;
}
*/
{
return ret;
}
/*
* Determine the amount of memory to allocate assuming the individual
* components will be quoted and space separated
*/
for (i = 0; i < numOptions; i++)
for (i = 0; i < numProps; i++)
/* Add the default Option "-client" here. */
/*
strcat(cmdline, " -client ");
*/
for (i = 0; i < numOptions; i++)
{
}
for (i = 0; i < numProps; i++)
{
}
newpath = (char *)MemAlloc(strlen("PATH=") + (bundledlibpath ? strlen(bundledlibpath) + 1 : 0) + (oldpath ? strlen(oldpath) + 1 : 0) + 10);
if (bundledlibpath)
{
}
if (oldpath)
{
}
/* Create the console here so that we can set the title */
if (console)
{
AllocConsole();
SetConsoleTitle("");
if (IsIconic(consolewindow))
}
{
/* Wait a few seconds to display the status dialog */
Sleep(10000);
}
else
{
return ret;
}
return ret;
}
/*
* Perform recursive deletion of a file or directory. Note: don't use MemAlloc
* function here since this is called from an exit handler.
*/
void
{
const char *filename;
int i;
return;
filename++;
/* Ignore special directory entries */
{
return;
}
/* Chop off any trailing file separator */
{
{
}
}
/* Ignore files in the save list */
{
return;
}
{
{
{
long filehandle;
{
do {
{
}
}
searchpath = NULL;
}
}
else
{
}
}
}
/* used to invoke the upgrade tool in console mode*/
int
{
{
}
else
{
}
return ret;
}