/*
* Copyright (c) 2009, 2012 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Dave Locke - initial API and implementation and/or initial documentation
*/
package org.eclipse.paho.client.mqttv3;
/**
* Represents an object used to pass data to be persisted across the
* {@link org.eclipse.paho.client.mqttv3.MqttClientPersistence MqttClientPersistence}
* interface.
* <p>
* When data is passed across the interface the header and payload are
* separated, so that unnecessary message copies may be avoided.
* For example, if a 10 MB payload was published it would be inefficient
* to create a byte array a few bytes larger than 10 MB and copy the
* MQTT message header and payload into a contiguous byte array.</p>
* <p>
* When the request to persist data is made a separate byte array and offset
* is passed for the header and payload. Only the data between
* offset and length need be persisted.
* So for example, a message to be persisted consists of a header byte
* array starting at offset 1 and length 4, plus a payload byte array
* starting at offset 30 and length 40000. There are three ways in which
* the persistence implementation may return data to the client on
* recovery:
* <ul>
* <li>It could return the data as it was passed in
* originally, with the same byte arrays and offsets.</li>
* <li>It could safely just persist and return the bytes from the offset
* for the specified length. For example, return a header byte array with
* offset 0 and length 4, plus a payload byte array with offset 0 and length
* 40000</li>
* <li>It could return the header and payload as a contiguous byte array
* with the header bytes preceeding the payload. The contiguous byte array
* should be set as the header byte array, with the payload byte array being
* null. For example, return a single byte array with offset 0
* and length 40004.
* This is useful when recovering from a file where the header and payload
* could be written as a contiguous stream of bytes.</li>
* </ul>
* </p>
*/
public interface MqttPersistable {
/**
* Returns the header bytes in an array.
* The bytes start at {@link #getHeaderOffset()}
* and continue for {@link #getHeaderLength()}.
* @return the header bytes.
*/
public byte[] getHeaderBytes() throws MqttPersistenceException;
/**
* Returns the length of the header.
* @return the header length
*/
public int getHeaderLength() throws MqttPersistenceException;
/**
* Returns the offset of the header within the byte array returned by {@link #getHeaderBytes()}.
* @return the header offset.
*
*/
public int getHeaderOffset() throws MqttPersistenceException;
/**
* Returns the payload bytes in an array.
* The bytes start at {@link #getPayloadOffset()}
* and continue for {@link #getPayloadLength()}.
* @return the payload bytes.
*/
public byte[] getPayloadBytes() throws MqttPersistenceException;
/**
* Returns the length of the payload.
* @return the payload length.
*/
public int getPayloadLength() throws MqttPersistenceException;
/**
* Returns the offset of the payload within the byte array returned by {@link #getPayloadBytes()}.
* @return the payload offset.
*
*/
public int getPayloadOffset() throws MqttPersistenceException;
}