Exemple #1
0
        public override void Save()
        {
            Mode = AccessMode.Write;
            try {
                ByteVector data = new ByteVector();

                if (id32_tag != null)
                {
                    ByteVector tag_data = id32_tag.Render();
                    if (tag_data.Count > 10)
                    {
                        if (tag_data.Count % 2 == 1)
                        {
                            tag_data.Add(0);
                        }
                        data.Add("ID32");
                        data.Add(ByteVector.FromUInt(
                                     (uint)tag_data.Count,
                                     false));
                        data.Add(tag_data);
                    }
                }

                if (info_tag != null)
                {
                    data.Add(info_tag.RenderEnclosed());
                }

                if (mid_tag != null)
                {
                    data.Add(mid_tag.RenderEnclosed());
                }

                if (divx_tag != null && !divx_tag.IsEmpty)
                {
                    ByteVector tag_data = divx_tag.Render();
                    data.Add("IDVX");
                    data.Add(ByteVector.FromUInt(
                                 (uint)tag_data.Count, false));
                    data.Add(tag_data);
                }

                uint riff_size;
                long tag_start, tag_end;
                Read(false, ReadStyle.None, out riff_size,
                     out tag_start, out tag_end);

                if (tag_start < 12 || tag_end < tag_start)
                {
                    tag_start = tag_end = Length;
                }

                int length       = (int)(tag_end - tag_start);
                int padding_size = length - data.Count - 8;
                if (padding_size < 0)
                {
                    padding_size = 1024;
                }

                data.Add("JUNK");
                data.Add(ByteVector.FromUInt(
                             (uint)padding_size, false));
                data.Add(new ByteVector(padding_size));

                Insert(data, tag_start, length);

                if (data.Count - length != 0 &&
                    tag_start <= riff_size)
                {
                    Insert(ByteVector.FromUInt((uint)
                                               (riff_size + data.Count - length),
                                               false), 4, 4);
                }

                TagTypesOnDisk = TagTypes;
            } finally {
                Mode = AccessMode.Closed;
            }
        }