package com.netthreads.network.osc.decoder; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.socket.DatagramPacket; import io.netty.handler.codec.DelimiterBasedFrameDecoder; import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.MessageToMessageDecoder; import com.netthreads.network.osc.decoder.OSCTypeDecoder.OSCType; /** * Decode OSC message type. * * Note: After decoding the input buffer reader index is reset. * */ public class OSCTypeDecoder extends MessageToMessageDecoder<DatagramPacket, OSCType> { public static enum OSCType { OSC_MESSAGE, OSC_BUNDLE }; private DelimiterBasedFrameDecoder delimiterBasedFrameDecoder; public OSCTypeDecoder() { delimiterBasedFrameDecoder = new DelimiterBasedFrameDecoder(8192, false, Delimiters.nulDelimiter()); } @Override public OSCType decode(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { OSCType type = null; ByteBuf buffer = msg.data(); int readerIndex = buffer.readerIndex(); ByteBuf typeBuf = (ByteBuf) delimiterBasedFrameDecoder.decode(ctx, msg.data()); if (typeBuf != null) { if (typeBuf.getByte(0) == DecoderHelper.BUNDLE[0]) { int readableBytes = typeBuf.readableBytes(); if (readableBytes >= DecoderHelper.BUNDLE.length) { boolean match = DecoderHelper.compareBuffer(typeBuf.array(), DecoderHelper.BUNDLE); if (match) { type = OSCType.OSC_BUNDLE; } } } else { type = OSCType.OSC_MESSAGE; } } // We must reset our source buffer msg.data().readerIndex(readerIndex); return type; } }