Пример #1
0
        /// <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)}");
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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();
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }