////------------------------------------------------------------------------------------------------------------------------------ private static void ValidateHeader(ApeHeader header, ApeHeader footer) { #if DEBUG if (header != null && footer != null) { if (header.Version != footer.Version) { throw new System.IO.InvalidDataException( String.Format("The APE header version {0} does not match footer version {1}.", header.Version, footer.Version)); } if (header.Size != footer.Size) throw new System.IO.InvalidDataException(String.Format("The APE header tag has a different size {0} than the footer size {1}", header.Size, footer.Size)); } if ((header != null) && (header.Version >= ApeVersion.Version2)) { //if (!header.IsHeader) // throw new System.IO.InvalidDataException("The APE header tag is claiming to be the footer!"); // This is valid it seems. //if (header.UseHeader) // throw new System.IO.InvalidDataException("The APE header tag is claiming there's a header!"); //if ((footer == null) && header.UseFooter) // throw new System.IO.InvalidDataException("The APE header tag is claiming there's a footer when there isn't!"); //if (!System.Linq.Enumerable.All(header.ReservedBytes, b => b == 0x00)) //{ // throw new System.IO.InvalidDataException( // String.Format( // "The APE header tag's \"reserved\" field contains non-null bytes: {0}", // String.Join(" ", System.Linq.Enumerable.Select(header.ReservedBytes, b => "0x" + b.ToString("X2"))))); //} } if ((footer != null) && (footer.Version >= ApeVersion.Version2)) { //if (footer.IsHeader) // throw new System.IO.InvalidDataException("The APE footer tag is claiming to be the header!"); //if ((header == null) && footer.UseHeader) // throw new System.IO.InvalidDataException("The APE header tag is claiming there's a header when there isn't!"); // This is valid it seems. //if (footer.UseFooter) // throw new System.IO.InvalidDataException("The APE footer tag is claiming there's a footer!"); //if (!System.Linq.Enumerable.All(footer.ReservedBytes, b => b == 0x00)) //{ // throw new System.IO.InvalidDataException( // String.Format( // "The APE footer tag's \"reserved\" field contains non-null bytes: {0}", // String.Join(" ", System.Linq.Enumerable.Select(footer.ReservedBytes, b => "0x" + b.ToString("X2"))))); //} } #else return; #endif }
////------------------------------------------------------------------------------------------------------------------------------ /// <summary> /// Gets a value indicating whether the tag is valid or not. /// </summary> /// <param name="header">The header.</param> /// <returns> /// <c>true</c> if it is valid; otherwise, <c>false</c>. /// </returns> /// <exception cref="System.ArgumentNullException">header</exception> private static bool IsValidTag(ApeHeader header) { if (header == null) throw new ArgumentNullException("header"); // Validity check - only version 2.0+ may have a header. return header.FrameCount <= ApeTag.MaxAllowedFields && (header.Size - ApeTag.FooterSize) <= ApeTag.MaxAllowedSize && ((header.Flags == 0) || (header.Version >= ApeVersion.Version2)); }
private static ApeHeader ReadHeader(StreamBuffer stream, long startHeaderPosition, long endHeaderPosition) { if (stream == null) throw new ArgumentNullException("stream"); stream.Position = startHeaderPosition; while (startHeaderPosition < endHeaderPosition) { int y = 0; while (stream.ReadByte() == TagIdentifierBytes[y++]) { startHeaderPosition++; if (y != TagIdentifierBytes.Length) continue; ApeHeader hdr = new ApeHeader { Position = stream.Position - TagIdentifierBytes.Length, Version = (ApeVersion)(stream.ReadLittleEndianInt32() / 1000), Size = stream.ReadLittleEndianInt32(), FrameCount = stream.ReadLittleEndianInt32(), Flags = stream.ReadLittleEndianInt32(), ReservedBytes = new byte[8] }; stream.Read(hdr.ReservedBytes, 8); if (IsValidTag(hdr)) return hdr; startHeaderPosition -= ApeTag.HeaderSize; stream.Position = startHeaderPosition + 1; break; } startHeaderPosition++; } return null; }