public static Manifest Read(BinaryReader reader, long headerOffset) { // Read the bundle header reader.BaseStream.Position = headerOffset; uint majorVersion = reader.ReadUInt32(); uint minorVersion = reader.ReadUInt32(); int fileCount = reader.ReadInt32(); string bundleID = reader.ReadString(); bool isCompatible = (majorVersion < MajorVersion) || (majorVersion == MajorVersion && minorVersion <= MinorVersion); if (!isCompatible) { throw new BundleException("Extraction failed: Invalid Version"); } // Read the manifest entries Manifest manifest = new Manifest(bundleID); for (long i = 0; i < fileCount; i++) { manifest.Files.Add(FileEntry.Read(reader)); } if (manifest.Files.GroupBy(file => file.RelativePath).Where(g => g.Count() > 1).Any()) { throw new BundleException("Extraction failed: Found multiple entries with the same bundle-relative-path"); } return(manifest); }
public static Manifest Read(BinaryReader reader) { // Read the manifest footer // signatureSize is one byte longer, for the length encoding. long signatureSize = Signature.Length + 1; reader.BaseStream.Position = reader.BaseStream.Length - signatureSize; string signature = reader.ReadString(); if (!signature.Equals(Signature)) { throw new BundleException("Extraction failed: Invalid Bundle"); } // The manifest header offset resides just behind the signature. reader.BaseStream.Position = reader.BaseStream.Length - signatureSize - sizeof(long); long headerOffset = reader.ReadInt64(); // Read the manifest header reader.BaseStream.Position = headerOffset; uint majorVersion = reader.ReadUInt32(); uint minorVersion = reader.ReadUInt32(); int fileCount = reader.ReadInt32(); string bundleID = reader.ReadString(); // Bundle ID if (majorVersion != MajorVersion || minorVersion != MinorVersion) { throw new BundleException("Extraction failed: Invalid Version"); } // Read the manifest entries Manifest manifest = new Manifest(bundleID); for (long i = 0; i < fileCount; i++) { manifest.Files.Add(FileEntry.Read(reader)); } if (manifest.Files.GroupBy(file => file.RelativePath).Where(g => g.Count() > 1).Any()) { throw new BundleException("Extraction failed: Found multiple entries with the same bundle-relative-path"); } return(manifest); }
public static Manifest Read(BinaryReader reader) { Manifest manifest = new Manifest(); // Read the manifest footer // signatureSize is one byte longer, for the length encoding. long signatureSize = Signature.Length + 1; reader.BaseStream.Position = reader.BaseStream.Length - signatureSize; string signature = reader.ReadString(); if (!signature.Equals(Signature)) { throw new BundleException("Invalid Bundle"); } // The manifest header offset resides just behind the signature. reader.BaseStream.Position = reader.BaseStream.Length - signatureSize - sizeof(long); long headerOffset = reader.ReadInt64(); // Read the manifest header reader.BaseStream.Position = headerOffset; uint majorVersion = reader.ReadUInt32(); uint minorVersion = reader.ReadUInt32(); int fileCount = reader.ReadInt32(); manifest.BundleID = reader.ReadString(); // Bundle ID if (majorVersion != MajorVersion || minorVersion != MinorVersion) { throw new BundleException("Extraction failed: Invalid Version"); } // Read the manifest entries for (long i = 0; i < fileCount; i++) { manifest.Files.Add(FileEntry.Read(reader)); } return(manifest); }