use of org.apache.qpid.server.protocol.v0_10.transport.Header in project qpid-broker-j by apache.
the class MessageFormat_0_10 method createMessage.
@Override
public MessageTransferMessage createMessage(final QpidByteBuffer payload, final MessageStore store, final Object connectionReference) {
try {
ServerDecoder serverDecoder = new ServerDecoder(payload);
int headerCount = serverDecoder.readInt32();
DeliveryProperties deliveryProperties = null;
MessageProperties messageProperties = null;
List<Struct> nonStandard = null;
for (int i = 0; i < headerCount; i++) {
final Struct struct = serverDecoder.readStruct32();
switch(struct.getStructType()) {
case DeliveryProperties.TYPE:
deliveryProperties = (DeliveryProperties) struct;
break;
case MessageProperties.TYPE:
messageProperties = (MessageProperties) struct;
break;
default:
if (nonStandard == null) {
nonStandard = new ArrayList<>();
}
nonStandard.add(struct);
}
}
Header header = new Header(deliveryProperties, messageProperties, nonStandard);
MessageMetaData_0_10 metaData = new MessageMetaData_0_10(header, payload.remaining(), System.currentTimeMillis());
final MessageHandle<MessageMetaData_0_10> handle = store.addMessage(metaData);
handle.addContent(payload);
final StoredMessage<MessageMetaData_0_10> storedMessage = handle.allContentAdded();
return new MessageTransferMessage(storedMessage, connectionReference);
} catch (BufferUnderflowException e) {
throw new ConnectionScopedRuntimeException("Error parsing AMQP 0-10 message format", e);
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Header in project qpid-broker-j by apache.
the class MessageFormat_0_10 method convertToMessageFormat.
// format: <int header count> <headers> <body>
@Override
public QpidByteBuffer convertToMessageFormat(final MessageTransferMessage message) {
ServerEncoder encoder = new ServerEncoder(4096, true);
Struct[] structs = message.getHeader().getStructs();
encoder.writeInt32(structs.length);
for (Struct struct : structs) {
encoder.writeStruct32(struct);
}
try (QpidByteBuffer headerBuf = encoder.getBuffer();
QpidByteBuffer content = message.getContent()) {
return QpidByteBuffer.concatenate(headerBuf, content);
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Header in project qpid-broker-j by apache.
the class MessageMetaData_0_10 method getStorableSize.
@Override
public int getStorableSize() {
int len = 0;
// arrival time
len += 8;
// body size
len += 4;
// headers length
len += 4;
if (_header != null) {
if (_header.getDeliveryProperties() != null) {
len += EncoderUtils.getStruct32Length(_header.getDeliveryProperties());
}
if (_header.getMessageProperties() != null) {
len += EncoderUtils.getStruct32Length(_header.getMessageProperties());
}
if (_header.getNonStandardProperties() != null) {
for (Struct header : _header.getNonStandardProperties()) {
len += EncoderUtils.getStruct32Length(header);
}
}
}
return len;
}
use of org.apache.qpid.server.protocol.v0_10.transport.Header in project qpid-broker-j by apache.
the class MessageMetaData_0_10 method encodeAsBuffer.
private QpidByteBuffer encodeAsBuffer() {
ServerEncoder encoder = new ServerEncoder(ENCODER_SIZE, false);
encoder.writeInt64(_messageHeader.getArrivalTime());
encoder.writeInt32(_bodySize);
int headersLength = 0;
if (_header != null) {
if (_header.getDeliveryProperties() != null) {
headersLength++;
}
if (_header.getMessageProperties() != null) {
headersLength++;
}
if (_header.getNonStandardProperties() != null) {
headersLength += _header.getNonStandardProperties().size();
}
}
encoder.writeInt32(headersLength);
if (_header != null) {
if (_header.getDeliveryProperties() != null) {
encoder.writeStruct32(_header.getDeliveryProperties());
}
if (_header.getMessageProperties() != null) {
encoder.writeStruct32(_header.getMessageProperties());
}
if (_header.getNonStandardProperties() != null) {
for (Struct header : _header.getNonStandardProperties()) {
encoder.writeStruct32(header);
}
}
}
QpidByteBuffer buf = encoder.getBuffer();
encoder.close();
return buf;
}
use of org.apache.qpid.server.protocol.v0_10.transport.Header 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