public RootHandler(BinaryReader stream) { while (stream.BaseStream.Position < stream.BaseStream.Length) { int count = stream.ReadInt32(); ContentFlags contentFlags = (ContentFlags)stream.ReadUInt32(); LocaleFlags localeFlags = (LocaleFlags)stream.ReadUInt32(); if (localeFlags == LocaleFlags.None) { throw new Exception("localeFlags == LocaleFlags.None"); } if (contentFlags != ContentFlags.None && (contentFlags & (ContentFlags.F00000008 | ContentFlags.F00000010 | ContentFlags.LowViolence | ContentFlags.NoCompression | ContentFlags.F20000000)) == 0) { throw new Exception("contentFlags != ContentFlags.None"); } RootEntry[] entries = new RootEntry[count]; int[] fileDataIDs = new int[count]; int fileDataIndex = 0; for (var i = 0; i < count; ++i) { entries[i].LocaleFlags = localeFlags; entries[i].ContentFlags = contentFlags; fileDataIDs[i] = fileDataIndex + (int)stream.ReadUInt32(); fileDataIndex = fileDataIDs[i] + 1; } for (var i = 0; i < count; ++i) { entries[i].MD5 = stream.Read <MD5Hash>(); ulong hash = stream.ReadUInt64(); RootData.Add(hash, entries[i]); ulong hash2; int fileDataID = fileDataIDs[i]; if (FileDataStore.TryGetValue(fileDataID, out hash2)) { if (hash2 != hash) { Log.Write("CASC: Hash collision for file ID {0}", fileDataID); } continue; } FileDataStore.Add(fileDataID, hash); FileDataStoreReverse.Add(hash, fileDataID); } } }
public RootHandler(BinaryReader stream) { while (stream.BaseStream.Position < stream.BaseStream.Length) { int count = stream.ReadInt32(); ContentFlags contentFlags = (ContentFlags)stream.ReadUInt32(); LocaleFlags localeFlags = (LocaleFlags)stream.ReadUInt32(); if (localeFlags == LocaleFlags.None) throw new Exception("localeFlags == LocaleFlags.None"); if (contentFlags != ContentFlags.None && (contentFlags & (ContentFlags.LowViolence | ContentFlags.NoCompression)) == 0) throw new Exception("contentFlags != ContentFlags.None"); RootEntry[] entries = new RootEntry[count]; int[] fileDataIDs = new int[count]; int fileDataIndex = 0; for (var i = 0; i < count; ++i) { entries[i].LocaleFlags = localeFlags; entries[i].ContentFlags = contentFlags; fileDataIDs[i] = fileDataIndex + (int)stream.ReadUInt32(); fileDataIndex = fileDataIDs[i] + 1; } for (var i = 0; i < count; ++i) { entries[i].MD5 = stream.Read<MD5Hash>(); ulong hash = stream.ReadUInt64(); RootData.Add(hash, entries[i]); ulong hash2; int fileDataID = fileDataIDs[i]; if (FileDataStore.TryGetValue(fileDataID, out hash2) && hash2 != hash) Log.Write("CASC: Hash collision for file ID {0}", fileDataID); FileDataStore.Add(fileDataID, hash); FileDataStoreReverse.Add(hash, fileDataID); } } }