Class PacketInputStream

java.lang.Object
java.io.InputStream
org.refcodes.serial.PacketInputStream
All Implemented Interfaces:
Closeable, AutoCloseable, org.refcodes.mixin.BlockSizeAccessor, org.refcodes.mixin.PacketSizeAccessor, org.refcodes.numerical.EndianessAccessor, PacketLengthWidthAccessor, PacketMagicBytesAccessor, PacketSegmentPackagerAccessor, SequenceNumberAccessor, SequenceNumberConcatenateModeAccessor, SequenceNumberInitValueAccessor, SequenceNumberWidthAccessor
Direct Known Subclasses:
StopAndWaitPacketInputStream

public class PacketInputStream extends InputStream implements PacketLengthWidthAccessor, org.refcodes.numerical.EndianessAccessor, org.refcodes.mixin.BlockSizeAccessor, SequenceNumberAccessor, SequenceNumberWidthAccessor, SequenceNumberInitValueAccessor, SequenceNumberConcatenateModeAccessor, org.refcodes.mixin.PacketSizeAccessor, PacketSegmentPackagerAccessor, PacketMagicBytesAccessor
The PacketInputStream wraps an InputStream and chunks any data to be written into packets with a sequence number and a block of data. An according PacketInputStream then reverts the packetised data stream while performing sequence number validation. A SegmentPackager can be used to add functionality such as CRC checksum support.
  • Field Details

  • Constructor Details

    • PacketInputStream

      public PacketInputStream(InputStream aInputStream, TransmissionMetrics aTransmissionMetrics)
      Constructs an according PacketInputStream instance wrapping the given InputStream. The configuration attributes are taken from the TransmissionMetrics configuration object, though only those attributes are supported which are also supported by the other constructors!
      Parameters:
      aInputStream - The InputStream to be wrapped.
      aTransmissionMetrics - The TransmissionMetrics to be used for configuring this instance.
    • PacketInputStream

      public PacketInputStream(InputStream aInputStream, int aBlockSize, int aPacketLengthWidth, byte[] aPacketMagicBytes, int aSequenceNumberInitValue, int aSequenceNumberWidth, org.refcodes.mixin.ConcatenateMode aSequenceNumberConcatenateMode, SegmentPackager aPacketSegmentPackager, org.refcodes.numerical.Endianess aEndianess)
      Constructs an according PacketInputStream instance wrapping the given InputStream.
      Parameters:
      aInputStream - The InputStream to be wrapped.
      aBlockSize - The block size of a data block for each packet.
      aPacketLengthWidth - The width (bytes) for declaring the (max) length of a package.
      aPacketMagicBytes - The magic bytes identifying a packet and distinguishing a packet from a last package.
      aSequenceNumberInitValue - The initial sequence number from where to start counting the blocks.
      aSequenceNumberWidth - The width (in bytes) to be used for sequence number values.
      aSequenceNumberConcatenateMode - The mode of concatenation to use when creating a Sequence from this Transmission and the decorated Transmission.
      aPacketSegmentPackager - An (optional) SegmentPackager used to modify a packet's data e.g. with a CRC checksum.
      aEndianess - The Endianess to use for integer (double) numbers and the like.
  • Method Details

    • builder

      public static PacketInputStream.Builder builder()
      Creates builder to build PacketInputStream.
      Returns:
      created builder
    • available

      public int available() throws IOException
      Overrides:
      available in class InputStream
      Throws:
      IOException
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class InputStream
      Throws:
      IOException
    • getBlockSize

      public int getBlockSize()
      Specified by:
      getBlockSize in interface org.refcodes.mixin.BlockSizeAccessor
    • getEndianess

      public org.refcodes.numerical.Endianess getEndianess()
      Specified by:
      getEndianess in interface org.refcodes.numerical.EndianessAccessor
    • getPacketMagicBytes

      public byte[] getPacketMagicBytes()
      Retrieves the magic bytes from the packet magic bytes property.
      Specified by:
      getPacketMagicBytes in interface PacketMagicBytesAccessor
      Returns:
      The magic bytes stored by the packet magic bytes property.
    • getPacketSegmentPackager

      public SegmentPackager getPacketSegmentPackager()
      Retrieves the SegmentPackager from the packet SegmentPackager property.
      Specified by:
      getPacketSegmentPackager in interface PacketSegmentPackagerAccessor
      Returns:
      The SegmentPackager stored by the packet SegmentPackager property.
    • getPacketSize

      public int getPacketSize()
      Specified by:
      getPacketSize in interface org.refcodes.mixin.PacketSizeAccessor
    • getSequenceNumber

      public int getSequenceNumber()
      Retrieves the sequence number from the sequence number property.
      Specified by:
      getSequenceNumber in interface SequenceNumberAccessor
      Returns:
      The sequence number stored by the sequence number property.
    • getSequenceNumberConcatenateMode

      public org.refcodes.mixin.ConcatenateMode getSequenceNumberConcatenateMode()
      Retrieves the ConcatenateMode from the sequence number ConcatenateMode property.
      Specified by:
      getSequenceNumberConcatenateMode in interface SequenceNumberConcatenateModeAccessor
      Returns:
      The ConcatenateMode stored by the sequence number ConcatenateMode property.
    • getSequenceNumberInitValue

      public int getSequenceNumberInitValue()
      Retrieves the sequence number initial value from the sequence number initial value property.
      Specified by:
      getSequenceNumberInitValue in interface SequenceNumberInitValueAccessor
      Returns:
      The sequence number initial value stored by the sequence number initial value property.
    • getSequenceNumberWidth

      public int getSequenceNumberWidth()
      Retrieves the sequence number width (in bytes) from the sequence number width (in bytes) property.
      Specified by:
      getSequenceNumberWidth in interface SequenceNumberWidthAccessor
      Returns:
      The sequence number width (in bytes) stored by the sequence number width (in bytes) property.
    • getPacketLengthWidth

      public int getPacketLengthWidth()
      Retrieves the packet length width (in bytes) from the packet length width (in bytes) property.
      Specified by:
      getPacketLengthWidth in interface PacketLengthWidthAccessor
      Returns:
      The packet length width (in bytes) stored by the packet length width (in bytes) property.
    • mark

      public void mark(int readlimit)
      Overrides:
      mark in class InputStream
    • markSupported

      public boolean markSupported()
      Overrides:
      markSupported in class InputStream
    • read

      public int read() throws IOException
      Specified by:
      read in class InputStream
      Throws:
      IOException
    • reset

      public void reset() throws IOException
      Overrides:
      reset in class InputStream
      Throws:
      IOException
    • doReceivePacket

      protected void doReceivePacket() throws IOException
      Do receive packet.
      Throws:
      IOException - Signals that an I/O exception has occurred.