blob: 313dc6aea398d68e3f0c1cadaaa199be668c451c [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.mojo.bindings;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* Represents a {@link Message} which contains a {@link MessageHeader}. Deals with parsing the
* {@link MessageHeader} for a message.
*/
public class ServiceMessage extends Message {
private final MessageHeader mHeader;
private Message mPayload;
/**
* Reinterpret the given |message| as a message with the given |header|. The |message| must
* contain the |header| as the start of its raw data.
*/
public ServiceMessage(Message baseMessage, MessageHeader header) {
super(baseMessage.getData(), baseMessage.getHandles());
assert header.equals(new org.chromium.mojo.bindings.MessageHeader(baseMessage));
this.mHeader = header;
}
/**
* Reinterpret the given |message| as a message with a header. The |message| must contain a
* header as the start of it's raw data, which will be parsed by this constructor.
*/
ServiceMessage(Message baseMessage) {
this(baseMessage, new org.chromium.mojo.bindings.MessageHeader(baseMessage));
}
/**
* @see Message#asServiceMessage()
*/
@Override
public ServiceMessage asServiceMessage() {
return this;
}
/**
* Returns the header of the given message. This will throw a {@link DeserializationException}
* if the start of the message is not a valid header.
*/
public MessageHeader getHeader() {
return mHeader;
}
/**
* Returns the payload of the message.
*/
public Message getPayload() {
if (mPayload == null) {
ByteBuffer truncatedBuffer =
((ByteBuffer) getData().position(getHeader().getSize())).slice();
truncatedBuffer.order(ByteOrder.LITTLE_ENDIAN);
mPayload = new Message(truncatedBuffer, getHandles());
}
return mPayload;
}
/**
* Set the request identifier on the message.
*/
void setRequestId(long requestId) {
mHeader.setRequestId(getData(), requestId);
}
}