/* * (C) Copyright 2015-2016 the original author or authors. * * Licensed 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. * * Contributors: * ohun@live.cn (夜色) */ package com.mpush.common.message; import com.mpush.api.Constants; import com.mpush.api.connection.Connection; import com.mpush.api.protocol.Packet; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; /** * Created by ohun on 2015/12/28. * * @author ohun@live.cn */ public abstract class ByteBufMessage extends BaseMessage { public ByteBufMessage(Packet message, Connection connection) { super(message, connection); } @Override public void decode(byte[] body) { decode(Unpooled.wrappedBuffer(body)); } @Override public byte[] encode() { ByteBuf body = connection.getChannel().alloc().heapBuffer(); try { encode(body); byte[] bytes = new byte[body.readableBytes()]; body.readBytes(bytes); return bytes; } finally { body.release(); } } public abstract void decode(ByteBuf body); public abstract void encode(ByteBuf body); public void encodeString(ByteBuf body, String field) { encodeBytes(body, field == null ? null : field.getBytes(Constants.UTF_8)); } public void encodeByte(ByteBuf body, byte field) { body.writeByte(field); } public void encodeInt(ByteBuf body, int field) { body.writeInt(field); } public void encodeLong(ByteBuf body, long field) { body.writeLong(field); } public void encodeBytes(ByteBuf body, byte[] field) { if (field == null || field.length == 0) { body.writeShort(0); } else if (field.length < Short.MAX_VALUE) { body.writeShort(field.length).writeBytes(field); } else { body.writeShort(Short.MAX_VALUE).writeInt(field.length - Short.MAX_VALUE).writeBytes(field); } } public String decodeString(ByteBuf body) { byte[] bytes = decodeBytes(body); if (bytes == null) return null; return new String(bytes, Constants.UTF_8); } public byte[] decodeBytes(ByteBuf body) { int fieldLength = body.readShort(); if (fieldLength == 0) return null; if (fieldLength == Short.MAX_VALUE) { fieldLength += body.readInt(); } byte[] bytes = new byte[fieldLength]; body.readBytes(bytes); return bytes; } public byte decodeByte(ByteBuf body) { return body.readByte(); } public int decodeInt(ByteBuf body) { return body.readInt(); } public long decodeLong(ByteBuf body) { return body.readLong(); } }