Package net.i2p.data.i2np
Class I2NPMessageImpl
java.lang.Object
net.i2p.data.i2np.I2NPMessageImpl
- All Implemented Interfaces:
I2NPMessage
- Direct Known Subclasses:
FastI2NPMessageImpl
,TunnelBuildMessageBase
Defines the base message implementation.
Note: No longer extends DataStructureImpl as of 0.9.48
- Author:
- jrandom
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic interface
interface for extending the types of messages handled - unused -
Field Summary
Modifier and TypeFieldDescriptionprotected final I2PAppContext
protected long
protected final Log
static final int
static final long
static final int
16Fields inherited from interface net.i2p.data.i2np.I2NPMessage
MAX_ID_VALUE, MAX_SIZE
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected abstract int
calculate the message body's length (not including the header and footerstatic I2NPMessage
createMessage
(I2PAppContext context, int type) Yes, this is fairly ugly, but its the only place it ever happens.static I2NPMessage
fromRawByteArray
(I2PAppContext ctx, byte[] buffer, int offset, int len, I2NPMessageHandler handler) Read the message with a short 5-byte header.static I2NPMessage
fromRawByteArrayNTCP2
(I2PAppContext ctx, byte[] buffer, int offset, int len, I2NPMessageHandler handler) Read the message with a short 9-byte header.long
Date after which the message should be dropped (and the associated uniqueId forgotten)int
How large the message is, including any checksums, i.e.int
The raw header consists of a one-byte type and a 4-byte expiration in seconds only.long
Replay resistant message Idint
readBytes
(byte[] data, int type, int offset) Read the header, then read the rest into buffer, then call readMessage in the implemented message typeint
readBytes
(byte[] data, int type, int offset, int maxLen) Set a limit on the max to read from the data buffer, so that we can use a large buffer but prevent the reader from reading off the end.void
readBytes
(InputStream in) Deprecated.unusedvoid
readMessage
(byte[] data, int offset, int dataSize, int type, I2NPMessageHandler handler) static final void
registerBuilder
(I2NPMessageImpl.Builder builder, int type) Deprecated.unusedvoid
setMessageExpiration
(long exp) The expiration is set to one minute from now in the constructor but it can be overridden here.void
setUniqueId
(long id) The ID is set to a random value when written but it can be overridden here.byte[]
int
toByteArray
(byte[] buffer) write the message to the buffer, returning the number of bytes written.int
toByteArray
(byte[] buffer, int off) Write the message to the buffer, returning the new offset (NOT the length).int
toRawByteArray
(byte[] buffer) Write the message with a short 5-byte header.int
toRawByteArrayNTCP2
(byte[] buffer, int off) Write the message to the buffer, returning the new offset (NOT the length).void
writeBytes
(OutputStream out) Deprecated.unusedprotected abstract int
writeMessageBody
(byte[] out, int curIndex) write the message body to the output array, starting at the given index.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, readMessage
-
Field Details
-
_log
-
_context
-
_expiration
protected long _expiration -
DEFAULT_EXPIRATION_MS
public static final long DEFAULT_EXPIRATION_MS- See Also:
-
CHECKSUM_LENGTH
public static final int CHECKSUM_LENGTH- See Also:
-
HEADER_LENGTH
public static final int HEADER_LENGTH16- See Also:
-
-
Constructor Details
-
I2NPMessageImpl
-
-
Method Details
-
registerBuilder
Deprecated.unused -
readBytes
Deprecated.unusedRead the whole message. Unused - All transports provide encapsulation and so we have byte arrays available.- Throws:
UnsupportedOperationException
- always
-
readBytes
Read the header, then read the rest into buffer, then call readMessage in the implemented message typeSpecifically: 1 byte type (if caller didn't read already, as specified by the type param 4 byte ID 8 byte expiration 2 byte size 1 byte checksum size bytes of payload (read by readMessage() in implementation)
- Specified by:
readBytes
in interfaceI2NPMessage
- Parameters:
data
- the datatype
- the message type or -1 if we should read it hereoffset
- where to start starting at type if type is < 0 (16 byte header) starting at ID if type is >= 0 (15 byte header)- Returns:
- total length of the message
- Throws:
I2NPMessageException
- if there is no valid message
-
readBytes
Set a limit on the max to read from the data buffer, so that we can use a large buffer but prevent the reader from reading off the end.- Specified by:
readBytes
in interfaceI2NPMessage
- Parameters:
data
- the data, may or may not include the typetype
- the message type or -1 if we should read it hereoffset
- where to start starting at type if type is < 0 (16 byte header) starting at ID if type is >= 0 (15 byte header)maxLen
- read no more than this many bytes from data starting at offset, even if it is longer This includes the type byte only if type < 0- Returns:
- total length of the message
- Throws:
I2NPMessageException
- if there is no valid message- Since:
- 0.8.12
-
writeBytes
Deprecated.unusedDon't do this if you need a byte array - use toByteArray()- Throws:
UnsupportedOperationException
- always
-
getUniqueId
public long getUniqueId()Replay resistant message Id- Specified by:
getUniqueId
in interfaceI2NPMessage
-
setUniqueId
public void setUniqueId(long id) The ID is set to a random value when written but it can be overridden here.- Specified by:
setUniqueId
in interfaceI2NPMessage
-
getMessageExpiration
public long getMessageExpiration()Date after which the message should be dropped (and the associated uniqueId forgotten)- Specified by:
getMessageExpiration
in interfaceI2NPMessage
-
setMessageExpiration
public void setMessageExpiration(long exp) The expiration is set to one minute from now in the constructor but it can be overridden here.- Specified by:
setMessageExpiration
in interfaceI2NPMessage
-
getMessageSize
public int getMessageSize()Description copied from interface:I2NPMessage
How large the message is, including any checksums, i.e. full 16 byte header- Specified by:
getMessageSize
in interfaceI2NPMessage
-
getRawMessageSize
public int getRawMessageSize()The raw header consists of a one-byte type and a 4-byte expiration in seconds only. Used by SSU only!- Specified by:
getRawMessageSize
in interfaceI2NPMessage
-
toByteArray
public byte[] toByteArray()- Specified by:
toByteArray
in interfaceI2NPMessage
-
toByteArray
public int toByteArray(byte[] buffer) write the message to the buffer, returning the number of bytes written. the data is formatted so as to be self contained, with the type, size, expiration, unique id, as well as a checksum bundled along. Full 16 byte header for NTCP 1.- Specified by:
toByteArray
in interfaceI2NPMessage
- Returns:
- the length written
-
toByteArray
public int toByteArray(byte[] buffer, int off) Write the message to the buffer, returning the new offset (NOT the length). the data is formatted so as to be self contained, with the type, size, expiration, unique id, as well as a checksum bundled along. Full 16 byte header for NTCP 1.- Specified by:
toByteArray
in interfaceI2NPMessage
- Parameters:
off
- the offset to start writing at- Returns:
- the new offset (NOT the length)
- Since:
- 0.9.36 with off param
-
calculateWrittenLength
protected abstract int calculateWrittenLength()calculate the message body's length (not including the header and footer -
writeMessageBody
write the message body to the output array, starting at the given index.- Returns:
- the index into the array after the last byte written (NOT the length)
- Throws:
I2NPMessageException
-
toRawByteArray
public int toRawByteArray(byte[] buffer) Write the message with a short 5-byte header. THe header consists of a one-byte type and a 4-byte expiration in seconds only. Used by SSU only!- Specified by:
toRawByteArray
in interfaceI2NPMessage
- Returns:
- the new offset (NOT the length)
-
toRawByteArrayNTCP2
public int toRawByteArrayNTCP2(byte[] buffer, int off) Write the message to the buffer, returning the new offset (NOT the length). the data is is not self contained - it does not include the size, unique id, or any checksum, but does include the type and expiration. Short 9 byte header for NTCP2 and SSU2.- Specified by:
toRawByteArrayNTCP2
in interfaceI2NPMessage
- Parameters:
off
- the offset to start writing at- Returns:
- the new offset (NOT the length)
- Since:
- 0.9.36
-
readMessage
public void readMessage(byte[] data, int offset, int dataSize, int type, I2NPMessageHandler handler) throws I2NPMessageException - Specified by:
readMessage
in interfaceI2NPMessage
- Throws:
I2NPMessageException
-
fromRawByteArray
public static I2NPMessage fromRawByteArray(I2PAppContext ctx, byte[] buffer, int offset, int len, I2NPMessageHandler handler) throws I2NPMessageException Read the message with a short 5-byte header. THe header consists of a one-byte type and a 4-byte expiration in seconds only. Used by SSU only!- Throws:
I2NPMessageException
-
fromRawByteArrayNTCP2
public static I2NPMessage fromRawByteArrayNTCP2(I2PAppContext ctx, byte[] buffer, int offset, int len, I2NPMessageHandler handler) throws I2NPMessageException Read the message with a short 9-byte header. THe header consists of a one-byte type, 4-byte ID, and a 4-byte expiration in seconds only. Used by NTCP2 and SSU2 only!- Parameters:
handler
- ignored, may be null- Throws:
I2NPMessageException
- Since:
- 0.9.35
-
createMessage
public static I2NPMessage createMessage(I2PAppContext context, int type) throws I2NPMessageException Yes, this is fairly ugly, but its the only place it ever happens.- Returns:
- non-null, returns an UnknownI2NPMessage if unknown type
- Throws:
I2NPMessageException
-