|
1 | 1 | using System; |
2 | 2 | using System.IO; |
| 3 | +using System.IO.Compression; |
3 | 4 | using Yura.Shared.IO; |
4 | 5 |
|
5 | 6 | namespace Yura.Shared.Archive |
@@ -54,24 +55,44 @@ public override byte[] Read(ArchiveRecord record) |
54 | 55 | { |
55 | 56 | var file = record as Record; |
56 | 57 |
|
57 | | - // Calculate the location of the file |
58 | | - var offset = (long)file.Offset << 11; |
59 | | - var part = offset / Options.Alignment; |
| 58 | + // Convert sectors to file position |
| 59 | + var position = (long)file.Offset << 11; |
60 | 60 |
|
61 | | - var path = GetFilePart((int)part); |
| 61 | + var (path, offset) = GetFileAndOffset(position); |
62 | 62 |
|
63 | 63 | // Read the file |
64 | 64 | var stream = File.OpenRead(path); |
65 | 65 | var data = new byte[file.Size]; |
66 | 66 |
|
67 | | - stream.Position = offset % Options.Alignment; |
68 | | - stream.ReadExactly(data); |
| 67 | + if (file.CompressedSize == 0) |
| 68 | + { |
| 69 | + stream.Position = offset; |
| 70 | + stream.ReadExactly(data); |
| 71 | + } |
| 72 | + else |
| 73 | + { |
| 74 | + ReadCompressed(stream, offset, file.CompressedSize, data); |
| 75 | + } |
69 | 76 |
|
70 | 77 | stream.Close(); |
71 | 78 |
|
72 | 79 | return data; |
73 | 80 | } |
74 | 81 |
|
| 82 | + private static void ReadCompressed(Stream stream, long offset, uint size, Span<byte> buffer) |
| 83 | + { |
| 84 | + // Read the compressed data |
| 85 | + var data = new byte[size]; |
| 86 | + |
| 87 | + stream.Position = offset; |
| 88 | + stream.ReadExactly(data); |
| 89 | + |
| 90 | + // Decompress the data |
| 91 | + var zlib = new ZLibStream(new MemoryStream(data), CompressionMode.Decompress); |
| 92 | + |
| 93 | + zlib.ReadExactly(buffer); |
| 94 | + } |
| 95 | + |
75 | 96 | private class Record : ArchiveRecord |
76 | 97 | { |
77 | 98 | public uint Offset { get; set; } |
|
0 commit comments