Search in sources :

Example 1 with Frame

use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.

the class Assembler method assemble.

private void assemble(Frame frame, ByteBuffer segment) {
    BBDecoder dec = _decoder.get();
    dec.init(segment);
    int channel = frame.getChannel();
    Method command;
    switch(frame.getType()) {
        case CONTROL:
            int controlType = dec.readUint16();
            Method control = Method.create(controlType);
            control.read(dec);
            emit(channel, control);
            break;
        case COMMAND:
            int commandType = dec.readUint16();
            // read in the session header, right now we don't use it
            int hdr = dec.readUint16();
            command = Method.create(commandType);
            command.setSync((0x0001 & hdr) != 0);
            command.read(dec);
            if (command.hasPayload() && !frame.isLastSegment()) {
                setIncompleteCommand(channel, command);
            } else {
                emit(channel, command);
            }
            break;
        case HEADER:
            command = getIncompleteCommand(channel);
            List<Struct> structs = null;
            DeliveryProperties deliveryProps = null;
            MessageProperties messageProps = null;
            while (dec.hasRemaining()) {
                Struct struct = dec.readStruct32();
                if (struct instanceof DeliveryProperties && deliveryProps == null) {
                    deliveryProps = (DeliveryProperties) struct;
                } else if (struct instanceof MessageProperties && messageProps == null) {
                    messageProps = (MessageProperties) struct;
                } else {
                    if (structs == null) {
                        structs = new ArrayList<>(2);
                    }
                    structs.add(struct);
                }
            }
            command.setHeader(new Header(deliveryProps, messageProps, structs));
            if (frame.isLastSegment()) {
                setIncompleteCommand(channel, null);
                emit(channel, command);
            }
            break;
        case BODY:
            command = getIncompleteCommand(channel);
            command.setBody(QpidByteBuffer.wrap(segment));
            setIncompleteCommand(channel, null);
            emit(channel, command);
            break;
        default:
            throw new IllegalStateException("unknown frame type: " + frame.getType());
    }
    dec.releaseBuffer();
}
Also used : ProtocolHeader(org.apache.qpid.server.protocol.v0_10.transport.ProtocolHeader) Header(org.apache.qpid.server.protocol.v0_10.transport.Header) MessageProperties(org.apache.qpid.server.protocol.v0_10.transport.MessageProperties) ArrayList(java.util.ArrayList) Method(org.apache.qpid.server.protocol.v0_10.transport.Method) DeliveryProperties(org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties) BBDecoder(org.apache.qpid.server.protocol.v0_10.transport.BBDecoder) Struct(org.apache.qpid.server.protocol.v0_10.transport.Struct)

Example 2 with Frame

use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.

the class Assembler method setSegment.

private void setSegment(Frame frame, List<Frame> segment) {
    int key = segmentKey(frame);
    if (segments.containsKey(key)) {
        error(new ProtocolError(Frame.L2, "segment in progress: %s", frame));
    }
    segments.put(segmentKey(frame), segment);
}
Also used : ProtocolError(org.apache.qpid.server.protocol.v0_10.transport.ProtocolError)

Example 3 with Frame

use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.

the class Assembler method frame.

public void frame(Frame frame) {
    ByteBuffer segment;
    if (frame.isFirstFrame() && frame.isLastFrame()) {
        segment = frame.getBody();
        assemble(frame, segment);
    } else {
        List<Frame> frames;
        if (frame.isFirstFrame()) {
            frames = new ArrayList<>();
            setSegment(frame, frames);
        } else {
            frames = getSegment(frame);
        }
        frames.add(frame);
        if (frame.isLastFrame()) {
            clearSegment(frame);
            int size = 0;
            for (Frame f : frames) {
                size += f.getSize();
            }
            segment = allocateByteBuffer(size);
            for (Frame f : frames) {
                segment.put(f.getBody());
            }
            segment.flip();
            assemble(frame, segment);
        }
    }
}
Also used : Frame(org.apache.qpid.server.protocol.v0_10.transport.Frame) ByteBuffer(java.nio.ByteBuffer) QpidByteBuffer(org.apache.qpid.server.bytebuffer.QpidByteBuffer)

Example 4 with Frame

use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.

the class ServerAssembler method setSegment.

private void setSegment(ServerFrame frame, List<ServerFrame> segment) {
    int key = segmentKey(frame);
    if (_segments.containsKey(key)) {
        error(new ProtocolError(Frame.L2, "segment in progress: %s", frame));
    }
    _segments.put(segmentKey(frame), segment);
}
Also used : ProtocolError(org.apache.qpid.server.protocol.v0_10.transport.ProtocolError)

Example 5 with Frame

use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.

the class ServerInputHandler method received.

public void received(QpidByteBuffer buf) {
    int position = buf.position();
    List<ServerFrame> frames = new ArrayList<>();
    while (buf.hasRemaining() && _state != ERROR) {
        buf.mark();
        switch(_state) {
            case PROTO_HDR:
                if (buf.remaining() < 8) {
                    break;
                }
                if (buf.get() != 'A' || buf.get() != 'M' || buf.get() != 'Q' || buf.get() != 'P') {
                    buf.reset();
                    error("bad protocol header: %s", str(buf));
                    _state = ERROR;
                } else {
                    byte protoClass = buf.get();
                    byte instance = buf.get();
                    byte major = buf.get();
                    byte minor = buf.get();
                    _serverAssembler.init(new ProtocolHeader(protoClass, instance, major, minor));
                    _state = FRAME_HDR;
                }
                break;
            case FRAME_HDR:
                if (buf.remaining() < ServerFrame.HEADER_SIZE) {
                    buf.reset();
                } else {
                    flags = buf.get();
                    type = SegmentType.get(buf.get());
                    int size = (0xFFFF & buf.getShort());
                    size -= ServerFrame.HEADER_SIZE;
                    if (size < 0 || size > (_maxFrameSize - ServerFrame.HEADER_SIZE)) {
                        error("bad frame size: %d", size);
                        _state = ERROR;
                    } else {
                        // skip unused byte
                        buf.get();
                        byte b = buf.get();
                        if ((b & 0xF0) != 0) {
                            error("non-zero reserved bits in upper nibble of " + "frame header byte 5: '%x'", b);
                            _state = ERROR;
                        } else {
                            track = (byte) (b & 0xF);
                            channel = (0xFFFF & buf.getShort());
                            buf.position(buf.position() + 4);
                            if (size == 0) {
                                ServerFrame frame = new ServerFrame(flags, type, track, channel, EMPTY_BYTE_BUFFER.duplicate());
                                frames.add(frame);
                            } else if (buf.remaining() < size) {
                                buf.reset();
                            } else {
                                final QpidByteBuffer body = buf.slice();
                                body.limit(size);
                                ServerFrame frame = new ServerFrame(flags, type, track, channel, body);
                                frames.add(frame);
                                buf.position(buf.position() + size);
                            }
                        }
                    }
                }
                break;
            default:
                throw new IllegalStateException();
        }
        int newPosition = buf.position();
        if (position == newPosition) {
            break;
        } else {
            position = newPosition;
        }
    }
    _serverAssembler.received(frames);
}
Also used : ArrayList(java.util.ArrayList) QpidByteBuffer(org.apache.qpid.server.bytebuffer.QpidByteBuffer) ProtocolHeader(org.apache.qpid.server.protocol.v0_10.transport.ProtocolHeader)

Aggregations

ProtocolHeader (org.apache.qpid.server.protocol.v0_10.transport.ProtocolHeader)4 ArrayList (java.util.ArrayList)3 ConnectionStart (org.apache.qpid.server.protocol.v0_10.transport.ConnectionStart)3 ConnectionTune (org.apache.qpid.server.protocol.v0_10.transport.ConnectionTune)3 SpecificationTest (org.apache.qpid.tests.protocol.SpecificationTest)3 Test (org.junit.Test)3 QpidByteBuffer (org.apache.qpid.server.bytebuffer.QpidByteBuffer)2 DeliveryProperties (org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties)2 Frame (org.apache.qpid.server.protocol.v0_10.transport.Frame)2 Header (org.apache.qpid.server.protocol.v0_10.transport.Header)2 MessageProperties (org.apache.qpid.server.protocol.v0_10.transport.MessageProperties)2 Method (org.apache.qpid.server.protocol.v0_10.transport.Method)2 ProtocolError (org.apache.qpid.server.protocol.v0_10.transport.ProtocolError)2 Struct (org.apache.qpid.server.protocol.v0_10.transport.Struct)2 ByteBuffer (java.nio.ByteBuffer)1 BBDecoder (org.apache.qpid.server.protocol.v0_10.transport.BBDecoder)1