aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar
diff options
context:
space:
mode:
authorEvgeny S Maksimov <me@vragam.net>2019-02-01 00:56:35 +0300
committerEvgeny S Maksimov <me@vragam.net>2019-02-01 00:56:35 +0300
commita3c540a952b5136b1de2900c8947847f70b39446 (patch)
tree87ff1bc50441e37573907fcffb0f13a3f491bd40 /src/org/traccar
parent83e97b472e16d5dc16826aa4688e7430b8ecec29 (diff)
downloadtraccar-server-a3c540a952b5136b1de2900c8947847f70b39446.tar.gz
traccar-server-a3c540a952b5136b1de2900c8947847f70b39446.tar.bz2
traccar-server-a3c540a952b5136b1de2900c8947847f70b39446.zip
Frame decoder refactoring
Diffstat (limited to 'src/org/traccar')
-rw-r--r--src/org/traccar/protocol/NavisFrameDecoder.java30
-rw-r--r--src/org/traccar/protocol/NavisProtocol.java5
2 files changed, 21 insertions, 14 deletions
diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java
index 9a3b3d45c..0146243cd 100644
--- a/src/org/traccar/protocol/NavisFrameDecoder.java
+++ b/src/org/traccar/protocol/NavisFrameDecoder.java
@@ -21,20 +21,17 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.TooLongFrameException;
import java.nio.charset.StandardCharsets;
import org.traccar.BaseFrameDecoder;
+import org.traccar.BasePipelineFactory;
public class NavisFrameDecoder extends BaseFrameDecoder {
+ private int flexDataSize; // bytes
+
private static final int NTCB_HEADER_LENGTH = 16;
private static final int NTCB_LENGTH_OFFSET = 12;
private static final int FLEX_HEADER_LENGTH = 2;
private static final int MAX_FRAME_LENGTH = 65551;
- private final NavisProtocolDecoder protocolDecoder;
-
- public NavisFrameDecoder(NavisProtocolDecoder protocolDecoder) {
- this.protocolDecoder = protocolDecoder;
- }
-
@Override
protected Object decode(
ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception {
@@ -53,7 +50,15 @@ public class NavisFrameDecoder extends BaseFrameDecoder {
return buf.readRetainedSlice(1);
}
- if (protocolDecoder.getFlexDataSize() > 0) {
+ if (ctx != null) {
+ NavisProtocolDecoder protocolDecoder =
+ BasePipelineFactory.getHandler(ctx.pipeline(), NavisProtocolDecoder.class);
+ if (protocolDecoder != null) {
+ flexDataSize = protocolDecoder.getFlexDataSize();
+ }
+ }
+
+ if (flexDataSize > 0) {
// FLEX frame
if (buf.readableBytes() > FLEX_HEADER_LENGTH) {
int length = 0;
@@ -61,14 +66,13 @@ public class NavisFrameDecoder extends BaseFrameDecoder {
switch (type) {
// FLEX 1.0
case "~A":
- length = protocolDecoder.getFlexDataSize()
- * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH) + 1 + 1;
+ length = flexDataSize * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH) + 1 + 1;
break;
case "~T":
- length = protocolDecoder.getFlexDataSize() + 4 + 1;
+ length = flexDataSize + 4 + 1;
break;
case "~C":
- length = protocolDecoder.getFlexDataSize() + 1;
+ length = flexDataSize + 1;
break;
// FLEX 2.0 (Extra packages)
case "~E":
@@ -108,4 +112,8 @@ public class NavisFrameDecoder extends BaseFrameDecoder {
return null;
}
+ public void setFlexDataSize(int flexDataSize) {
+ this.flexDataSize = flexDataSize;
+ }
+
}
diff --git a/src/org/traccar/protocol/NavisProtocol.java b/src/org/traccar/protocol/NavisProtocol.java
index 628b78fd4..db0eba8c1 100644
--- a/src/org/traccar/protocol/NavisProtocol.java
+++ b/src/org/traccar/protocol/NavisProtocol.java
@@ -25,9 +25,8 @@ public class NavisProtocol extends BaseProtocol {
addServer(new TrackerServer(false, getName()) {
@Override
protected void addProtocolHandlers(PipelineBuilder pipeline) {
- NavisProtocolDecoder protocolDecoder = new NavisProtocolDecoder(NavisProtocol.this);
- pipeline.addLast(new NavisFrameDecoder(protocolDecoder));
- pipeline.addLast(protocolDecoder);
+ pipeline.addLast(new NavisFrameDecoder());
+ pipeline.addLast(new NavisProtocolDecoder(NavisProtocol.this));
}
});
}