1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpackage org.chromium.mojo.bindings; 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.nio.ByteBuffer; 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.nio.ByteOrder; 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/** 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Represents a {@link Message} which contains a {@link MessageHeader}. Deals with parsing the 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * {@link MessageHeader} for a message. 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpublic class ServiceMessage extends Message { 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private final MessageHeader mHeader; 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private Message mPayload; 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Reinterpret the given |message| as a message with the given |header|. The |message| must 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * contain the |header| as the start of its raw data. 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public ServiceMessage(Message baseMessage, MessageHeader header) { 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez super(baseMessage.getData(), baseMessage.getHandles()); 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez assert header.equals(new org.chromium.mojo.bindings.MessageHeader(baseMessage)); 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez this.mHeader = header; 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Reinterpret the given |message| as a message with a header. The |message| must contain a 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * header as the start of it's raw data, which will be parsed by this constructor. 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ServiceMessage(Message baseMessage) { 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez this(baseMessage, new org.chromium.mojo.bindings.MessageHeader(baseMessage)); 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * @see Message#asServiceMessage() 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @Override 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public ServiceMessage asServiceMessage() { 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return this; 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Returns the header of the given message. This will throw a {@link DeserializationException} 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * if the start of the message is not a valid header. 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public MessageHeader getHeader() { 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return mHeader; 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Returns the payload of the message. 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public Message getPayload() { 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (mPayload == null) { 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ByteBuffer truncatedBuffer = 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ((ByteBuffer) getData().position(getHeader().getSize())).slice(); 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez truncatedBuffer.order(ByteOrder.LITTLE_ENDIAN); 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mPayload = new Message(truncatedBuffer, getHandles()); 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return mPayload; 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Set the request identifier on the message. 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void setRequestId(long requestId) { 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mHeader.setRequestId(getData(), requestId); 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 74