protected void InternalAddChannel(IDataChannel channel, int channelId) { var channelInfo = new DataChannelInfo(channel, channelId); if (!_channels.TryAdd(channelId, channelInfo)) { throw new InvalidOperationException("The channel id is already in use"); } Logger.Debug("Add channel with id {channelId}", channelId); channel.Send = (buffer, offset, count, hasOffset) => ChannelSendData(channelInfo, buffer, offset, count, hasOffset); channel.RequiredOffset = _customOffset + 5; }
private async Task ChannelSendData(DataChannelInfo channel, byte[] buffer, int offset, int count, bool hasOffset) { if (hasOffset) { BinaryUtils.WriteInt32(buffer, offset - 5, channel.ChannelId); buffer[offset - 1] = (byte)(channel.IsSynchronized ? 1 : 0); await _socket.SendFrameAsync(MazeSocket.MessageOpcode.Message, new ArraySegment <byte>(buffer, offset - 5, count + 5), true, CancellationToken.None); return; } using (var newBuffer = AllocateBuffer(count + 5)) { BinaryUtils.WriteInt32(newBuffer.Buffer, newBuffer.Offset, channel.ChannelId); newBuffer.Buffer[newBuffer.Offset + 4] = (byte)(channel.IsSynchronized ? 1 : 0); Buffer.BlockCopy(buffer, offset, newBuffer.Buffer, newBuffer.Offset + 5, count); await _socket.SendFrameAsync(MazeSocket.MessageOpcode.Message, new ArraySegment <byte>(newBuffer.Buffer, newBuffer.Offset, count + 5), true, CancellationToken.None); } }