package org.playorm.nio.impl.cm.packet; import java.io.IOException; import java.nio.ByteBuffer; import java.util.logging.Level; import java.util.logging.Logger; import org.playorm.nio.api.channels.Channel; import org.playorm.nio.api.handlers.DataChunk; import org.playorm.nio.api.handlers.DataListener; import org.playorm.nio.api.libs.PacketListener; import org.playorm.nio.api.libs.PacketProcessor; import org.playorm.nio.impl.util.DataChunkWithBuffer; import org.playorm.nio.impl.util.PacketChunk; class PacProxyDataHandler implements DataListener, PacketListener { private static final Logger log = Logger.getLogger(PacProxyDataHandler.class.getName()); private PacTCPChannel channel; private DataListener handler; private PacketProcessor packetProcessor; public PacProxyDataHandler(PacTCPChannel channel, PacketProcessor p, DataListener handler) { this.channel = channel; this.handler = handler; this.packetProcessor = p; //this.realChannel = (TCPChannel)channel.getRealChannel(); } public void incomingData(Channel realChannel, DataChunk chunk) throws IOException { ByteBuffer b = chunk.getData(); try { boolean notified = packetProcessor.incomingData(b, chunk); DataChunkWithBuffer c = (DataChunkWithBuffer) chunk; c.releaseBuffer(" handler that didn't consume="+handler); if(!notified) chunk.setProcessed("PacProxyDataHandler"); } catch(Exception e) { log.log(Level.WARNING, "exception", e); handler.failure(channel, b, e); } } public void farEndClosed(Channel realChannel) { handler.farEndClosed(channel); } public void incomingPacket(ByteBuffer b, Object passthrough) throws IOException { //MUST create a new packet here as the same DataChunk is sometimes used //since one ByteBuffer can contain multiple packets!!!! DataChunkWithBuffer chunk = (DataChunkWithBuffer) passthrough; PacketChunk c = new PacketChunk(b, chunk); handler.incomingData(channel, c); } public void failure(Channel realChannel, ByteBuffer data, Exception e) { handler.failure(channel, data, e); } }