1000 JLI_MemFree(nargv[i]); 1001 } 1002 JLI_MemFree(nargv); 1003 return NewPlatformStringArray(env, strv, argc); 1004 } 1005 NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, 1006 "expandArgs", 1007 "([Ljava/lang/String;)[Ljava/lang/String;")); 1008 1009 // expand the arguments that require expansion, the java method will strip 1010 // out the indicator character. 1011 NULL_CHECK0(inArray = NewPlatformStringArray(env, nargv, argc)); 1012 outArray = (*env)->CallStaticObjectMethod(env, cls, mid, inArray); 1013 for (i = 0; i < argc; i++) { 1014 JLI_MemFree(nargv[i]); 1015 } 1016 JLI_MemFree(nargv); 1017 JLI_MemFree(filteredargs); 1018 return outArray; 1019 } | 1000 JLI_MemFree(nargv[i]); 1001 } 1002 JLI_MemFree(nargv); 1003 return NewPlatformStringArray(env, strv, argc); 1004 } 1005 NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, 1006 "expandArgs", 1007 "([Ljava/lang/String;)[Ljava/lang/String;")); 1008 1009 // expand the arguments that require expansion, the java method will strip 1010 // out the indicator character. 1011 NULL_CHECK0(inArray = NewPlatformStringArray(env, nargv, argc)); 1012 outArray = (*env)->CallStaticObjectMethod(env, cls, mid, inArray); 1013 for (i = 0; i < argc; i++) { 1014 JLI_MemFree(nargv[i]); 1015 } 1016 JLI_MemFree(nargv); 1017 JLI_MemFree(filteredargs); 1018 return outArray; 1019 } 1020 1021 /* 1022 * Translate Unicode command line arguments to multi byte chars. 1023 */ 1024 static jboolean 1025 DecodeUnicodeArgs(LPWSTR cmd_line_wide, LPSTR* cmd_line_utf8) { 1026 int cmd_line_utf8_length; 1027 1028 // First call to WideCharToMultiByte calculates destination buffer length. 1029 cmd_line_utf8_length = WideCharToMultiByte(CP_UTF8, 1030 0, 1031 cmd_line_wide, 1032 -1, 1033 NULL, 1034 0, 1035 NULL, 1036 NULL); 1037 if (!cmd_line_utf8_length) { 1038 JLI_ReportErrorMessage( 1039 "WideCharToMultiByte failed to calculate destination buffer length " 1040 "with error code %d", GetLastError()); 1041 return JNI_FALSE; 1042 } 1043 1044 // Allocate buffer to receive conversion to UTF-8. 1045 *cmd_line_utf8 = JLI_MemAlloc((size_t)cmd_line_utf8_length * sizeof(CHAR)); 1046 1047 // Second call to WideCharToMultiByte does the actual conversion. 1048 if (!WideCharToMultiByte(CP_UTF8, 1049 0, 1050 cmd_line_wide, 1051 -1, 1052 *cmd_line_utf8, 1053 cmd_line_utf8_length, 1054 NULL, 1055 NULL)) { 1056 JLI_ReportErrorMessage( 1057 "WideCharToMultiByte failed to convert to UTF-8 " 1058 "with error code %d", GetLastError()); 1059 JLI_MemFree(*cmd_line_utf8); 1060 *cmd_line_utf8 = NULL; 1061 return JNI_FALSE; 1062 } 1063 return JNI_TRUE; 1064 } 1065 1066 /* 1067 * Translate command line arguments from Windows format to argc+argv. 1068 */ 1069 static void 1070 ConvertWinArgsToCommonFormat(LPSTR cmd_line, int *pargc, char*** pargv) { 1071 JLI_CmdToArgs(cmd_line); 1072 1073 *pargc = JLI_GetStdArgc(); 1074 // add one more to mark the end 1075 *pargv = (char **)JLI_MemAlloc((*pargc + 1) * (sizeof(char *))); 1076 { 1077 int i = 0; 1078 StdArg *stdargs = JLI_GetStdArgs(); 1079 for (i = 0 ; i < *pargc ; ++i) { 1080 (*pargv)[i] = stdargs[i].arg; 1081 } 1082 (*pargv)[i] = NULL; 1083 } 1084 } 1085 1086 jboolean 1087 JLI_DecodeArgs(int *pargc, char*** pargv) { 1088 LPSTR cmdLineUtf8; 1089 1090 if (!DecodeUnicodeArgs(GetCommandLineW(), &cmdLineUtf8)) { 1091 return JNI_FALSE; 1092 } 1093 ConvertWinArgsToCommonFormat(cmdLineUtf8, pargc, pargv); 1094 JLI_MemFree(cmdLineUtf8); 1095 1096 return JNI_TRUE; 1097 } |