diff --git a/.gitignore b/.gitignore index 8f79b0f..ee72149 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ nuget/ .idea/ .editorconfig *.user +*.DotSettings #backups .old*/ diff --git a/DTLib.Logging.Microsoft/DTLib.Logging.Microsoft.csproj b/DTLib.Logging.Microsoft/DTLib.Logging.Microsoft.csproj index d455681..2a0e14b 100644 --- a/DTLib.Logging.Microsoft/DTLib.Logging.Microsoft.csproj +++ b/DTLib.Logging.Microsoft/DTLib.Logging.Microsoft.csproj @@ -2,7 +2,7 @@ DTLib.Logging.Microsoft - 1.1.0 + 1.1.1 Timerix DTLib logger wrapper with dependency injection GIT @@ -28,6 +28,6 @@ - + diff --git a/DTLib/DTLib.csproj b/DTLib/DTLib.csproj index a34c6b8..e5a6d65 100644 --- a/DTLib/DTLib.csproj +++ b/DTLib/DTLib.csproj @@ -2,7 +2,7 @@ DTLib - 1.6.0 + 1.6.1 Timerix Library for all my C# projects GIT diff --git a/DTLib/DTLib.csproj.DotSettings b/DTLib/DTLib.csproj.DotSettings deleted file mode 100644 index d0157c7..0000000 --- a/DTLib/DTLib.csproj.DotSettings +++ /dev/null @@ -1,3 +0,0 @@ - - False - True \ No newline at end of file diff --git a/DTLib/TransformStream.cs b/DTLib/TransformStream.cs new file mode 100644 index 0000000..9b3ac36 --- /dev/null +++ b/DTLib/TransformStream.cs @@ -0,0 +1,69 @@ +using System.IO; +using File = System.IO.File; + +namespace DTLib; + +/// +/// Stream wrapper for some operations over data chunks. +/// You can add multiple transform operations. +/// +/// using var pipe = new TransformStream(File.OpenRead("encrypted")) +/// .AddTransform(ReportProgress) +/// .AddTransform(Decrypt); +/// using var o = File.OpenWrite("decrypted"); +/// pipe.CopyTo(o); +/// +/// +public class TransformStream : Stream +{ + private readonly Stream _inputStream; + + public delegate void TransformFuncDelegate(byte[] buffer, int offset, int count); + private List _transformFunctions = new(); + + public TransformStream(Stream inputStream) + { + _inputStream = inputStream; + } + + public TransformStream AddTransform(TransformFuncDelegate f) + { + _transformFunctions.Add(f); + return this; + } + + public TransformStream AddTransforms(IEnumerable f) + { + _transformFunctions.AddRange(f); + return this; + } + + public override bool CanRead => _inputStream.CanRead; + public override bool CanSeek => _inputStream.CanSeek; + public override bool CanWrite => false; + public override long Length => _inputStream.Length; + public override long Position { get => _inputStream.Position; set => _inputStream.Position = value; } + + public override int Read(byte[] buffer, int offset, int count) + { + int read = _inputStream.Read(buffer, offset, count); + if(read > 0) + { + for (int i = 0; i < _transformFunctions.Count; i++) + { + _transformFunctions[i].Invoke(buffer, offset, read); + } + } + return read; + } + + public override void Flush() {} + + public override long Seek(long offset, SeekOrigin origin) => _inputStream.Seek(offset, origin); + + public override void SetLength(long value) => throw new NotImplementedException(); + + public override void Write(byte[] buffer, int offset, int count) => throw new NotImplementedException(); + + public override void Close() => _inputStream.Close(); +} \ No newline at end of file