blob: 14f4e1e7261cd32657b023af5bbee52dfadff690 [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 org.chromium.mojo.system.Core;
import java.nio.ByteBuffer;
/**
* Base class for all mojo structs.
*/
public abstract class Struct {
/**
* The base size of the encoded struct.
*/
private final int mEncodedBaseSize;
/**
* The version of the struct.
*/
private final int mVersion;
/**
* Constructor.
*/
protected Struct(int encodedBaseSize, int version) {
mEncodedBaseSize = encodedBaseSize;
mVersion = version;
}
/**
* Returns the version of the struct. It is the max version of the struct in the mojom if it has
* been created locally, and the version of the received struct if it has been deserialized.
*/
public int getVersion() {
return mVersion;
}
/**
* Returns the serialization of the struct. This method can close Handles.
*
* @param core the |Core| implementation used to generate handles. Only used if the data
* structure being encoded contains interfaces, can be |null| otherwise.
*/
public Message serialize(Core core) {
Encoder encoder = new Encoder(core, mEncodedBaseSize);
encode(encoder);
return encoder.getMessage();
}
/**
* Similar to the method above, but returns the serialization result as |ByteBuffer|.
*
* @throws UnsupportedOperationException if the struct contains interfaces or handles.
* @throws SerializationException on serialization failure.
*/
public ByteBuffer serialize() {
// If the struct contains interfaces which require a non-null |Core| instance, it will throw
// UnsupportedOperationException.
Message message = serialize(null);
if (!message.getHandles().isEmpty())
throw new UnsupportedOperationException("Handles are discarded.");
return message.getData();
}
/**
* Returns the serialization of the struct prepended with the given header.
*
* @param header the header to prepend to the returned message.
* @param core the |Core| implementation used to generate handles. Only used if the |Struct|
* being encoded contains interfaces, can be |null| otherwise.
*/
public ServiceMessage serializeWithHeader(Core core, MessageHeader header) {
Encoder encoder = new Encoder(core, mEncodedBaseSize + header.getSize());
header.encode(encoder);
encode(encoder);
return new ServiceMessage(encoder.getMessage(), header);
}
/**
* Use the given encoder to serialize this data structure.
*/
protected abstract void encode(Encoder encoder);
}