| /* |
| * Copyright (c) 2010-2011 Graham Edgecombe. |
| * |
| * This file is part of Lightstone. |
| * |
| * Lightstone is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, either version 3 of the License, or |
| * (at your option) any later version. |
| * |
| * Lightstone is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with Lightstone. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| package net.lightstone.net; |
| |
| import java.io.IOException; |
| |
| import net.lightstone.msg.Message; |
| import net.lightstone.net.codec.MessageCodec; |
| |
| import org.jboss.netty.buffer.ChannelBuffer; |
| import org.jboss.netty.buffer.ChannelBuffers; |
| import org.jboss.netty.channel.Channel; |
| import org.jboss.netty.channel.ChannelHandlerContext; |
| import org.jboss.netty.handler.codec.oneone.OneToOneEncoder; |
| |
| /** |
| * A {@link OneToOneEncoder} which encodes Minecraft {@link Message}s into |
| * {@link ChannelBuffer}s. |
| */ |
| public class MinecraftEncoder extends OneToOneEncoder { |
| |
| @SuppressWarnings("unchecked") |
| @Override |
| protected Object encode(ChannelHandlerContext ctx, Channel c, Object msg) throws Exception { |
| if (msg instanceof Message) { |
| Message message = (Message) msg; |
| |
| Class<? extends Message> clazz = message.getClass(); |
| MessageCodec<Message> codec = (MessageCodec<Message>) CodecLookupService.find(clazz); |
| if (codec == null) { |
| throw new IOException("Unknown message type: " + clazz + "."); |
| } |
| |
| ChannelBuffer opcodeBuf = ChannelBuffers.buffer(1); |
| opcodeBuf.writeByte(codec.getOpcode()); |
| |
| return ChannelBuffers.wrappedBuffer(opcodeBuf, codec.encode(message)); |
| } |
| return msg; |
| } |
| |
| } |