[System.IO.Compression] Fixed stream length/position getters for ZIP entries.
authorJoão Matos <joao@tritao.eu>
Tue, 21 Jun 2016 22:59:03 +0000 (23:59 +0100)
committerJoão Matos <joao@tritao.eu>
Tue, 21 Jun 2016 23:51:20 +0000 (00:51 +0100)
Partial fix for https://bugzilla.xamarin.com/show_bug.cgi?id=39282.

Partial fix for https://github.com/OfficeDev/Open-XML-SDK/issues/64.

mcs/class/System.IO.Compression/SharpCompress/IO/ReadOnlySubStream.cs
mcs/class/System.IO.Compression/Test/System.IO.Compression/ZipTest.cs

index 1393dd6c70c4fc9c8ae9b2bf9fa8e0cf6647d11d..05c89d3719423914db872f1aba03314a22e883c7 100644 (file)
@@ -16,6 +16,7 @@ namespace SharpCompress.IO
             {
                 stream.Position = origin.Value;
             }
+            length = bytesToRead;
             BytesLeftToRead = bytesToRead;
         }
 
@@ -27,6 +28,8 @@ namespace SharpCompress.IO
             }
         }
 
+        private long length;
+
         private long BytesLeftToRead { get; set; }
 
         public Stream Stream { get; private set; }
@@ -53,12 +56,12 @@ namespace SharpCompress.IO
 
         public override long Length
         {
-            get { throw new System.NotImplementedException(); }
+            get { return length; }
         }
 
         public override long Position
         {
-            get { throw new System.NotImplementedException(); }
+            get { return Length - BytesLeftToRead; }
             set { throw new System.NotImplementedException(); }
         }
 
index 4205a1f40a0b4900be8adf5bfb1127136bfa0961..fb335fcbeaa2f3333a6c1484dbefce186322ffc5 100644 (file)
@@ -275,6 +275,21 @@ namespace MonoTests.System.IO.Compression
                        }
                }
 
+               [Test]
+               public void ZipGetArchiveEntryStreamLengthPositionReadMode()
+               {
+                       using (var archive = new ZipArchive(File.Open("test.nupkg", FileMode.Open),
+                               ZipArchiveMode.Read))
+                       {
+                               var entry = archive.GetEntry("_rels/.rels");
+                               using (var stream = entry.Open())
+                               {
+                                       Assert.AreEqual(0, stream.Position);
+                                       Assert.AreEqual(425, stream.Length);
+                               }
+                       }
+               }
+
                [Test]
                public void ZipEnumerateEntriesReadMode()
                {