1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.mojo.bindings; 6 7 import java.nio.ByteBuffer; 8 import java.nio.ByteOrder; 9 10 /** 11 * Represents a {@link Message} which contains a {@link MessageHeader}. Deals with parsing the 12 * {@link MessageHeader} for a message. 13 */ 14 public class ServiceMessage extends Message { 15 16 private final MessageHeader mHeader; 17 private Message mPayload; 18 19 /** 20 * Reinterpret the given |message| as a message with the given |header|. The |message| must 21 * contain the |header| as the start of its raw data. 22 */ ServiceMessage(Message baseMessage, MessageHeader header)23 public ServiceMessage(Message baseMessage, MessageHeader header) { 24 super(baseMessage.getData(), baseMessage.getHandles()); 25 assert header.equals(new org.chromium.mojo.bindings.MessageHeader(baseMessage)); 26 this.mHeader = header; 27 } 28 29 /** 30 * Reinterpret the given |message| as a message with a header. The |message| must contain a 31 * header as the start of it's raw data, which will be parsed by this constructor. 32 */ ServiceMessage(Message baseMessage)33 ServiceMessage(Message baseMessage) { 34 this(baseMessage, new org.chromium.mojo.bindings.MessageHeader(baseMessage)); 35 } 36 37 /** 38 * @see Message#asServiceMessage() 39 */ 40 @Override asServiceMessage()41 public ServiceMessage asServiceMessage() { 42 return this; 43 } 44 45 /** 46 * Returns the header of the given message. This will throw a {@link DeserializationException} 47 * if the start of the message is not a valid header. 48 */ getHeader()49 public MessageHeader getHeader() { 50 return mHeader; 51 } 52 53 /** 54 * Returns the payload of the message. 55 */ getPayload()56 public Message getPayload() { 57 if (mPayload == null) { 58 ByteBuffer truncatedBuffer = 59 ((ByteBuffer) getData().position(getHeader().getSize())).slice(); 60 truncatedBuffer.order(ByteOrder.LITTLE_ENDIAN); 61 mPayload = new Message(truncatedBuffer, getHandles()); 62 } 63 return mPayload; 64 } 65 66 /** 67 * Set the request identifier on the message. 68 */ setRequestId(long requestId)69 void setRequestId(long requestId) { 70 mHeader.setRequestId(getData(), requestId); 71 } 72 73 } 74