Advertisement
Guest User

Untitled

a guest
May 4th, 2017
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.58 KB | None | 0 0
  1. public class AggregatedStreamAdvanced : ComStream
  2.     {
  3.         private readonly List<Tuple<long, Stream>> cache = new List<Tuple<long, Stream>>();
  4.         private long length;
  5.         private int BytesPerElement;
  6.         private int EveryNth;
  7.  
  8.         public AggregatedStreamAdvanced(IEnumerable<Stream> streams, int bytesPerElement, int everyNth)
  9.         {
  10.             foreach (var s in streams)
  11.             {
  12.                 var t = Tuple.Create(s.Length, s);
  13.                 this.length += s.Length;
  14.                 this.cache.Add(t);
  15.             }
  16.            
  17.             this.length = (long) Math.Floor((double)(length / bytesPerElement) / everyNth) * bytesPerElement;
  18.  
  19.             BytesPerElement = bytesPerElement;
  20.             EveryNth = everyNth;
  21.         }
  22.  
  23.         public override bool CanRead
  24.         {
  25.             get { return true; }
  26.         }
  27.  
  28.         public override bool CanSeek
  29.         {
  30.             get { return true; }
  31.         }
  32.  
  33.         public override bool CanWrite
  34.         {
  35.             get { return false; }
  36.         }
  37.  
  38.         public override void Flush()
  39.         {
  40.             throw new NotSupportedException();
  41.         }
  42.  
  43.         public override long Length
  44.         {
  45.             get { return this.length; }
  46.         }
  47.  
  48.         public override long Position
  49.         {
  50.             get;
  51.             set;
  52.         }
  53.  
  54.         public override int Read(byte[] buffer, int offset, int count)
  55.         {
  56.             long streamOffset = 0;
  57.             var totalBytesRead = 0;
  58.             foreach (var tuple in this.cache)
  59.             {
  60.                 var streamLength = tuple.Item1;
  61.                 var stream = tuple.Item2;
  62.  
  63.                 if ((streamOffset <= (Position * EveryNth)) && ((Position * EveryNth) < streamOffset + streamLength))
  64.                 {
  65.                     stream.Position = (Position * EveryNth) - streamOffset;
  66.                     var bytesToRead = count - totalBytesRead;
  67.                    
  68.                     while (bytesToRead > 0)
  69.                     {
  70.                         if (Position >= length) break;
  71.  
  72.                         while (Math.Floor((double)stream.Position / (double)BytesPerElement) % EveryNth != 0) stream.Position++;
  73.                        
  74.                         var bytesRead = stream.Read(buffer, offset + totalBytesRead, Math.Min(BytesPerElement, bytesToRead));
  75.                         if (bytesRead == 0) break;
  76.                         Position += bytesRead;
  77.                         bytesToRead -= bytesRead;
  78.                         totalBytesRead += bytesRead;
  79.                        
  80.                     }
  81.                 }
  82.                 streamOffset += streamLength;
  83.             }
  84.             return totalBytesRead;
  85.         }
  86.  
  87.         public override long Seek(long offset, SeekOrigin origin)
  88.         {
  89.             switch (origin)
  90.             {
  91.                 case SeekOrigin.Begin:
  92.                     Position = offset;
  93.                     break;
  94.                 case SeekOrigin.Current:
  95.                     Position += offset;
  96.                     break;
  97.                 case SeekOrigin.End:
  98.                     Position = Length - offset;
  99.                     break;
  100.                 default:
  101.                     throw new NotImplementedException();
  102.             }
  103.             return Position;
  104.         }
  105.  
  106.         public override void SetLength(long value)
  107.         {
  108.             throw new NotSupportedException();
  109.         }
  110.  
  111.         public override void Write(byte[] buffer, int offset, int count)
  112.         {
  113.             throw new NotSupportedException();
  114.         }
  115.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement