Class InboundMessageState

  • All Implemented Interfaces:
    CDQEntry

    class InboundMessageState
    extends Object
    implements CDQEntry
    Hold the raw data fragments of an inbound message. Warning - there is no synchronization in this class, take care in InboundMessageFragments to avoid use-after-release, etc.
    • Constructor Detail

      • InboundMessageState

        public InboundMessageState​(RouterContext ctx,
                                   long messageId,
                                   Hash from)
        Only for Poison right now.
      • InboundMessageState

        public InboundMessageState​(RouterContext ctx,
                                   long messageId,
                                   Hash from,
                                   UDPPacketReader.DataReader data,
                                   int dataFragment)
                            throws DataFormatException
        Create a new IMS and read in the data from the fragment. Do NOT call receiveFragment for the same fragment afterwards. This is more efficient if the fragment is the last (and probably only) fragment. The main savings is not allocating ByteArray[64]. SSU 1 only.
        Parameters:
        dataFragment - the fragment index in the DataReader, NOT the fragment number
        Throws:
        DataFormatException - if the fragment was corrupt
        Since:
        0.9.9
      • InboundMessageState

        public InboundMessageState​(RouterContext ctx,
                                   long messageId,
                                   Hash from,
                                   byte[] data,
                                   int off,
                                   int len,
                                   int fragmentNum,
                                   boolean isLast)
                            throws DataFormatException
        Create a new IMS and read in the data from the fragment. Do NOT call receiveFragment for the same fragment afterwards. This is more efficient if the fragment is the last (and probably only) fragment. The main savings is not allocating ByteArray[64]. SSU 2 only.
        Parameters:
        fragmentNum - the fragment number
        Throws:
        DataFormatException - if the fragment was corrupt
        Since:
        0.9.54
    • Method Detail

      • receiveFragment

        public boolean receiveFragment​(UDPPacketReader.DataReader data,
                                       int dataFragment)
                                throws DataFormatException
        Read in the data from the fragment. Caller should synchronize. SSU 1 only.
        Parameters:
        dataFragment - the fragment index in the DataReader, NOT the fragment number
        Returns:
        true if the data was ok, false if it was corrupt
        Throws:
        DataFormatException
      • receiveFragment

        public boolean receiveFragment​(byte[] data,
                                       int off,
                                       int len,
                                       int fragmentNum,
                                       boolean isLast)
                                throws DataFormatException
        Read in the data from the fragment. Caller should synchronize. SSU 2 only.
        Parameters:
        fragmentNum - the fragment number
        Returns:
        true if the data was ok, false if it was corrupt
        Throws:
        DataFormatException
        Since:
        0.9.54
      • hasFragment

        public boolean hasFragment​(int fragmentNum)
        Do we have this fragment? SSU 2 only.
        Parameters:
        fragmentNum - the fragment number
        Returns:
        true if we have the fragment
        Since:
        0.9.54
      • isComplete

        public boolean isComplete()
        May not be valid after released. Probably doesn't need to be synced by caller, given the order of events in receiveFragment() above, but you might want to anyway to be safe.
      • isExpired

        public boolean isExpired()
      • getLifetime

        public long getLifetime()
      • setEnqueueTime

        public void setEnqueueTime​(long now)
        For CDQ
        Specified by:
        setEnqueueTime in interface CDQEntry
        Since:
        0.9.3
      • getEnqueueTime

        public long getEnqueueTime()
        For CDQ
        Specified by:
        getEnqueueTime in interface CDQEntry
        Since:
        0.9.3
      • drop

        public void drop()
        For CDQ
        Specified by:
        drop in interface CDQEntry
        Since:
        0.9.3
      • getFrom

        public Hash getFrom()
      • getMessageId

        public long getMessageId()
      • getCompleteSize

        public int getCompleteSize()
        Throws:
        IllegalStateException - if released or not isComplete()
      • createACKBitfield

        public ACKBitfield createACKBitfield()
        Only call this if not complete. TODO remove this, have InboundMessageState implement ACKBitfield. FIXME synch here or PeerState.fetchPartialACKs()
      • releaseResources

        public void releaseResources()
      • getFragmentCount

        public int getFragmentCount()
      • toString

        public String toString()
        May not be valid if released, or may NPE on race with release, use with care in exception text
        Overrides:
        toString in class Object