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; } } } }
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; } } } }