Example #1
0
        public void ReadWriteStringUtf(string value)
        {
            _writer.WriteUtf(ElementId, value);

            var reader = StartRead();

            Assert.Equal(value, reader.ReadUtf());
        }
Example #2
0
 public void WriteStringBadArg(WriteStrMode mode, string value)
 {
     Assert.Throws <ArgumentNullException>(() => {
         if (mode == WriteStrMode.Ascii)
         {
             _writer.WriteAscii(ElementId, value);
         }
         if (mode == WriteStrMode.Utf)
         {
             _writer.WriteUtf(ElementId, value);
         }
     });
 }
Example #3
0
        public void ReadWriteContainer()
        {
            var innerdata = new MemoryStream();
            var container = new EbmlWriter(innerdata);

            container.WriteUtf(VInt.MakeId(1), "Hello");
            container.Write(VInt.MakeId(2), 12345);
            container.Write(VInt.MakeId(3), 123.45);

            _writer.Write(VInt.MakeId(5), innerdata.ToArray());
            _writer.WriteUtf(VInt.MakeId(6), "end");

            _stream.Position = 0;
            var reader = new EbmlReader(_stream);

            Assert.True(reader.ReadNext());
            Assert.Equal(VInt.MakeId(5), reader.ElementId);

            reader.EnterContainer();

            // reading inner data
            AssertRead(reader, 1, "Hello", r => r.ReadUtf());
            AssertRead(reader, 2, 12345, r => r.ReadInt());
            AssertRead(reader, 3, 123.45, r => r.ReadFloat());

            reader.LeaveContainer();

            // back to main stream
            AssertRead(reader, 6, "end", r => r.ReadUtf());
        }
Example #4
0
        private void WriteData()
        {
            var reader = new EbmlReader(new MemoryStream(_oldSegmentInfoData), _oldSegmentInfoData.Length);

            // prepare writing part
            var infoStream = new MemoryStream();
            var infoWriter = new EbmlWriter(infoStream);

            var writeMap = new[]
            {
                new { Id = MatroskaDtd.Segment.Info.Title.Identifier, Value = _title },
                new { Id = MatroskaDtd.Segment.Info.WritingApp.Identifier, Value = _writingApp },
            };

            // enter the Segment block
            reader.ReadNext();
            reader.EnterContainer();

            while (reader.ReadNext())
            {
                if (!writeMap.Any(arg => arg.Id == reader.ElementId))
                {
                    // copying data as is
                    var buffer = new byte[reader.ElementSize];
                    reader.ReadBinary(buffer, 0, (int)reader.ElementSize);
                    infoWriter.Write(reader.ElementId, buffer);
                }
            }

            // write title/app in case it was not present!
            foreach (var e in writeMap.Where(arg => !string.IsNullOrEmpty(arg.Value)))
            {
                infoWriter.WriteUtf(e.Id, e.Value);
            }

            var outStream = new MemoryStream(_dataLength);
            var writer    = new EbmlWriter(outStream);

            writer.Write(MatroskaDtd.Segment.Info.Identifier, infoStream.ToArray());
            var extraByteCount = _dataLength - outStream.Position;

            if (extraByteCount != 0)
            {
                var extraHLen = StandardDtd.Void.Identifier.Length + 2;

                var blankDataLen = (int)(extraByteCount - extraHLen);
                if (blankDataLen < 0)
                {
                    throw new InvalidOperationException(string.Format("Not enough space to put the new data, {0} bytes to feet", -blankDataLen));
                }

                writer.WriteElementHeader(StandardDtd.Void.Identifier, VInt.EncodeSize((ulong)blankDataLen, 2));
                writer.Write(new byte[blankDataLen], 0, blankDataLen);
            }

            if (outStream.Length != _dataLength)
            {
                throw new InvalidOperationException("Failed to prepare modified data - block length mismatch");
            }

            _stream.Position = _dataStart;
            _stream.Write(outStream.ToArray(), 0, _dataLength);
        }