*/
private boolean processCommand(StreamTokenizer tkn, DDMReader reader,
DDMWriter writer, OutputStream monitorOs)
throws IOException, DRDAProtocolException
{
ProtocolTestGrammar cmd = ProtocolTestGrammar.cmdFromString(
tkn.sval.toLowerCase(Locale.ENGLISH));
if (cmd == null) { // To avoid generating string for each command.
fail("Unknown command '" + tkn.sval + "' in line " + ln(tkn));
}
int val;
String str;
switch (cmd)
{
case INCLUDE:
processFile(getString(tkn), reader, writer, monitorOs);
break;
case CREATE_DSS_REQUEST:
writer.createDssRequest();
break;
case CREATE_DSS_OBJECT:
writer.createDssObject();
break;
case CREATE_DSS_REPLY:
writer.createDssReply();
break;
case END_DSS:
tkn.nextToken();
tkn.pushBack();
if ((tkn.sval != null) && tkn.sval.startsWith("0x"))
// use specified chaining.
writer.endDss((getBytes(tkn))[0]);
else
// use default chaining
writer.endDss();
break;
case END_DDM:
writer.endDdm();
break;
case END_DDM_AND_DSS:
writer.endDdmAndDss();
break;
case START_DDM:
writer.startDdm(getCP(tkn));
break;
case WRITE_SCALAR_STRING:
writer.writeScalarString(getCP(tkn), getString(tkn));
break;
case WRITE_SCALAR_2BYTES:
writer.writeScalar2Bytes(getCP(tkn),getIntOrCP(tkn));
break;
case WRITE_SCALAR_1BYTE:
writer.writeScalar1Byte(getCP(tkn),getInt(tkn));
break;
case WRITE_SCALAR_BYTES:
writer.writeScalarBytes(getCP(tkn),getBytes(tkn));
break;
case WRITE_SCALAR_PADDED_BYTES:
writer.writeScalarPaddedBytes(getCP(tkn), getBytes(tkn), getInt(tkn),
ccsidManager.space);
break;
case WRITE_BYTE:
writer.writeByte(getInt(tkn));
break;
case WRITE_BYTES:
writer.writeBytes(getBytes(tkn));
break;
case WRITE_SHORT:
writer.writeShort(getInt(tkn));
break;
case WRITE_INT:
writer.writeInt(getInt(tkn));
break;
case WRITE_CODEPOINT_4BYTES:
writer.writeCodePoint4Bytes(getCP(tkn), getInt(tkn));
break;
case WRITE_STRING:
str = getString(tkn);
writer.writeBytes(getEBCDIC(str));
break;
case WRITE_ENCODED_STRING:
writeEncodedString(getString(tkn), getString(tkn), writer);
break;
case WRITE_ENCODED_LDSTRING:
writeEncodedLDString(getString(tkn), getString(tkn), getInt(tkn), writer);
break;
case WRITE_PADDED_STRING:
str = getString(tkn);
writer.writeBytes(getEBCDIC(str));
int reqLen = getInt(tkn);
int strLen = str.length();
if (strLen < reqLen)
writer.padBytes(ccsidManager.space, reqLen-strLen);
break;
case READ_REPLY_DSS:
reader.readReplyDss();
break;
case SKIP_DSS:
skipDss(reader);
break;
case SKIP_DDM:
skipDdm(reader);
break;
case MORE_DATA:
str = getString(tkn);
boolean expbool = Boolean.parseBoolean(str);
assertEquals("Too much/little data",
expbool, reader.moreData());
break;
case READ_LENGTH_AND_CODEPOINT:
readLengthAndCodePoint(tkn, reader);
break;
case READ_SCALAR_2BYTES:
readLengthAndCodePoint(tkn, reader);
val = reader.readNetworkShort();
checkIntOrCP(tkn, val);
break;
case READ_SCALAR_1BYTE:
readLengthAndCodePoint(tkn, reader);
val = reader.readByte();
checkIntOrCP(tkn, val);
break;
case READ_SECMEC_AND_SECCHKCD:
readSecMecAndSECCHKCD(reader);
break;
case READ_BYTES:
assertTrue("Mismatch between the byte arrays",
Arrays.equals(getBytes(tkn), reader.readBytes()));
break;
case READ_NETWORK_SHORT:
val = reader.readNetworkShort();
checkIntOrCP(tkn, val);
break;
case FLUSH:
writer.finalizeChain(reader.getCurrChainState(), monitorOs);
writer.reset(null);
break;
case DISPLAY:
println(getString(tkn));
break;
case CHECKERROR:
checkError(tkn, reader);
break;
case CHECK_SQLCARD:
checkSQLCARD(getInt(tkn), getString(tkn), reader);
break;
case END_TEST:
// Nothing to do for ending the test, as resources are closed
// elsewhere.
println(getName() + " :: FINISHED");
return true;
case SKIP_BYTES:
reader.skipBytes();
break;
case SWITCH_TO_UTF8_CCSID_MANAGER:
writer.setUtf8Ccsid();
reader.setUtf8Ccsid();
break;
case DELETE_DATABASE:
deleteDatabase(getString(tkn));
break;
default:
fail("Command in line " + ln(tkn) + " not implemented: " +
cmd.toString());
}
return false;
}