package com.example.mina.box.rbm3000; import com.example.mina.util.CommandHelper; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.*; /** * @author dy * @date 21/03/09 */ public class Rbm3000CodecFactory implements ProtocolCodecFactory { @Override public ProtocolEncoder getEncoder(IoSession session) { return new Rbm3000MessageEncoder(); } @Override public ProtocolDecoder getDecoder(IoSession session) { return new Rbm3000MessageDecoder(); } static class Rbm3000MessageEncoder implements ProtocolEncoder { @Override public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { if (message instanceof Rbm3000ResponseMessage) { byte[] result = ((Rbm3000ResponseMessage) message).getResult(); session.write(IoBuffer.wrap(result)); } } @Override public void dispose(IoSession session) { } } static class Rbm3000MessageDecoder implements ProtocolDecoder { // private final CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); @Override public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) { byte[] bytes = new byte[in.limit()]; in.get(bytes); byte[] buffer; Rbm3000RequestMessage rbm3000RequestMessage = Rbm3000RequestMessage.builder() .input(bytes) .build(); if (bytes.length == rbm3000RequestMessage.LENGTH8) { switch (bytes[0]) { case 0x30: int row = CommandHelper.BCD_REV[bytes[3]]; int col = CommandHelper.BCD_REV[bytes[4]]; int rowCol = 0; int colRow = 0; rbm3000RequestMessage.setRow(row); rbm3000RequestMessage.setRow(col); rbm3000RequestMessage.setRow(rowCol); rbm3000RequestMessage.setRow(colRow); buffer = new byte[8]; buffer[0] = bytes[0]; buffer[1] = bytes[1]; buffer[2] = bytes[2]; buffer[3] = bytes[3]; buffer[4] = bytes[4]; buffer[5] = CommandHelper.BCD[colRow]; buffer[6] = CommandHelper.BCD[rowCol]; buffer[7] = (byte) 0x03; rbm3000RequestMessage.setAnalyticalMessage(buffer); break; case 0x68: boolean isA = (bytes[3] == (byte) 0x0A); int callPort = CommandHelper.BCD_REV[bytes[4]]; int returnPort = 0; rbm3000RequestMessage.setCallPort(callPort); rbm3000RequestMessage.setA(isA); rbm3000RequestMessage.setReturnPort(returnPort); buffer = new byte[8]; buffer[0] = bytes[0]; buffer[1] = bytes[1]; buffer[2] = bytes[2]; if (isA) { buffer[3] = 0x0B; } else { buffer[3] = 0x0A; } buffer[5] = 0x00; buffer[6] = 0x06; buffer[7] = (byte) 0x03; rbm3000RequestMessage.setAnalyticalMessage(buffer); break; default: buffer = new byte[8]; buffer[0] = bytes[0]; buffer[1] = bytes[1]; buffer[2] = bytes[2]; buffer[3] = bytes[3]; buffer[4] = bytes[4]; buffer[5] = bytes[5]; buffer[6] = bytes[6]; buffer[7] = (byte) 0x03; rbm3000RequestMessage.setAnalyticalMessage(buffer); break; } } out.write(rbm3000RequestMessage); } @Override public void finishDecode(IoSession session, ProtocolDecoderOutput out) { } @Override public void dispose(IoSession session) { } } }