Struct.java revision 645501c2ab19a559ce82a1d5a29ced159a4c30fb
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
5package org.chromium.mojo.bindings;
6
7import org.chromium.mojo.system.Core;
8
9/**
10 * Base class for all mojo structs.
11 */
12public abstract class Struct {
13    /**
14     * The base size of the encoded struct.
15     */
16    private final int mEncodedBaseSize;
17
18    /**
19     * The version of the struct.
20     */
21    private final int mVersion;
22
23    /**
24     * Constructor.
25     */
26    protected Struct(int encodedBaseSize, int version) {
27        mEncodedBaseSize = encodedBaseSize;
28        mVersion = version;
29    }
30
31    /**
32     * Returns the version of the struct. It is the max version of the struct in the mojom if it has
33     * been created locally, and the version of the received struct if it has been deserialized.
34     */
35    public int getVersion() {
36        return mVersion;
37    }
38
39    /**
40     * Returns the serialization of the struct. This method can close Handles.
41     *
42     * @param core the |Core| implementation used to generate handles. Only used if the data
43     *            structure being encoded contains interfaces, can be |null| otherwise.
44     */
45    public Message serialize(Core core) {
46        Encoder encoder = new Encoder(core, mEncodedBaseSize);
47        encode(encoder);
48        return encoder.getMessage();
49    }
50
51    /**
52     * Returns the serialization of the struct prepended with the given header.
53     *
54     * @param header the header to prepend to the returned message.
55     * @param core the |Core| implementation used to generate handles. Only used if the |Struct|
56     *            being encoded contains interfaces, can be |null| otherwise.
57     */
58    public ServiceMessage serializeWithHeader(Core core, MessageHeader header) {
59        Encoder encoder = new Encoder(core, mEncodedBaseSize + header.getSize());
60        header.encode(encoder);
61        encode(encoder);
62        return new ServiceMessage(encoder.getMessage(), header);
63    }
64
65    /**
66     * Use the given encoder to serialize this data structure.
67     */
68    protected abstract void encode(Encoder encoder);
69}
70