/// <summary> /// /// </summary> /// <param name="isInflated"></param> /// <returns></returns> public List <V8FileSystemReference> ReadFileSystemReferences(bool isInflated = true) { V8BlockHeader blockHeader = ReadBlockHeader(); Int32 dataSize = blockHeader.DataSize; Int32 capacity = (int)(dataSize / V8FileSystemReference.Size()); byte[] bytes = ReadBytes(blockHeader); List <V8FileSystemReference> references = new List <V8FileSystemReference>(capacity); Int32 bytesReaded = 0; while (dataSize > bytesReaded) { V8FileSystemReference reference = ReadFileSystemReference(bytes, bytesReaded); // Seek to reference block header Seek(reference.RefToHeader, SeekOrigin.Begin); reference.FileHeader = ReadFileHeader(ReadBlockHeader().DataSize); reference.IsInFlated = isInflated; references.Add(reference); bytesReaded += V8FileSystemReference.Size(); } return(references); }
/// <summary> /// Reads /// <see cref="V8Commit.Entities.V8FileSystem.V8FileSystemReference"/> /// from bytes buffer /// </summary> /// <param name="buffer"> /// Bytes buffer, passed by reference, /// that contains the data to read /// </param> /// <param name="offset"> /// Start position to read from bytes buffer /// </param> /// <returns> /// Returns /// <see cref="V8Commit.Entities.V8FileSystem.V8FileSystemReference"/> /// with data /// </returns> /// <permission cref="System.Security.PermissionSet">Everyone /// can access this method. /// </permission> public V8FileSystemReference ReadFileSystemReference(byte[] buffer, Int32 offset) { V8FileSystemReference reference = new V8FileSystemReference(); reference.RefToHeader = BitConverter.ToInt32(buffer, offset); reference.RefToData = BitConverter.ToInt32(buffer, offset + 4); reference.ReservedField = BitConverter.ToInt32(buffer, offset + 8); return(reference); }
/// <summary> /// Writes deflated data bytes from /// <see cref = "V8Commit.Entities.V8FileSystem.V8FileSystemReference"/> /// file to <see cref="System.IO.MemoryStream"/> /// </summary> /// <param name="stream"> /// <see cref="System.IO.MemoryStream"/>, passed by reference, /// in which data bytes will be placed /// </param> /// <param name="file"> /// <see cref="V8Commit.Entities.V8FileSystem.V8FileSystemReference"/>, /// passed by reference, that contains references to file header and /// data to read from <see cref="_reader"/> /// </param> /// <example> This sample shows how to use /// the ReadV8FileRawData method from your plugin /// <code> /// /// using (FileV8Reader v8Reader = new FileV8Reader(Input)) /// { /// var fileSystem = v8Reader.ReadV8FileSystem(); /// foreach (var reference in fileSystem.References) /// { /// using (MemoryStream stream = new MemoryStream()) /// { /// v8Reader.ReadV8FileRawData(stream, file); /// /// // some yours сode /// /// } /// } /// } /// /// </code> /// </example> /// <permission cref="System.Security.PermissionSet">Everyone /// can access this method. /// </permission> public void ReadV8FileRawData(MemoryStream stream, V8FileSystemReference file) { Seek(file.RefToData, SeekOrigin.Begin); using (var tmpStream = new MemoryStream(ReadBytes(ReadBlockHeader()))) { if (file.IsInFlated) { using (var deflateStream = new DeflateStream(tmpStream, CompressionMode.Decompress)) { deflateStream.CopyTo(stream); } } else { tmpStream.CopyTo(stream); } stream.Seek(0, SeekOrigin.Begin); } }