Rbm3000CodecFactory.java 4.49 KB
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) {

        }

    }
}