package net.glowstone.net.pipeline; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.ChannelException; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.socket.SocketChannel; import io.netty.handler.timeout.IdleStateHandler; import io.netty.handler.timeout.ReadTimeoutHandler; import net.glowstone.GlowServer; import net.glowstone.net.GameServer; import net.glowstone.net.handler.legacyping.LegacyPingHandler; import net.glowstone.net.protocol.ProtocolType; /** * Used to initialize the channels. */ public final class GlowChannelInitializer extends ChannelInitializer<SocketChannel> { /** * The time in seconds which are elapsed before a client is disconnected due * to a read timeout. */ private static final int READ_TIMEOUT = 20; /** * The time in seconds which are elapsed before a client is deemed idle due * to a write timeout. */ private static final int WRITE_IDLE_TIMEOUT = 15; private final GameServer connectionManager; public GlowChannelInitializer(GameServer connectionManager) { this.connectionManager = connectionManager; } @Override protected void initChannel(SocketChannel c) { MessageHandler handler = new MessageHandler(connectionManager); CodecsHandler codecs = new CodecsHandler(ProtocolType.HANDSHAKE.getProtocol()); FramingHandler framing = new FramingHandler(); try { c.config().setOption(ChannelOption.IP_TOS, 0x18); } catch (ChannelException e) { // Not supported on all OSs, like Windows XP and lesser GlowServer.logger.warning("Your OS does not support type of service."); } c.config().setAllocator(PooledByteBufAllocator.DEFAULT); c.pipeline() .addLast("legacy_ping", new LegacyPingHandler(connectionManager)) .addLast("encryption", NoopHandler.INSTANCE) .addLast("framing", framing) .addLast("compression", NoopHandler.INSTANCE) .addLast("codecs", codecs) .addLast("readtimeout", new ReadTimeoutHandler(READ_TIMEOUT)) .addLast("writeidletimeout", new IdleStateHandler(0, WRITE_IDLE_TIMEOUT, 0)) .addLast("handler", handler); } }