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();
}
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);
}
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);
}
}
}
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);
}
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);
}
Aggregations