1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.openr66.proxy.network;
21
22 import io.netty.buffer.ByteBuf;
23 import io.netty.channel.ChannelHandlerContext;
24 import io.netty.handler.codec.ByteToMessageCodec;
25 import org.waarp.common.utility.WaarpNettyUtil;
26 import org.waarp.openr66.protocol.exception.OpenR66ProtocolPacketException;
27 import org.waarp.openr66.protocol.localhandler.packet.KeepAlivePacket;
28 import org.waarp.openr66.protocol.localhandler.packet.LocalPacketCodec;
29 import org.waarp.openr66.protocol.localhandler.packet.LocalPacketFactory;
30 import org.waarp.openr66.protocol.networkhandler.packet.NetworkPacket;
31 import org.waarp.openr66.protocol.utils.ChannelUtils;
32
33 import java.util.List;
34
35
36
37
38 public class NetworkPacketCodec extends ByteToMessageCodec<NetworkPacket> {
39 @Override
40 protected void decode(final ChannelHandlerContext ctx, final ByteBuf buf,
41 final List<Object> out) throws Exception {
42
43 if (buf.readableBytes() < 4) {
44
45
46
47 return;
48 }
49
50 buf.markReaderIndex();
51
52 final int length = buf.readInt();
53 if (length < 9) {
54 throw new OpenR66ProtocolPacketException(
55 "Incorrect decode first field in Network Packet: " + length + " < 9");
56 }
57 if (buf.readableBytes() < length) {
58 buf.resetReaderIndex();
59 return;
60 }
61
62
63 final int remoteId = buf.readInt();
64 final int localId = buf.readInt();
65 final byte code = buf.readByte();
66 final int index = buf.readerIndex();
67 final ByteBuf buffer = buf.retainedSlice(index, length - 9);
68 buf.skipBytes(length - 9);
69 final NetworkPacket networkPacket =
70 new NetworkPacket(localId, remoteId, code, buffer);
71 if (code == LocalPacketFactory.KEEPALIVEPACKET) {
72 final KeepAlivePacket keepAlivePacket =
73 (KeepAlivePacket) LocalPacketCodec.decodeNetworkPacket(buffer);
74 WaarpNettyUtil.release(buffer);
75 if (keepAlivePacket.isToValidate()) {
76 keepAlivePacket.validate();
77 final NetworkPacket response =
78 new NetworkPacket(ChannelUtils.NOCHANNEL, ChannelUtils.NOCHANNEL,
79 keepAlivePacket, null);
80 ctx.writeAndFlush(response.getNetworkPacket());
81 }
82
83 final NetworkServerHandler nsh =
84 (NetworkServerHandler) ctx.pipeline().last();
85 nsh.resetKeepAlive();
86 return;
87 }
88 out.add(networkPacket);
89 }
90
91 @Override
92 protected void encode(final ChannelHandlerContext ctx,
93 final NetworkPacket msg, final ByteBuf out) {
94 final ByteBuf finalBuf = msg.getNetworkPacket();
95
96 finalBuf.writerIndex(finalBuf.capacity());
97 out.writeBytes(finalBuf);
98 WaarpNettyUtil.releaseCompletely(finalBuf);
99
100 }
101 }