11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipackage org.chromium.components.devtools_bridge;
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport java.nio.ByteBuffer;
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Decodes data packets of SocketTunnelClient and SocketTunnelServer for tests.
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic final class PacketDecoder extends SocketTunnelBase.PacketDecoderBase {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private boolean mControlPacket = false;
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private boolean mDataPacket;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private int mOpCode;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private int mConnectionId;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private byte[] mData;
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    protected void onReceivedDataPacket(int connectionId, byte[] data) {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDataPacket = true;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mConnectionId = connectionId;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mData = data;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @Override
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    protected void onReceivedControlPacket(int connectionId, byte opCode) {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mControlPacket = true;
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mOpCode = opCode;
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mConnectionId = connectionId;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public static PacketDecoder tryDecode(ByteBuffer packet) throws SocketTunnelBase.ProtocolError {
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        PacketDecoder decoder = new PacketDecoder();
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        decoder.decodePacket(packet);
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return decoder;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public static PacketDecoder decode(ByteBuffer packet) {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        try {
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return tryDecode(packet);
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        } catch (SocketTunnelBase.ProtocolError e) {
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            throw new RuntimeException(e);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public boolean isControlPacket() {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return mControlPacket;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public boolean isDataPacket() {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return mDataPacket;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public int opCode() {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert isControlPacket();
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return mOpCode;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public int connectionId() {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return mConnectionId;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public byte[] data() {
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert isDataPacket();
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return mData.clone();
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
68