package org.pokenet.server.network.codec; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolEncoderAdapter; import org.apache.mina.filter.codec.ProtocolEncoderOutput; import org.apache.mina.filter.codec.textline.LineDelimiter; import org.apache.mina.filter.codec.textline.TextLineEncoder; /** * Encodes messages to be sent to the client * @author shadowkanji * */ public class PokenetEncoder extends ProtocolEncoderAdapter { private static final String ENCODER = TextLineEncoder.class.getName() + ".encoder"; private final Charset m_charset; private final LineDelimiter m_delimiter; /** * Default constructor */ public PokenetEncoder() { m_charset = Charset.forName("US-ASCII"); m_delimiter = LineDelimiter.UNIX; } public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { CharsetEncoder encoder = (CharsetEncoder) session.getAttribute(ENCODER); if (encoder == null) { encoder = m_charset.newEncoder(); session.setAttribute(ENCODER, encoder); } String value = message.toString(); IoBuffer buf = IoBuffer.allocate(value.length()) .setAutoExpand(true); buf.putString(value, encoder); if (buf.position() > Integer.MAX_VALUE) { throw new IllegalArgumentException("Line length: " + buf.position()); } buf.putString(m_delimiter.getValue(), encoder); buf.flip(); out.write(buf); } }