package com.netthreads.network.osc.server; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundMessageHandlerAdapter; import io.netty.channel.socket.DatagramPacket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netthreads.network.osc.decoder.OSCBundleDecoder; import com.netthreads.network.osc.decoder.OSCMessageDecoder; import com.netthreads.network.osc.decoder.OSCTypeDecoder; import com.netthreads.network.osc.decoder.OSCTypeDecoder.OSCType; import com.netthreads.osc.common.domain.OSCBundle; import com.netthreads.osc.common.domain.OSCMessage; /** * OSC Server handler to decode messages. * */ @Sharable public class OSCServerHandler extends ChannelInboundMessageHandlerAdapter<DatagramPacket> { private static final Logger logger = LoggerFactory.getLogger(OSCServerHandler.class); private OSCTypeDecoder oscTypeDecoder; private OSCMessageDecoder oscMessageDecoder; private OSCBundleDecoder oscBundleDecoder; private OSCServerListener oscServerListener; /** * Construct Server handler. * * @param oscServerListener * The message handler. */ public OSCServerHandler(OSCServerListener oscServerListener) { this.oscServerListener = oscServerListener; oscTypeDecoder = new OSCTypeDecoder(); oscMessageDecoder = new OSCMessageDecoder(); oscBundleDecoder = new OSCBundleDecoder(); } /** * Message received handler. * */ @Override public void messageReceived(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { OSCType type = oscTypeDecoder.decode(ctx, msg); if (type != null) { switch (type) { case OSC_MESSAGE: OSCMessage oscMessage = oscMessageDecoder.decode(ctx, msg); if (oscMessage != null) { logger.debug("Receive OSCMessage: " + oscMessage.getAddress() + ", " + oscMessage.getArguments()); if (oscServerListener != null) { oscServerListener.handleOSCMessage(oscMessage); } } break; case OSC_BUNDLE: OSCBundle oscBundle = oscBundleDecoder.decode(ctx, msg); if (oscBundle != null) { logger.debug("Receive OSCBundle: " + oscBundle.getMessages().size()); if (oscServerListener != null) { oscServerListener.handleOSCBundle(oscBundle); } } break; default: break; } } } /** * Error. * */ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { logger.error(cause.getLocalizedMessage()); } }