net.i2p.data.i2np

## Class TunnelBuildMessageBase

- java.lang.Object
- - net.i2p.data.i2np.I2NPMessageImpl
  - - net.i2p.data.i2np.TunnelBuildMessageBase

- All Implemented Interfaces:
    I2NPMessage
  Direct Known Subclasses:
    TunnelBuildMessage, TunnelBuildReplyMessage

      public abstract class TunnelBuildMessageBase
      extends I2NPMessageImpl

  Base for TBM, TBRM, VTBM, VTBRM Retrofitted over them. There's really no difference between the build and build reply. TBM and VBTM (but not TBRM and VTBRM?) messages are modified in-place by doing a single setRecord(), and retransmitted. Therefore they are NOT good candidates to use FastI2NPMessageImpl; the checksum would have to be invalidated with every setRecord(). Which we could do in TBM and VTBM but not TBRM and VTBRM, but keep it simple for now.

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from class net.i2p.data.i2np.I2NPMessageImpl

      `I2NPMessageImpl.Builder`

  - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `protected EncryptedBuildRecord[]` | `_records`
    `static int` | `MAX_RECORD_COUNT`
    `protected int` | `RECORD_COUNT`
    `static int` | `RECORD_SIZE`

    - ### Fields inherited from class net.i2p.data.i2np.I2NPMessageImpl

      `_context, _expiration, _log, CHECKSUM_LENGTH, DEFAULT_EXPIRATION_MS, HEADER_LENGTH`

    - ### Fields inherited from interface net.i2p.data.i2np.I2NPMessage

      `MAX_ID_VALUE, MAX_SIZE`

  - ### Constructor Summary

    Constructors
    Modifier | Constructor and Description
    --- | ---
    `` | `TunnelBuildMessageBase(I2PAppContext context)`
    `protected` | `TunnelBuildMessageBase(I2PAppContext context, int records)`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected int` | `calculateWrittenLength()` calculate the message body's length (not including the header and footer
    `EncryptedBuildRecord` | `getRecord(int index)`
    `int` | `getRecordCount()`
    `void` | `readMessage(byte[] data, int offset, int dataSize, int type)` Read the body into the data structures, after the initial type byte and the uniqueId / expiration, using the current class's format as defined by the I2NP specification
    `void` | `setRecord(int index, EncryptedBuildRecord record)`
    `protected int` | `writeMessageBody(byte[] out, int curIndex)` write the message body to the output array, starting at the given index.

    - ### Methods inherited from class net.i2p.data.i2np.I2NPMessageImpl

      `createMessage, fromRawByteArray, fromRawByteArrayNTCP2, getMessageExpiration, getMessageSize, getRawMessageSize, getUniqueId, getUniqueId, readBytes, readBytes, readMessage, setMessageExpiration, setUniqueId, toByteArray, toByteArray, toByteArray, toRawByteArray, toRawByteArrayNTCP2`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface net.i2p.data.i2np.I2NPMessage

      `getType`

- - ### Field Detail

    - #### _records

          protected EncryptedBuildRecord[] _records

    - #### MAX_RECORD_COUNT

          public static final int MAX_RECORD_COUNT

      See Also:
        Constant Field Values

    - #### RECORD_COUNT

          protected int RECORD_COUNT

    - #### RECORD_SIZE

          public static final int RECORD_SIZE

      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### TunnelBuildMessageBase

          public TunnelBuildMessageBase(I2PAppContext context)

    - #### TunnelBuildMessageBase

          protected TunnelBuildMessageBase(I2PAppContext context,
                                           int records)

  - ### Method Detail

    - #### calculateWrittenLength

          protected int calculateWrittenLength()

      Description copied from class: `I2NPMessageImpl`
      calculate the message body's length (not including the header and footer
      Specified by:
        `calculateWrittenLength` in class `I2NPMessageImpl`

    - #### getRecord

          public EncryptedBuildRecord getRecord(int index)

      Returns:
        may be null

    - #### getRecordCount

          public int getRecordCount()

    - #### readMessage

          public void readMessage(byte[] data,
                                  int offset,
                                  int dataSize,
                                  int type)
                           throws I2NPMessageException

      Description copied from interface: `I2NPMessage`
      Read the body into the data structures, after the initial type byte and the uniqueId / expiration, using the current class's format as defined by the I2NP specification
      Parameters:
        `data` - data to read from
        `offset` - where to start in the data array
        `dataSize` - how long into the data to read
        `type` - I2NP message type
      Throws:
        `I2NPMessageException` - if the stream doesn't contain a valid message that this class can read.

    - #### setRecord

          public void setRecord(int index,
                                EncryptedBuildRecord record)

      Parameters:
        `record` - may be null

    - #### writeMessageBody

          protected int writeMessageBody(byte[] out,
                                         int curIndex)
                                  throws I2NPMessageException

      Description copied from class: `I2NPMessageImpl`
      write the message body to the output array, starting at the given index.
      Specified by:
        `writeMessageBody` in class `I2NPMessageImpl`
      Returns:
        the index into the array after the last byte written (NOT the length)
      Throws:
        `I2NPMessageException`