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