java.lang.Object
net.i2p.data.i2cp.I2CPMessageImpl
net.i2p.data.i2cp.MessageStatusMessage
All Implemented Interfaces:
I2CPMessage

public class MessageStatusMessageextends I2CPMessageImpl
Defines the message a router sends to a client about a single message. For incoming messages, it tells the client that a new message is available. For outgoing messages, it tells the client whether the message was delivered.
  • Field Details

    • MESSAGE_TYPE

      public static final int MESSAGE_TYPE
      I2CP message type ID written to the wire header.
      See Also:
    • _sessionId

      private int _sessionId
      The session the message belongs to.
    • _messageId

      private long _messageId
      The message being reported on.
    • _nonce

      private long _nonce
      The nonce the message was sent with.
    • _size

      private long _size
      Size of the message, in bytes.
    • _status

      private int _status
      What happened to the message.
    • STATUS_AVAILABLE

      public static final int STATUS_AVAILABLE
      For incoming messages. All the rest are for outgoing.
      See Also:
    • STATUS_SEND_ACCEPTED

      public static final int STATUS_SEND_ACCEPTED
      The router accepted the message for delivery, without guaranteeing success.
      See Also:
    • STATUS_SEND_BEST_EFFORT_SUCCESS

      public static final int STATUS_SEND_BEST_EFFORT_SUCCESS
      Unused best-effort success status code.
      See Also:
    • STATUS_SEND_BEST_EFFORT_FAILURE

      public static final int STATUS_SEND_BEST_EFFORT_FAILURE
      A probable failure, but we don't know for sure.
      See Also:
    • STATUS_SEND_GUARANTEED_SUCCESS

      public static final int STATUS_SEND_GUARANTEED_SUCCESS
      Generic success. May not really be guaranteed, as the best-effort success code is unused.
      See Also:
    • STATUS_SEND_GUARANTEED_FAILURE

      public static final int STATUS_SEND_GUARANTEED_FAILURE
      Generic failure, specific cause unknown. May not really be a guaranteed failure, as the best-effort failure code is unused.
      See Also:
    • STATUS_SEND_SUCCESS_LOCAL

      public static final int STATUS_SEND_SUCCESS_LOCAL
      The far-end destination is local and we are pretty darn sure the delivery succeeded.
      See Also:
    • STATUS_SEND_FAILURE_LOCAL

      public static final int STATUS_SEND_FAILURE_LOCAL
      The far-end destination is local but delivery failed for some reason. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_ROUTER

      public static final int STATUS_SEND_FAILURE_ROUTER
      The router is not ready, has shut down, or has major problems. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_NETWORK

      public static final int STATUS_SEND_FAILURE_NETWORK
      The PC apparently has no network connectivity at all. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_BAD_SESSION

      public static final int STATUS_SEND_FAILURE_BAD_SESSION
      The session is invalid or closed. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_BAD_MESSAGE

      public static final int STATUS_SEND_FAILURE_BAD_MESSAGE
      The message payload is invalid or zero-length or too big. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_BAD_OPTIONS

      public static final int STATUS_SEND_FAILURE_BAD_OPTIONS
      Something is invalid in the message options, or the expiration is too far in the future. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_OVERFLOW

      public static final int STATUS_SEND_FAILURE_OVERFLOW
      Some queue or buffer in the router is full and the message was dropped. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_EXPIRED

      public static final int STATUS_SEND_FAILURE_EXPIRED
      Message expired before it could be sent. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_LOCAL_LEASESET

      public static final int STATUS_SEND_FAILURE_LOCAL_LEASESET
      Local leaseset problems. The client has not yet signed a leaseset, or the local keys are invalid, or it has expired, or it does not have any tunnels in it. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_NO_TUNNELS

      public static final int STATUS_SEND_FAILURE_NO_TUNNELS
      Local problems - no outbound tunnel to send through, or no inbound tunnel if a reply is required. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_UNSUPPORTED_ENCRYPTION

      public static final int STATUS_SEND_FAILURE_UNSUPPORTED_ENCRYPTION
      The certs or options in the destination or leaseset indicate that it uses an encryption format that we don't support, so we can't talk to it. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_DESTINATION

      public static final int STATUS_SEND_FAILURE_DESTINATION
      Something strange is wrong with the far-end destination. Bad format, unsupported options, certificates, etc. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_BAD_LEASESET

      public static final int STATUS_SEND_FAILURE_BAD_LEASESET
      We got the far-end leaseset but something strange is wrong with it. Unsupported options or certificates, no tunnels, etc. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_EXPIRED_LEASESET

      public static final int STATUS_SEND_FAILURE_EXPIRED_LEASESET
      We got the far-end leaseset but it's expired and can't get a new one. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_NO_LEASESET

      public static final int STATUS_SEND_FAILURE_NO_LEASESET
      Could not find the far-end destination's lease set. This is a common failure, equivalent to a DNS lookup fail. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_META_LEASESET

      public static final int STATUS_SEND_FAILURE_META_LEASESET
      The far-end destination's lease set was a meta lease set, and cannot be sent to. The client should request the meta lease set's contents with a HostLookupMessage, and select one of the hashes contained within to lookup and send to. This is a guaranteed failure.
      See Also:
    • STATUS_SEND_FAILURE_LOOPBACK

      public static final int STATUS_SEND_FAILURE_LOOPBACK
      Message was attempted to be sent to the same Destination. This is a guaranteed failure.
      See Also:
  • Constructor Details

    • MessageStatusMessage

      public MessageStatusMessage()
      NOTE: Add any new status codes to handlers in: net.i2p.client.impl.MessageState net.i2p.client.impl.MessageStatusMessageHandler net.i2p.client.streaming.I2PSocketException net.i2p.client.streaming.impl.PacketQueue net.i2p.i2ptunnel.I2PTunnelHTTPClientBase and update http://i2p-projekt.i2p/spec/i2cp
  • Method Details

    • getSessionId

      public long getSessionId()
      Session the status applies to.
      Returns:
      the session id 0-65535, or -1 if not set
    • sessionId

      public SessionId sessionId()
      Return the SessionId for this message.
      Specified by:
      sessionId in interface I2CPMessage
      Overrides:
      sessionId in class I2CPMessageImpl
      Returns:
      null always. Extending classes with a SessionId must override.
    • setSessionId

      public void setSessionId(long id)
      Session ID for this message.
      Parameters:
      id - 0-65535
    • getStatus

      public int getStatus()
      Status code describing what happened to the message.
      Returns:
      one of the STATUS_* constants
    • setStatus

      public void setStatus(int status)
      Status code for this message.
      Parameters:
      status - 0-255
    • isSuccessful

      public boolean isSuccessful()
      Is the status code a success status code?
      Returns:
      true for STATUS_SEND_GUARANTEED_SUCCESS, STATUS_SEND_BEST_EFFORT_SUCCESS, STATUS_SEND_SUCCESS_LOCAL, STATUS_SEND_ACCEPTED or STATUS_AVAILABLE
    • isSuccessful

      public static boolean isSuccessful(int status)
      Is the status code a success status code?
      Parameters:
      status - one of the STATUS_* constants to classify
      Returns:
      true for the five STATUS_* success codes, false otherwise
    • getMessageId

      public long getMessageId()
      This is the router's ID for the message.
      Returns:
      the message id
    • setMessageId

      public void setMessageId(long id)
      This is the router's ID for the message.
      Parameters:
      id - the router-assigned identifier of the message this status describes
    • getSize

      public long getSize()
      Size of the message payload as counted by the router.
      Returns:
      the payload size in bytes
    • setSize

      public void setSize(long size)
      Size of the message data.
      Parameters:
      size - the payload size in bytes as counted by the router
    • getNonce

      public long getNonce()
      This is the client's ID for the message.
      Returns:
      the client-chosen nonce for this message
    • setNonce

      public void setNonce(long nonce)
      This is the client's ID for the message.
      Parameters:
      nonce - the client-chosen identifier the router echoes back in this status
    • getStatusString

      public static final String getStatusString(int status)
      Human-readable name of a status constant.
      Parameters:
      status - the STATUS_* constant to translate
      Returns:
      an upper-case string such as AVAILABLE, or SEND FAILURE CODE: n for unrecognized values
    • doReadMessage

      protected void doReadMessage(InputStream in, int size) throws I2CPMessageException, IOException
      Read the message body from the input stream.
      Specified by:
      doReadMessage in class I2CPMessageImpl
      Parameters:
      in - positioned just past the 4 byte size and 1 byte type header
      size - how many payload bytes remain to be read
      Throws:
      I2CPMessageException - if the message format is invalid
      IOException - if there's an error reading from the stream
    • writeMessage

      public void writeMessage(OutputStream out) throws I2CPMessageException, IOException
      Override to reduce mem churn.
      Specified by:
      writeMessage in interface I2CPMessage
      Overrides:
      writeMessage in class I2CPMessageImpl
      Parameters:
      out - receives the length, type and payload, in that order
      Throws:
      IOException - if the stream rejects the written fields
      I2CPMessageException - if the current object doesn't have sufficient data to write a properly formatted message.
    • doWriteMessage

      protected byte[] doWriteMessage() throws I2CPMessageException, IOException
      Write the message body to the output stream.
      Specified by:
      doWriteMessage in class I2CPMessageImpl
      Returns:
      byte array
      Throws:
      I2CPMessageException - if the message cannot be written
      IOException - if there's an error writing to the stream
    • getType

      public int getType()
      I2CP message type sent for this message.
      Returns:
      the fixed MESSAGE_TYPE of this class
    • toString

      public String toString()
      Returns a string representation of this message.
      Overrides:
      toString in class Object