package com.github.kpavlov.jreactive8583.netty.codec;
import com.solab.iso8583.IsoMessage;
import com.solab.iso8583.MessageFactory;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import java.text.ParseException;
import java.util.List;
public class Iso8583Decoder extends ByteToMessageDecoder {
private final MessageFactory messageFactory;
public Iso8583Decoder(MessageFactory messageFactory) {
this.messageFactory = messageFactory;
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List out) throws Exception {
//message body starts immediately, no length header
if (!byteBuf.isReadable()) {
return;
}
byte[] bytes = new byte[byteBuf.readableBytes()];
byteBuf.readBytes(bytes);
final IsoMessage isoMessage = messageFactory.parseMessage(bytes, 0);
if (isoMessage != null) {
//noinspection unchecked
out.add(isoMessage);
} else {
throw new ParseException("Can't parse ISO8583 message", 0);
}
}
}