Exemple #1
0
        private bool TryParseCompressedMessage(DataLinkMessageType type, ReadOnlySequence <byte> buffer, int inlinelength, out DCTransportMessage transportMessage)
        {
            var isShortForm = inlinelength != 0x0f;
            int length;

            if (isShortForm)
            {
                if (buffer.Length <= 1)
                {
                    transportMessage = DCTransportMessage.Incomplete;
                    return(false);
                }
                length = (inlinelength << 8) + buffer.FirstSpan[0];
                buffer = buffer.Slice(1);
            }
            else
            {
                if (buffer.Length <= 4)
                {
                    transportMessage = DCTransportMessage.Incomplete;
                    return(false);
                }
                length = ReadInt32(ref buffer);
            }
            if (buffer.Length < length)
            {
                transportMessage = DCTransportMessage.Incomplete;
                return(false);
            }
            transportMessage = new DCTransportMessage(1 + (isShortForm ? 1 : 4) + length, type, buffer.Slice(0, length));
            return(true);
        }
Exemple #2
0
        private static IMemoryOwner <byte> Encode(DataLinkMessageType type, int value)
        {
            var array = ExactSizeMemoryPool.Shared.Rent(1 + 4);

            array.Memory.Span[0] = (byte)type;
            BitConverter.TryWriteBytes(array.Memory.Span.Slice(1), value);
            return(array);
        }
Exemple #3
0
        private bool ParseCore(ReadOnlySequence <byte> buffer, DataLinkMessageType type)
        {
            switch (type)
            {
            case DataLinkMessageType.Connect:
                // It should be handled in DataLinkCollection.
                // And not allow in connected status.
                return(false);

            case DataLinkMessageType.SyncNode:
            {
                _ = _dlc.OnSyncNode(this);
                return(true);
            }

            case DataLinkMessageType.ReplySyncNode:
            {
                var sn = _decoder.ParseReplySyncNode(buffer);
                _dlc.OnReplySyncNode(new IPEndPoint(sn.Address, sn.Port), sn.Name);
                return(true);
            }

            case DataLinkMessageType.Ping:
            {
                var ack = _decoder.ParseInteger(buffer);
                _ = Ack(ack.Value, true);
                return(true);
            }

            case DataLinkMessageType.AckNo:
            case DataLinkMessageType.AckYes:
            {
                var ack = _decoder.ParseInteger(buffer);
                if (_acks.TryGetValue(ack.Value, out var tcs))
                {
                    tcs.TrySetResult(type == DataLinkMessageType.AckYes);
                }
                return(true);
            }

            case DataLinkMessageType.Sub:
            case DataLinkMessageType.Unsub:
            {
                var msg = _decoder.ParseInteger(buffer);
                _dlc.OnIsSubscribedChanged(this, msg.Value, type == DataLinkMessageType.Sub);
                return(true);
            }

            case DataLinkMessageType.Query:
            {
                var query = _decoder.ParseQuery(buffer);
                _dlc.OnQuery(this, query.Ack, query.Hash);
                return(true);
            }

            case DataLinkMessageType.Payload:
            case DataLinkMessageType.PayloadWithAck:
                if (RemoteName == null)
                {
                    _ = Disconnect();
                }
                else
                {
                    var m = _decoder.ParsePayload(buffer, type == DataLinkMessageType.PayloadWithAck);
                    _ = _dlc.OnMessage(this, m.ChannelHash, m.Channel, m.Payload, m.AckId);
                }
                return(true);

            case DataLinkMessageType.Disconnect:
                _inPipe.Reader.CancelPendingRead();
                _ = Disconnect();
                _cts.Cancel();
                return(false);

            default:
                return(false);
            }
        }
Exemple #4
0
 private static Span <byte> WriteMessageWithCompressedLength(Span <byte> array, DataLinkMessageType type, int length, bool isShortForm)
 {
     if (isShortForm)
     {
         array[0] = (byte)((byte)type + (length >> 8));
         array[1] = (byte)length;
         return(array.Slice(2));
     }
     array[0] = (byte)((byte)type + 0xF);
     BitConverter.TryWriteBytes(array.Slice(1), length);
     return(array.Slice(5));
 }
Exemple #5
0
 public DCTransportMessage(int length)
 {
     Length  = length;
     Type    = DataLinkMessageType.Incomplete;
     Content = ReadOnlySequence <byte> .Empty;
 }
Exemple #6
0
 public DCTransportMessage(int length, DataLinkMessageType type, ReadOnlySequence <byte> content)
 {
     Length  = length;
     Type    = type;
     Content = content;
 }