/// <summary> /// Takes the input stream and does any version specific /// data operations to get the tag manager ready for reading /// </summary> void CalculateVersion() { InputStream.Seek(60); InputStream.State = BlamLib.IO.EndianState.Little; uint group_tag = InputStream.ReadTagUInt(); BlamBuild bb = FromSignature(group_tag); #region Endian handling if (bb == BlamBuild.Halo1) { endianState = BlamLib.IO.EndianState.Big; } else { endianState = BlamLib.IO.EndianState.Little; } if (InputStream != null) { InputStream.State = endianState; } if (OutputStream != null) { OutputStream.State = endianState; } #endregion if (engine == BlamVersion.Unknown) { engine = bb.ToVersion(); ManageSetupTagGroup(); } }
/// <summary> /// Validates the cache's header for proper signatures /// </summary> /// <param name="s">cache stream</param> /// <param name="header_sizes">size of a single header</param> /// <remarks>Assumes the header is at the start of the stream</remarks> /// <returns>The header size entry that matches this cache or -1 if no matches</returns> internal static int ValidateHeader(IO.EndianReader s, params int[] header_sizes) { bool invalid = true; int result = -1; foreach (int header_size in header_sizes) { s.Seek(0); if (s.ReadTagUInt() == MiscGroups.head.ID && s.Length >= header_size) // it HAS to be more than the size of a header... { s.Seek(header_size - sizeof(uint)); if (s.ReadTagUInt() == MiscGroups.foot.ID) { invalid = false; result = header_size; } } if (!invalid) { break; } } if (invalid) { throw new InvalidCacheFileException(s.FileName); } return(result); }
internal static int ValidateHeaderAdjustEndian(IO.EndianReader s, params int[] header_sizes) { bool invalid = true; int result = -1; foreach (int header_size in header_sizes) { if (s.Length < header_size) { continue; // it HAS to be more than the size of a header... } s.Seek(0); uint head = s.ReadTagUInt(); if (head != MiscGroups.head.ID) { if (IO.ByteSwap.SwapUDWord(head) == MiscGroups.head.ID) { s.State = s.State.Invert(); } } s.Seek(header_size - sizeof(uint)); if (s.ReadTagUInt() == MiscGroups.foot.ID) { invalid = false; result = header_size; } if (!invalid) { break; } } if (invalid) { throw new InvalidCacheFileException(s.FileName); } return(result); }