Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }