Beispiel #1
0
        public override void Read(Tag tag, Reader reader)
        {
            header.Read(reader);

            tag.DescriptionMap = TagDescriptionMap.Instance[
                Version.VersionByMajorMinor(header.VersionMajor, header.VersionMinor)];

            if (header.size > 1)
            {
                long bytesToRead    = header.size;
                bool invalidPadding = false;

                try
                {
                    while (bytesToRead > 0 &&
                           reader.PeekChar() != 0 &&
                           reader.PeekChar() != -1 &&
                           !invalidPadding)
                    {
                        long pos0 = reader.Position;

                        long numBytesRead = ReadFrame(tag, reader);

                        long pos1 = reader.Position;

                        if (numBytesRead == -1)
                        {
                            // Invalid but known padding (e.g. MP3e)
                            invalidPadding = true;
                        }

                        bytesToRead -= (pos1 - pos0);
                    }

                    if (!invalidPadding && bytesToRead < 0)
                    {
                        throw new Exception(GetType().Name + ": Read failed");
                    }
                }
                catch (VersionInvariant e)
                {
                    throw e;
                }
                catch (InvalidHeaderFlagsException e)
                {
                    reader.HandleException(e);
                }
                catch (InvalidFrameException e)
                {
                    reader.HandleException(e);
                }
                catch (NotSupportedException e)
                {
                    reader.HandleException(e);
                }
            }
        }
Beispiel #2
0
        private static void TestHeaderV2()
        {
            HeaderV2 header = new HeaderV2();

            header.IgnoreUnsupportedFlags = true;

            byte[] data =
            {
                // File identificator
                (byte)'I', (byte)'D', (byte)'3',

                // Version
                3,                 0,

                // Flags
                0xE0,

                // Size
                0,                 0,         0, 0
            };

            using (Reader reader = new Reader(data))
            {
                header.Read(reader);
                header.CheckVersion(Version.v2_3);
            }

            UnitTest.Test(header.HeaderSize == 10);
            UnitTest.Test(header.VersionMajor == 3);
            UnitTest.Test(header.VersionMinor == 0);
            UnitTest.Test(header.IsUnsynchronized);
            UnitTest.Test(header.HasExtendedHeader);
            UnitTest.Test(header.HasExperimentalStage);

            using (Writer writer = new Writer())
            {
                header.Write(writer);
                UnitTest.Test(ArrayUtils.IsEqual(writer.OutData, data));
            }
        }