////------------------------------------------------------------------------------------------------------------------------------
        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));
        }
Example #3
0
        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;
        }