/// <summary> /// Read the specified aStream and aLocation. /// </summary> /// <returns>The read.</returns> /// <param name="aStream">A stream.</param> /// <param name="aLocation">A location.</param> public static SymbolTableEntry Read( Hdf5Reader aReader) { Offset fLinkNameOffset = aReader.ReadOffset(); Offset fObjectHeaderAddress = aReader.ReadOffset(); CacheType fCacheType = (CacheType)aReader.ReadUInt32(); aReader.ReadUInt32(); // Reserved Word switch (fCacheType) { case CacheType.NoCache: return(new SymbolTableEntry( fLinkNameOffset, fObjectHeaderAddress)); case CacheType.Cache: return(new SymbolTableEntry( fLinkNameOffset, fObjectHeaderAddress, aReader.ReadOffset(), aReader.ReadOffset())); case CacheType.SymbolicLink: return(new SymbolTableEntry( fLinkNameOffset, fObjectHeaderAddress, aReader.ReadUInt32())); default: throw new InvalidDataException($"Unknown {nameof(CacheType)}"); } }
internal static Message Read( Hdf5Reader aReader, long?aLocalMessageSize, out long aBytes) { //Read Message Headder data int fReadBytes = 4; //Always Read at least 4 byte fVersion = (byte)aReader.ReadByte(), fFlags = (byte)aReader.ReadByte(); aReader.ReadUInt16(); //Reserved if (fVersion != mcCurrentVersion) { throw new Exceptions.UnknownMessageVersion <LinkInfo>(fVersion); } bool fCreationOrderTracked = ((Flags)fFlags).HasFlag(Flags.CreationOrderTracked), fCreationOrderIndexed = ((Flags)fFlags).HasFlag(Flags.CreationOrderIndexed); //Calculate Length if (fCreationOrderTracked) { fReadBytes += 8; } fReadBytes += 2 * (int)aReader.SizeOfOffset; //Fractal Heap address, B-Tree adress if (fCreationOrderIndexed) { fReadBytes += (int)aReader.SizeOfOffset; } aBytes = fReadBytes; if (aLocalMessageSize.HasValue && fReadBytes > aLocalMessageSize.Value) { throw new ArgumentException("Specified Local Message Size not long enough"); } //Read Feilds and build the object LinkInfo fToReturn = new LinkInfo( fCreationOrderTracked ? aReader.ReadUInt64() : (ulong?)null, aReader.ReadOffset(), aReader.ReadOffset(), fCreationOrderIndexed, fCreationOrderIndexed ? aReader.ReadOffset() : (Offset)null); return(fToReturn); }
public Node(Hdf5Reader aReader, Offset aLocation) : base( BTreeVerson.One, aLocation ?? aReader.Position) { aReader.VerifySignature(Signature); byte fType = (byte)aReader.ReadByte(); if (fType > (byte)NodeType.Data) { throw new InvalidDataException($"Unexpected Node Type: {fType}"); } this.NodeType = (NodeType)fType; this.NodeLevel = (byte)aReader.ReadByte(); this.EntriesUsed = aReader.ReadUInt16(); this.LeftSibling = aReader.ReadOffset(); this.RightSibling = aReader.ReadOffset(); }
private ISuperBlock ParseV2orV3(SuperBlockObj aContainer, bool aIsV3) { using (Stream fStream = mrStreamProvider.GetReadonlyStream()) { fStream.Seek( (long)(ulong)(aContainer.LocationAddress + FormatSignatureAndVersionInfo.Length), SeekOrigin.Begin); const byte fcHeaderBytes = 3; byte[] fHeadbuffer = new byte[fcHeaderBytes]; if (fcHeaderBytes != fStream.Read(fHeadbuffer, 0, fcHeaderBytes)) { throw new EndOfStreamException("Could not read Superblock"); } aContainer.SizeOfOffsets = fHeadbuffer[0]; aContainer.SizeOfLengths = fHeadbuffer[1]; byte fFlags = fHeadbuffer[2]; if ((fFlags & ~((int)(FileConsistencyFlags.SwmrAccessEngaged | FileConsistencyFlags.WriteAccessOpen))) != 0) { throw new InvalidDataException($"Unexpected {nameof(FileConsistencyFlags)}: 0x{fFlags:X}"); } if (aIsV3) { aContainer.FileConsistencyFlags = (FileConsistencyFlags)fFlags; } int fFieldByteCount = aContainer.SizeOfOffsets * 4 + 4; byte[] fFieldBytes = new byte[fFieldByteCount]; fStream.Read(fFieldBytes, 0, fFieldByteCount); using (MemoryStream fMemoryStream = new MemoryStream(fFieldBytes)) using (Hdf5Reader fReader = new Hdf5Reader(fMemoryStream, aContainer, false)) { Offset fBaseAddress = fReader.ReadOffset(), fSuperBlockExtensionAddress = fReader.ReadOffset(), fEndOfFileAddress = fReader.ReadOffset(), fRootGroupAddress = fReader.ReadOffset(); if (fBaseAddress.IsNull()) { throw new InvalidDataException("No base adddress Specified"); } aContainer.BaseAddress = fBaseAddress; //TODO: Handle SuperVlock Extensions if (fEndOfFileAddress.IsNull()) { throw new InvalidDataException("No End Of file Adddress Specified"); } aContainer.EndOfFileAddress = fEndOfFileAddress; if (fRootGroupAddress.IsNull()) { throw new InvalidDataException("No Root Group Specified"); } aContainer.RootGroupAddress = fRootGroupAddress; uint fExpectedCheckSum = Checksums.Lookup3.ComputeHash( mrFormatSignatureAndVersionInfo.AsBytes .Concat(fHeadbuffer) .Concat(fFieldBytes.Take(fFieldByteCount - 4)) .ToArray()); if (fExpectedCheckSum != fReader.ReadUInt32()) { throw new InvalidDataException("Bad Checksum"); } } } return(aContainer); }
private ISuperBlock ParseV0orV1(SuperBlockObj aContainer, bool aIsV1) { using (Stream fStream = mrStreamProvider.GetReadonlyStream()) { fStream.Seek( (long)(ulong)aContainer.LocationAddress + FormatSignatureAndVersionInfo.Length, SeekOrigin.Begin); const byte fcHeaderBytes = 15; byte[] fHeadbuffer = new byte[fcHeaderBytes]; if (fcHeaderBytes != fStream.Read(fHeadbuffer, 0, fcHeaderBytes)) { throw new EndOfStreamException("Could not read Superblock"); } aContainer.FreeSpaceStorageVersion = fHeadbuffer[0]; aContainer.RootGroupSymbolTableVersion = fHeadbuffer[1]; if (fHeadbuffer[2] != 0) { throw new InvalidDataException("Reserved byte expected to be zero"); } aContainer.SharedHeaderMessageFormatVersion = fHeadbuffer[3]; aContainer.SizeOfOffsets = fHeadbuffer[4]; aContainer.SizeOfLengths = fHeadbuffer[5]; if (fHeadbuffer[6] != 0) { throw new InvalidDataException("Reserved byte expected to be zero"); } aContainer.GroupLeafNodeK = (ushort)(fHeadbuffer[7] | (fHeadbuffer[8] << 8)); aContainer.GroupInternalNodeK = (ushort)(fHeadbuffer[9] | (fHeadbuffer[10] << 8)); if (aIsV1) { const int fcV1FeildBytes = 4; byte[] fV1Buffer = new byte[fcV1FeildBytes]; if (fcV1FeildBytes != fStream.Read(fV1Buffer, 0, fcV1FeildBytes)) { throw new EndOfStreamException("Could not read Superblock"); } aContainer.IndexedStorageInternalNodeK = (ushort)(fV1Buffer[0] + (fV1Buffer[1] << 8)); if (!(fV1Buffer[2] == 0 || fV1Buffer[3] == 0)) { throw new InvalidDataException("Reserved bytes expected to be zero"); } } aContainer.BaseAddress = aContainer.LocationAddress; using (Hdf5Reader fReader = new Hdf5Reader(fStream, aContainer, false)) { Offset fBaseAddress = fReader.ReadOffset(), fFreeSpaceAddress = fReader.ReadOffset(), fEndOfFileAddress = fReader.ReadOffset(), fDirverInformationBlockAddress = fReader.ReadOffset(); SymbolTableEntry fRootGroupEntry = SymbolTableEntry.Read(fReader); if (fBaseAddress.IsNull()) { throw new InvalidDataException("No base adddress Specified"); } aContainer.BaseAddress = fBaseAddress; aContainer.FileFreespaceInfoAddress = fFreeSpaceAddress; if (fEndOfFileAddress.IsNull()) { throw new InvalidDataException("No End Of file Adddress Specified"); } aContainer.EndOfFileAddress = fEndOfFileAddress; aContainer.DriverInformationBlockAddress = fDirverInformationBlockAddress; aContainer.RootGroupSymbolTableEntry = fRootGroupEntry; aContainer.RootGroupAddress = fRootGroupEntry.ObjectHeaderAddress; } } return(aContainer); }