예제 #1
0
파일: Package.cs 프로젝트: hengtek/Psiga
        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);
            }
        }
예제 #2
0
파일: Package.cs 프로젝트: hengtek/Psiga
        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());
            }
        }