private static List <Entry> LoadPackage(string dataFile, AsyncLoadPackageCallback cb) { using (var fs = File.OpenRead(dataFile)) { var contents = new List <Entry>(1024); var readBuffer = new byte[CHUNK_SIZE]; byte[] compressionBuffer = null; bool isCompressed = false; // Read the header of the package int packageHeader = fs.ReadInt32BE(); int packageLength = readBuffer.Length - 4; if ((packageHeader & COMPRESSION_FLAG) != 0) { packageHeader &= ~COMPRESSION_FLAG; isCompressed = true; compressionBuffer = new byte[COMP_BUFFER_SIZE]; } if (packageHeader != PACKAGE_VERSION_CODE_TRANSISTOR_PYRE && packageHeader != PACKAGE_VERSION_CODE_HADES) { throw new PackageReadException(string.Format(ERR_PACKAGE_VERSION, packageHeader, dataFile)); } LZF decompressor = new LZF(); // Read all chunks in the file ReadStatus readStatus; do { float from = fs.Position / (float)fs.Length; int chunkSize; if (isCompressed && fs.ReadByte() != 0) { int num2 = fs.ReadInt32BE(); fs.Read(compressionBuffer, 0, num2); chunkSize = decompressor.Decompress(compressionBuffer, num2, readBuffer, readBuffer.Length); } else { chunkSize = fs.Read(readBuffer, 0, packageLength); } float to = fs.Position / (float)fs.Length; packageLength = readBuffer.Length; var chunk = new MemoryStream(readBuffer, 0, chunkSize, false); do { var e = ReadPackageEntry(chunk, out readStatus); if (e != null) { contents.Add(e); } cb(from + (to - from) * (chunk.Position / (float)chunk.Length)); } while (readStatus != ReadStatus.EndOfChunk && readStatus != ReadStatus.EndOfFile); } while (readStatus == ReadStatus.EndOfChunk); return(contents); } }
private static byte[] MakeChunksIntoPackage(List <byte[]> chunks, bool compressed) { AssertOnChunks(chunks); using (MemoryStream ms = new MemoryStream(chunks.Count * CHUNK_SIZE)) { int headerCode = PACKAGE_VERSION_CODE_TRANSISTOR_PYRE; if (compressed) { headerCode |= COMPRESSION_FLAG; } ms.WriteInt32BE(headerCode); if (compressed) { var compressionBuffer = new byte[COMP_BUFFER_SIZE]; var compressor = new LZF(); foreach (var chunk in chunks) { int compressedSize = compressor.Compress(chunk, chunk.Length, compressionBuffer, compressionBuffer.Length); if (compressedSize != 0) { ms.WriteByte(1); // Compressed. ms.WriteInt32BE(compressedSize); ms.Write(compressionBuffer, 0, compressedSize); } else { ms.WriteByte(0); // Not compressed. ms.Write(chunk, 0, chunk.Length); } } } else { foreach (var chunk in chunks) { ms.Write(chunk, 0, chunk.Length); } } return(ms.ToArray()); } }