Esempio n. 1
0
        public static async ValueTask <WrxPacket> ReadAsync(IAsyncSimpleInputStream <byte> stream, CancellationToken cancellationToken = default)
        {
            WrxPacket packet;
            ushort    crc;

            await using (var crcStream = Crc16.CcittFalse.Wrap(stream, leaveBaseUndisposed: true))
            {
                packet = await crcStream.ReadByteAsync(cancellationToken).ConfigureAwait(false) switch
                {
                    0 => await ReadProtocol0Async(crcStream, cancellationToken).ConfigureAwait(false),
                    1 => await ReadProtocol1Async(crcStream, cancellationToken).ConfigureAwait(false),
                    _ => throw new Exception(),
                };

                crc = crcStream.Crc;
            }

            if (await stream.ReadUInt16LittleEndianAsync(cancellationToken).ConfigureAwait(false) != crc)
            {
                packet.Dispose();
                throw new Exception("CRC verification failed.");
            }

            return(packet);
        }
Esempio n. 2
0
 private static async ValueTask PreReadAsync(IAsyncSimpleInputStream <byte> stream, CancellationToken cancellationToken)
 {
     if (await stream.ReadByteAsync(cancellationToken) != 0xC0)
     {
         throw new Exception();
     }
 }
Esempio n. 3
0
 public WrxCommandClient(
     IAsyncSimpleOutputStream <byte> requestStream,
     IAsyncSimpleInputStream <byte> responseStream,
     ArrayPool <byte> byteArrayPool,
     bool doNotDisposeRequestStream  = false,
     bool doNotDisposeResponseStream = false) :
     this(
         new WrxPacketWriter(requestStream, doNotDisposeRequestStream),
         new WrxPacketReader(responseStream, doNotDisposeResponseStream),
         byteArrayPool)
 {
 }
Esempio n. 4
0
 public WrxCommandServer(
     IAsyncSimpleInputStream <byte> requestStream,
     IAsyncSimpleOutputStream <byte> responseStream,
     IAsyncWrxCommandHandler commandHandler,
     bool doNotDisposeRequestStream  = false,
     bool doNotDisposeResponseStream = false) :
     this(
         new WrxPacketReader(requestStream, doNotDisposeRequestStream),
         new WrxPacketWriter(responseStream, doNotDisposeResponseStream),
         commandHandler,
         ArrayPool <byte> .Shared)
 {
 }
Esempio n. 5
0
 public WrxCommandClient(
     IAsyncSimpleOutputStream <byte> requestStream,
     IAsyncSimpleInputStream <byte> responseStream,
     bool doNotDisposeRequestStream  = false,
     bool doNotDisposeResponseStream = false) :
     this(
         requestStream,
         responseStream,
         ArrayPool <byte> .Shared,
         doNotDisposeRequestStream,
         doNotDisposeResponseStream)
 {
 }
        public static async ValueTask <byte> ReadByteAsync(this IAsyncSimpleInputStream <byte> stream, ArrayPool <byte> arrayPool, CancellationToken cancellationToken = default)
        {
            var array = arrayPool.Rent(1);

            try
            {
                await stream.ReadFullyAsync(array.AsMemory(..1)).ConfigureAwait(false);

                return(array[0]);
            }
            finally
            {
                arrayPool.Return(array);
            }
        }
Esempio n. 7
0
        public static async ValueTask <TResult> ReadPacketAsync <TResult>(
            IAsyncSimpleInputStream <byte> stream,
            Func <IAsyncSimpleInputStream <byte>, CancellationToken, ValueTask <TResult> > callback,
            CancellationToken cancellationToken = default)
        {
            await PreReadAsync(stream, cancellationToken).ConfigureAwait(false);

            await using var packetStream = new PacketInputStream(stream);

            try
            {
                return(await callback(packetStream, cancellationToken).ConfigureAwait(false));
            }
            finally
            {
                await PostReadAsync(packetStream, cancellationToken).ConfigureAwait(false);
            }
        }
 public static SimpleCrcInputStream <T> Wrap <T>(this CrcParameters <T> parameters, IAsyncSimpleInputStream <byte> @base, bool leaveBaseUndisposed = false)
 {
     return(new SimpleCrcInputStream <T>(@base, parameters, leaveBaseUndisposed));
 }
Esempio n. 9
0
 internal PacketInputStream(IAsyncSimpleInputStream <byte> @base)
 {
     _base = @base;
 }
Esempio n. 10
0
        private static async ValueTask <WrxPacket> ReadCommonAsync(int protocol, WrxPacketAction action, int command, int dataLength, IAsyncSimpleInputStream <byte> stream, CancellationToken cancellationToken)
        {
            var data = ArrayPool <byte> .Shared.Rent(dataLength);

            await stream.ReadFullyAsync(data.AsMemory(..dataLength), cancellationToken).ConfigureAwait(false);

            return(new WrxPacket(protocol, action, command, data.AsMemory(..dataLength), OnDispose, data));
Esempio n. 11
0
 public WrxPacketReader(IAsyncSimpleInputStream <byte> @base, bool leaveBaseUndisposed = false) :
     base(@base, leaveBaseUndisposed)
 {
 }
 public SimpleCrcInputStream(IAsyncSimpleInputStream <byte> @base, CrcCalculator <T> crcCalculator, bool leaveBaseUndisposed = false) :
     base(@base, leaveBaseUndisposed)
 {
     CrcCalculator = crcCalculator;
 }
 public SimpleCrcInputStream(IAsyncSimpleInputStream <byte> @base, CrcParameters <T> crcParameters, bool leaveBaseUndisposed = false) :
     this(@base, crcParameters.CreateCalculator(), leaveBaseUndisposed)
 {
 }
 public static async ValueTask ReadFullyAsync <T>(this IAsyncSimpleInputStream <T> stream, Memory <T> buffer, CancellationToken cancellationToken = default)
 {
     for (int index = 0, count; index < buffer.Length; index += count)
     {
         count = await stream.ReadAsync(buffer[index..], cancellationToken).ConfigureAwait(false);
 public static ValueTask <byte> ReadByteAsync(this IAsyncSimpleInputStream <byte> stream, CancellationToken cancellationToken = default)
 {
     return(stream.ReadByteAsync(ArrayPool <byte> .Shared, cancellationToken));
 }