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); }
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); }
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); } }
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)); }
public DCTransportMessage(int length) { Length = length; Type = DataLinkMessageType.Incomplete; Content = ReadOnlySequence <byte> .Empty; }
public DCTransportMessage(int length, DataLinkMessageType type, ReadOnlySequence <byte> content) { Length = length; Type = type; Content = content; }