Example #1
0
        public APMFile(string name, Stream stream, CASCHandler casc)
        {
            Name = name;

            using (BinaryReader reader = new BinaryReader(stream))
            {
                ulong buildVersion = reader.ReadUInt64();
                uint  buildNumber  = reader.ReadUInt32();
                uint  packageCount = reader.ReadUInt32();
                uint  entryCount   = reader.ReadUInt32();
                uint  unk          = reader.ReadUInt32();

                entries = new APMEntry[entryCount];

                for (int j = 0; j < entryCount; j++)
                {
                    entries[j] = reader.Read <APMEntry>();
                }

                packages     = new APMPackage[packageCount];
                indexes      = new PackageIndex[packageCount];
                records      = new PackageIndexRecord[packageCount][];
                dependencies = new uint[packageCount][];

                for (int j = 0; j < packages.Length; j++)
                {
                    packages[j] = reader.Read <APMPackage>();

                    if (!casc.Encoding.GetEntry(packages[j].indexContentKey, out EncodingEntry pkgIndexEnc))
                    {
                        throw new Exception("pkgIndexEnc missing");
                    }

                    using (Stream pkgIndexStream = casc.OpenFile(pkgIndexEnc.Key))
                        using (BinaryReader pkgIndexReader = new BinaryReader(pkgIndexStream))
                        {
                            indexes[j] = pkgIndexReader.Read <PackageIndex>();

                            pkgIndexStream.Position = indexes[j].recordsOffset;

                            using (GZipStream recordsStream = new GZipStream(pkgIndexStream, CompressionMode.Decompress, true))
                                using (BinaryReader recordsReader = new BinaryReader(recordsStream))
                                {
                                    PackageIndexRecord[] recs = new PackageIndexRecord[indexes[j].numRecords];

                                    for (int k = 0; k < recs.Length; k++)
                                    {
                                        recs[k] = recordsReader.Read <PackageIndexRecord>();
                                    }

                                    records[j] = recs;
                                }

                            pkgIndexStream.Position = indexes[j].depsOffset;

                            uint[] deps = new uint[indexes[j].numDeps];

                            for (int k = 0; k < deps.Length; k++)
                            {
                                deps[k] = pkgIndexReader.ReadUInt32();
                            }

                            dependencies[j] = deps;
                        }
                }
            }
        }
Example #2
0
        public APMFile(string name, Stream stream, CASCHandler casc)
        {
            Name = name;

            using (BinaryReader reader = new BinaryReader(stream))
            {
                ulong buildVersion = reader.ReadUInt64();
                uint buildNumber = reader.ReadUInt32();
                uint packageCount = reader.ReadUInt32();
                uint entryCount = reader.ReadUInt32();
                uint unk = reader.ReadUInt32();

                entries = new APMEntry[entryCount];

                for (int j = 0; j < entryCount; j++)
                {
                    entries[j] = reader.Read<APMEntry>();
                }

                packages = new APMPackage[packageCount];
                indexes = new PackageIndex[packageCount];
                records = new PackageIndexRecord[packageCount][];
                dependencies = new uint[packageCount][];

                for (int j = 0; j < packages.Length; j++)
                {
                    packages[j] = reader.Read<APMPackage>();

                    EncodingEntry pkgIndexEnc;

                    if (!casc.Encoding.GetEntry(packages[j].indexContentKey, out pkgIndexEnc))
                        throw new Exception("pkgIndexEnc missing");

                    using (Stream pkgIndexStream = casc.OpenFile(pkgIndexEnc.Key))
                    using (BinaryReader pkgIndexReader = new BinaryReader(pkgIndexStream))
                    {
                        indexes[j] = pkgIndexReader.Read<PackageIndex>();

                        pkgIndexStream.Position = indexes[j].recordsOffset;

                        using (GZipStream recordsStream = new GZipStream(pkgIndexStream, CompressionMode.Decompress, true))
                        using (BinaryReader recordsReader = new BinaryReader(recordsStream))
                        {
                            PackageIndexRecord[] recs = new PackageIndexRecord[indexes[j].numRecords];

                            for (int k = 0; k < recs.Length; k++)
                                recs[k] = recordsReader.Read<PackageIndexRecord>();

                            records[j] = recs;
                        }

                        pkgIndexStream.Position = indexes[j].depsOffset;

                        uint[] deps = new uint[indexes[j].numDeps];

                        for (int k = 0; k < deps.Length; k++)
                            deps[k] = pkgIndexReader.ReadUInt32();

                        dependencies[j] = deps;
                    }
                }
            }
        }