Java tutorial
package com.cc.nettytest.proxy.encoder; /* * Copyright 2012 The Netty Project * * The Netty Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * * MODIFIED TO CHANGE ENDIANNESS for ClareControls */ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import java.nio.ByteOrder; /** * An encoder that prepends the length of the message. The length value is * prepended as a binary form. It is encoded in either big endian or little * endian depending on the default {@link ByteOrder} of the current * {@link ByteBufFactory}. * <p> * For example, <tt>{@link LengthFieldPrepender}(2)</tt> will encode the * following 12-bytes string: * <pre> * +----------------+ * | "HELLO, WORLD" | * +----------------+ * </pre> * into the following: * <pre> * +--------+----------------+ * + 0x000C | "HELLO, WORLD" | * +--------+----------------+ * </pre> * If you turned on the {@code lengthIncludesLengthFieldLength} flag in the * constructor, the encoded data would look like the following * (12 (original data) + 2 (prepended data) = 14 (0xE)): * <pre> * +--------+----------------+ * + 0x000E | "HELLO, WORLD" | * +--------+----------------+ * </pre> */ @Sharable public class CCLengthFieldPrepender extends MessageToByteEncoder<ByteBuf> { private final int lengthFieldLength; private final boolean lengthIncludesLengthFieldLength; /** * Creates a new instance. * * @param lengthFieldLength the length of the prepended length field. * Only 1, 2, 3, 4, and 8 are allowed. * * @throws IllegalArgumentException * if {@code lengthFieldLength} is not 1, 2, 3, 4, or 8 */ public CCLengthFieldPrepender(int lengthFieldLength) { this(lengthFieldLength, false); } /** * Creates a new instance. * * @param lengthFieldLength the length of the prepended length field. * Only 1, 2, 3, 4, and 8 are allowed. * @param lengthIncludesLengthFieldLength * if {@code true}, the length of the prepended * length field is added to the value of the * prepended length field. * * @throws IllegalArgumentException * if {@code lengthFieldLength} is not 1, 2, 3, 4, or 8 */ public CCLengthFieldPrepender(int lengthFieldLength, boolean lengthIncludesLengthFieldLength) { super(ByteBuf.class); if (lengthFieldLength != 1 && lengthFieldLength != 2 && lengthFieldLength != 3 && lengthFieldLength != 4 && lengthFieldLength != 8) { throw new IllegalArgumentException( "lengthFieldLength must be either 1, 2, 3, 4, or 8: " + lengthFieldLength); } this.lengthFieldLength = lengthFieldLength; this.lengthIncludesLengthFieldLength = lengthIncludesLengthFieldLength; } @Override public void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { int length = lengthIncludesLengthFieldLength ? msg.readableBytes() + lengthFieldLength : msg.readableBytes(); switch (lengthFieldLength) { case 1: if (length >= 256) { throw new IllegalArgumentException("length does not fit into a byte: " + length); } out.writeByte((byte) length); break; case 2: if (length >= 65536) { throw new IllegalArgumentException("length does not fit into a short integer: " + length); } out.writeShort((short) length); break; case 3: if (length >= 16777216) { throw new IllegalArgumentException("length does not fit into a medium integer: " + length); } out.writeMedium(length); break; case 4: out.writeInt(ByteBufUtil.swapInt((int) length)); //SWAP FOR UIMANAGER break; case 8: out.writeLong(length); break; default: throw new Error("should not reach here"); } out.writeBytes(msg, msg.readerIndex(), msg.readableBytes()); } }