Merge pull request #463 from strawd/concurrent-requests
[mono.git] / mcs / class / System.IO.Compression / SharpCompress / Common / Zip / SeekableZipFilePart.cs
1 using System.IO;
2 using SharpCompress.Common.Zip.Headers;
3
4 namespace SharpCompress.Common.Zip
5 {
6     internal class SeekableZipFilePart : ZipFilePart
7     {
8         private bool isLocalHeaderLoaded;
9         private readonly SeekableZipHeaderFactory headerFactory;
10
11         internal SeekableZipFilePart(SeekableZipHeaderFactory headerFactory, DirectoryEntryHeader header, Stream stream)
12             : base(header, stream)
13         {
14             this.headerFactory = headerFactory;
15         }
16
17         internal override Stream GetCompressedStream()
18         {
19             if (!isLocalHeaderLoaded)
20             {
21                 LoadLocalHeader();
22                 isLocalHeaderLoaded = true;
23             }
24             return base.GetCompressedStream();
25         }
26
27         internal string Comment
28         {
29             get { return (Header as DirectoryEntryHeader).Comment; }
30         }
31
32         private void LoadLocalHeader()
33         {
34             bool hasData = Header.HasData;
35             Header = headerFactory.GetLocalHeader(BaseStream, Header as DirectoryEntryHeader);
36             Header.HasData = hasData;
37         }
38
39         protected override Stream CreateBaseStream()
40         {
41             BaseStream.Position = Header.DataStartPosition.Value;
42             return BaseStream;
43         }
44     }
45 }