1355 jboolean |
1355 jboolean |
1356 ProcessPlatformOption(const char *arg) |
1356 ProcessPlatformOption(const char *arg) |
1357 { |
1357 { |
1358 return JNI_FALSE; |
1358 return JNI_FALSE; |
1359 } |
1359 } |
|
1360 |
|
1361 /* |
|
1362 * At this point we have the arguments to the application, and we need to |
|
1363 * check with original stdargs in order to compare which of these truly |
|
1364 * needs expansion. cmdtoargs will specify this if it finds a bare |
|
1365 * (unquoted) argument containing a glob character(s) ie. * or ? |
|
1366 */ |
|
1367 jobjectArray |
|
1368 CreateApplicationArgs(JNIEnv *env, char **strv, int argc) |
|
1369 { |
|
1370 int i, j, idx, tlen; |
|
1371 jobjectArray outArray, inArray; |
|
1372 char *ostart, *astart, **nargv; |
|
1373 jboolean needs_expansion = JNI_FALSE; |
|
1374 jmethodID mid; |
|
1375 int stdargc; |
|
1376 StdArg *stdargs; |
|
1377 jclass cls = GetLauncherHelperClass(env); |
|
1378 NULL_CHECK0(cls); |
|
1379 |
|
1380 if (argc == 0) { |
|
1381 return NewPlatformStringArray(env, strv, argc); |
|
1382 } |
|
1383 // the holy grail we need to compare with. |
|
1384 stdargs = JLI_GetStdArgs(); |
|
1385 stdargc = JLI_GetStdArgc(); |
|
1386 |
|
1387 // sanity check, this should never happen |
|
1388 if (argc > stdargc) { |
|
1389 JLI_TraceLauncher("Warning: app args is larger than the original, %d %d\n", argc, stdargc); |
|
1390 JLI_TraceLauncher("passing arguments as-is.\n"); |
|
1391 return NewPlatformStringArray(env, strv, argc); |
|
1392 } |
|
1393 |
|
1394 // sanity check, match the args we have, to the holy grail |
|
1395 idx = stdargc - argc; |
|
1396 ostart = stdargs[idx].arg; |
|
1397 astart = strv[0]; |
|
1398 // sanity check, ensure that the first argument of the arrays are the same |
|
1399 if (JLI_StrCmp(ostart, astart) != 0) { |
|
1400 // some thing is amiss the args don't match |
|
1401 JLI_TraceLauncher("Warning: app args parsing error\n"); |
|
1402 JLI_TraceLauncher("passing arguments as-is\n"); |
|
1403 return NewPlatformStringArray(env, strv, argc); |
|
1404 } |
|
1405 |
|
1406 // make a copy of the args which will be expanded in java if required. |
|
1407 nargv = (char **)JLI_MemAlloc(argc * sizeof(char*)); |
|
1408 for (i = 0, j = idx; i < argc; i++, j++) { |
|
1409 jboolean arg_expand = (JLI_StrCmp(stdargs[j].arg, strv[i]) == 0) |
|
1410 ? stdargs[j].has_wildcard |
|
1411 : JNI_FALSE; |
|
1412 if (needs_expansion == JNI_FALSE) |
|
1413 needs_expansion = arg_expand; |
|
1414 |
|
1415 // indicator char + String + NULL terminator, the java method will strip |
|
1416 // out the first character, the indicator character, so no matter what |
|
1417 // we add the indicator |
|
1418 tlen = 1 + JLI_StrLen(strv[i]) + 1; |
|
1419 nargv[i] = (char *) JLI_MemAlloc(tlen); |
|
1420 JLI_Snprintf(nargv[i], tlen, "%c%s", arg_expand ? 'T' : 'F', strv[i]); |
|
1421 JLI_TraceLauncher("%s\n", nargv[i]); |
|
1422 } |
|
1423 |
|
1424 if (!needs_expansion) { |
|
1425 // clean up any allocated memory and return back the old arguments |
|
1426 for (i = 0 ; i < argc ; i++) { |
|
1427 JLI_MemFree(nargv[i]); |
|
1428 } |
|
1429 JLI_MemFree(nargv); |
|
1430 return NewPlatformStringArray(env, strv, argc); |
|
1431 } |
|
1432 NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, |
|
1433 "expandArgs", |
|
1434 "([Ljava/lang/String;)[Ljava/lang/String;")); |
|
1435 |
|
1436 // expand the arguments that require expansion, the java method will strip |
|
1437 // out the indicator character. |
|
1438 inArray = NewPlatformStringArray(env, nargv, argc); |
|
1439 outArray = (*env)->CallStaticObjectMethod(env, cls, mid, inArray); |
|
1440 for (i = 0; i < argc; i++) { |
|
1441 JLI_MemFree(nargv[i]); |
|
1442 } |
|
1443 JLI_MemFree(nargv); |
|
1444 return outArray; |
|
1445 } |