public ExternalFileListMessage(H5BinaryReader reader, Superblock superblock) : base(reader)
        {
            _superblock = superblock;

            // version
            this.Version = reader.ReadByte();

            // reserved
            reader.ReadBytes(3);

#warning Its value must be at least as large as the value contained in the Used Slots field.
            // allocated slot count
            this.AllocatedSlotCount = reader.ReadUInt16();

            // used slot count
            this.UsedSlotCount = reader.ReadUInt16();

            // heap address
            this.HeapAddress = superblock.ReadOffset(reader);

            // slot definitions
            this.SlotDefinitions = new ExternalFileListSlot[this.UsedSlotCount];

            for (int i = 0; i < this.UsedSlotCount; i++)
            {
                this.SlotDefinitions[i] = new ExternalFileListSlot(reader, superblock);
            }
        }
Пример #2
0
        public GlobalHeapObject(H5BinaryReader reader, Superblock superblock) : base(reader)
        {
            // heap object index
            this.HeapObjectIndex = reader.ReadUInt16();

            if (this.HeapObjectIndex == 0)
            {
                return;
            }

            // reference count
            this.ReferenceCount = reader.ReadUInt16();

            // reserved
            reader.ReadBytes(4);

            // object size
            var objectSize = superblock.ReadLength(reader);

            // object data
            this.ObjectData = reader.ReadBytes((int)objectSize);

            var paddedSize    = (int)(Math.Ceiling(objectSize / 8.0) * 8);
            var remainingSize = paddedSize - (int)objectSize;

            reader.ReadBytes(remainingSize);
        }
Пример #3
0
        public FreeSpaceManagerHeader(H5BinaryReader reader, Superblock superblock) : base(reader)
        {
            // signature
            var signature = reader.ReadBytes(4);

            H5Utils.ValidateSignature(signature, FreeSpaceManagerHeader.Signature);

            // version
            this.Version = reader.ReadByte();

            // client ID
            this.ClientId = (ClientId)reader.ReadByte();

            // total space tracked
            this.TotalSpaceTracked = superblock.ReadLength(reader);

            // total sections count
            this.TotalSectionsCount = superblock.ReadLength(reader);

            // serialized sections count
            this.SerializedSectionsCount = superblock.ReadLength(reader);

            // un-serialized sections count
            this.UnSerializedSectionsCount = superblock.ReadLength(reader);

            // section classes count
            this.SectionClassesCount = reader.ReadUInt16();

            // shrink percent
            this.ShrinkPercent = reader.ReadUInt16();

            // expand percent
            this.ExpandPercent = reader.ReadUInt16();

            // address space size
            this.AddressSpaceSize = reader.ReadUInt16();

            // maximum section size
            this.MaximumSectionSize = superblock.ReadLength(reader);

            // serialized section list address
            this.SerializedSectionListAddress = superblock.ReadOffset(reader);

            // serialized section list used
            this.SerializedSectionListUsed = superblock.ReadLength(reader);

            // serialized section list allocated size
            this.SerializedSectionListAllocatedSize = superblock.ReadLength(reader);

            // checksum
            this.Checksum = reader.ReadUInt32();
        }
Пример #4
0
        public BTreeKValuesMessage(H5BinaryReader reader) : base(reader)
        {
            // version
            this.Version = reader.ReadByte();

            // indexed stroage internal node k
            this.IndexedStorageInternalNodeK = reader.ReadUInt16();

            // group internal node k
            this.GroupInternalNodeK = reader.ReadUInt16();

            // group leaf node k
            this.GroupLeafNodeK = reader.ReadUInt16();
        }
Пример #5
0
        public AttributeInfoMessage(H5BinaryReader reader, Superblock superblock) : base(reader)
        {
            _superblock = superblock;

            // version
            this.Version = reader.ReadByte();

            // flags
            this.Flags = (CreationOrderFlags)reader.ReadByte();

            // maximum creation index
            if (this.Flags.HasFlag(CreationOrderFlags.TrackCreationOrder))
            {
                this.MaximumCreationIndex = reader.ReadUInt16();
            }

            // fractal heap address
            this.FractalHeapAddress = superblock.ReadOffset(reader);

            // b-tree 2 name index address
            this.BTree2NameIndexAddress = superblock.ReadOffset(reader);

            // b-tree 2 creation order index address
            if (this.Flags.HasFlag(CreationOrderFlags.IndexCreationOrder))
            {
                this.BTree2CreationOrderIndexAddress = superblock.ReadOffset(reader);
            }
        }
Пример #6
0
        public BTree1Node(H5BinaryReader reader, Superblock superblock, Func <T> decodeKey)
        {
            _reader     = reader;
            _superblock = superblock;
            _decodeKey  = decodeKey;

            var signature = reader.ReadBytes(4);

            H5Utils.ValidateSignature(signature, BTree1Node <T> .Signature);

            this.NodeType    = (BTree1NodeType)reader.ReadByte();
            this.NodeLevel   = reader.ReadByte();
            this.EntriesUsed = reader.ReadUInt16();

            this.LeftSiblingAddress  = superblock.ReadOffset(reader);
            this.RightSiblingAddress = superblock.ReadOffset(reader);

            this.Keys           = new T[this.EntriesUsed + 1];
            this.ChildAddresses = new ulong[this.EntriesUsed];

            for (int i = 0; i < this.EntriesUsed; i++)
            {
                this.Keys[i]           = decodeKey();
                this.ChildAddresses[i] = superblock.ReadOffset(reader);
            }

            this.Keys[this.EntriesUsed] = decodeKey();
        }
Пример #7
0
        public GroupInfoMessage(H5BinaryReader reader) : base(reader)
        {
            // version
            this.Version = reader.ReadByte();

            // flags
            this.Flags = (GroupInfoMessageFlags)reader.ReadByte();

            // maximum compact value and minimum dense value
            if (this.Flags.HasFlag(GroupInfoMessageFlags.StoreLinkPhaseChangeValues))
            {
                this.MaximumCompactValue = reader.ReadUInt16();
                this.MinimumDenseValue   = reader.ReadUInt16();
            }

            // estimated entry count and estimated entry link name length
            if (this.Flags.HasFlag(GroupInfoMessageFlags.StoreNonDefaultEntryInformation))
            {
                this.EstimatedEntryCount          = reader.ReadUInt16();
                this.EstimatedEntryLinkNameLength = reader.ReadUInt16();
            }
        }
        public FilterDescription(H5BinaryReader reader, byte version) : base(reader)
        {
            // filter identifier
            this.Identifier = (FilterIdentifier)reader.ReadInt16();

            // name length
            this.NameLength = version switch
            {
                1 => reader.ReadUInt16(),
                2 when(ushort) this.Identifier >= 256 => reader.ReadUInt16(),
                2 when(ushort) this.Identifier < 256 => 0,
                _ => throw new NotSupportedException($"Only version 1 or 2 instances of the {nameof(FilterDescription)} type are supported.")
            };

            // flags
            this.Flags = (FilterFlags)reader.ReadUInt16();

            // client data value count
            var clientDataValueCount = reader.ReadUInt16();

            // name
            this.Name = this.NameLength > 0 ? H5Utils.ReadNullTerminatedString(reader, pad: true) : string.Empty;

            // client data
            this.ClientData = new uint[clientDataValueCount];

            for (ushort i = 0; i < clientDataValueCount; i++)
            {
                this.ClientData[i] = reader.ReadUInt32();
            }

            // padding
            if (version == 1 && clientDataValueCount % 2 != 0)
            {
                reader.ReadBytes(4);
            }
        }
        public ExternalLinkInfo(H5BinaryReader reader) : base(reader)
        {
            // value length
            this.ValueLength = reader.ReadUInt16();

            // version and flags
            var data = reader.ReadByte();

            this.Version = (byte)((data & 0xF0) >> 4); // take only upper 4 bits
            this.Flags   = (byte)((data & 0x0F) >> 0); // take only lower 4 bits

            // file name
            this.FilePath = H5Utils.ReadNullTerminatedString(reader, pad: false);

            // full object path
            this.FullObjectPath = H5Utils.ReadNullTerminatedString(reader, pad: false);
        }
        public DriverInfoMessage(H5BinaryReader reader) : base(reader)
        {
            // version
            this.Version = reader.ReadByte();

            // driver id
            this.DriverId = H5Utils.ReadFixedLengthString(reader, 8);

            // driver info size
            this.DriverInfoSize = reader.ReadUInt16();

            // driver info
            this.DriverInfo = this.DriverId switch
            {
                "NCSAmulti" => new MultiDriverInfo(reader),
                "NCSAfami" => new FamilyDriverInfo(reader),
                _ => throw new NotSupportedException($"The driver ID '{this.DriverId}' is not supported.")
            };
        }
Пример #11
0
        public SymbolTableNode(H5BinaryReader reader, Superblock superblock) : base(reader)
        {
            // signature
            var signature = reader.ReadBytes(4);

            H5Utils.ValidateSignature(signature, SymbolTableNode.Signature);

            // version
            this.Version = reader.ReadByte();

            // reserved
            reader.ReadByte();

            // symbol count
            this.SymbolCount = reader.ReadUInt16();

            // group entries
            this.GroupEntries = new List <SymbolTableEntry>();

            for (int i = 0; i < this.SymbolCount; i++)
            {
                this.GroupEntries.Add(new SymbolTableEntry(reader, superblock));
            }
        }
        public FractalHeapHeader(H5BinaryReader reader, Superblock superblock) : base(reader)
        {
            _superblock = superblock;

            // signature
            var signature = reader.ReadBytes(4);

            H5Utils.ValidateSignature(signature, FractalHeapHeader.Signature);

            // version
            this.Version = reader.ReadByte();

            // heap ID length
            this.HeapIdLength = reader.ReadUInt16();

            // I/O filter encoder length
            this.IOFilterEncodedLength = reader.ReadUInt16();

            // flags
            this.Flags = (FractalHeapHeaderFlags)reader.ReadByte();

            /* next group */

            // managed objects maximum size
            this.ManagedObjectsMaximumSize = reader.ReadUInt32();

            // next huge object id
            this.NextHugeObjectId = superblock.ReadLength(reader);

            // huge objects BTree2 address
            this.HugeObjectsBTree2Address = superblock.ReadOffset(reader);

            // managed blocks free space amount
            this.ManagedBlocksFreeSpaceAmount = superblock.ReadLength(reader);

            // managed block free space manager address
            this.ManagedBlockFreeSpaceManagerAddress = superblock.ReadOffset(reader);

            // heap managed space amount
            this.HeapManagedSpaceAmount = superblock.ReadLength(reader);

            // heap allocated managed space amount
            this.HeapAllocatedManagedSpaceAmount = superblock.ReadLength(reader);

            // managed space direct block allocation iterator offset
            this.ManagedSpaceDirectBlockAllocationIteratorOffset = superblock.ReadLength(reader);

            // heap managed objects count
            this.HeapManagedObjectsCount = superblock.ReadLength(reader);

            // heap huge objects size
            this.HeapHugeObjectsSize = superblock.ReadLength(reader);

            // heap huge objects cound
            this.HeapHugeObjectsCount = superblock.ReadLength(reader);

            // heap tiny objects size
            this.HeapTinyObjectsSize = superblock.ReadLength(reader);

            // heap tiny objects count
            this.HeapTinyObjectsCount = superblock.ReadLength(reader);

            /* next group */

            // table width
            this.TableWidth = reader.ReadUInt16();

            // starting block size
            this.StartingBlockSize = superblock.ReadLength(reader);

            // maximum direct block size
            this.MaximumDirectBlockSize = superblock.ReadLength(reader);

            // maximum heap size
            this.MaximumHeapSize = reader.ReadUInt16();

            // root indirect block rows starting number
            this.RootIndirectBlockRowsStartingNumber = reader.ReadUInt16();

            // root block address
            this.RootBlockAddress = superblock.ReadOffset(reader);

            // root indirect block rows count
            this.RootIndirectBlockRowsCount = reader.ReadUInt16();

            /* next group */

            // filtered root direct block size, I/O filter mask and I/O filter info
            if (this.IOFilterEncodedLength > 0)
            {
                this.FilteredRootDirectBlockSize = superblock.ReadLength(reader);
                this.IOFilterMask = reader.ReadUInt32();
                this.IOFilterInfo = new FilterPipelineMessage(reader);
            }

            // checksum
            this.Checksum = reader.ReadUInt32();

            // cache some values
            this.CalculateBlockSizeTables();
            this.CalculateHugeObjectsData();
        }
        public AttributeMessage(H5BinaryReader reader, Superblock superblock) : base(reader)
        {
            //var a = reader.ReadBytes(200);
            // version
            this.Version = reader.ReadByte();

            if (this.Version == 1)
            {
                reader.ReadByte();
            }
            else
            {
                this.Flags = (AttributeMessageFlags)reader.ReadByte();
            }

            // name size
            var nameSize = reader.ReadUInt16();

            // datatype size
            var datatypeSize = reader.ReadUInt16();

            // dataspace size
            var dataspaceSize = reader.ReadUInt16();

            // name character set encoding
            if (this.Version == 3)
            {
                _nameEncoding = (CharacterSetEncoding)reader.ReadByte();
            }

            // name
            if (this.Version == 1)
            {
                this.Name = H5Utils.ReadNullTerminatedString(reader, pad: true, encoding: _nameEncoding);
            }
            else
            {
                this.Name = H5Utils.ReadNullTerminatedString(reader, pad: false, encoding: _nameEncoding);
            }

            // datatype
            this.Datatype = new DatatypeMessage(reader);

            if (this.Version == 1)
            {
                var paddedSize    = (int)(Math.Ceiling(datatypeSize / 8.0) * 8);
                var remainingSize = paddedSize - datatypeSize;
                reader.ReadBytes(remainingSize);
            }

            // dataspace
            this.Dataspace = new DataspaceMessage(reader, superblock);

            if (this.Version == 1)
            {
                var paddedSize    = (int)(Math.Ceiling(dataspaceSize / 8.0) * 8);
                var remainingSize = paddedSize - dataspaceSize;
                this.Reader.Seek(remainingSize, SeekOrigin.Current);
            }

            // data
            var byteSize = H5Utils.CalculateSize(this.Dataspace.DimensionSizes, this.Dataspace.Type) * this.Datatype.Size;

            this.Data = reader.ReadBytes((int)byteSize);
        }
Пример #14
0
        public BTree2Header(H5BinaryReader reader, Superblock superblock, Func <T> decodeKey) : base(reader)
        {
            _superblock = superblock;
            _decodeKey  = decodeKey;

            // signature
            var signature = reader.ReadBytes(4);

            H5Utils.ValidateSignature(signature, BTree2Header <T> .Signature);

            // version
            this.Version = reader.ReadByte();

            // type
            this.Type = (BTree2Type)reader.ReadByte();

            // node size
            this.NodeSize = reader.ReadUInt32();

            // record size
            this.RecordSize = reader.ReadUInt16();

            // depth
            this.Depth = reader.ReadUInt16();

            // split percent
            this.SplitPercent = reader.ReadByte();

            // merge percent
            this.MergePercent = reader.ReadByte();

            // root node address
            this.RootNodePointer = new BTree2NodePointer()
            {
                Address          = superblock.ReadOffset(reader),
                RecordCount      = reader.ReadUInt16(),
                TotalRecordCount = superblock.ReadLength(reader)
            };

            // checksum
            this.Checksum = reader.ReadUInt32();

            // from H5B2hdr.c
            this.NodeInfos = new BTree2NodeInfo[this.Depth + 1];

            /* Initialize leaf node info */
            var fixedSizeOverhead  = 4U + 1U + 1U + 4U; // signature, version, type, checksum
            var maxLeafRecordCount = (this.NodeSize - fixedSizeOverhead) / this.RecordSize;

            this.NodeInfos[0].MaxRecordCount                = maxLeafRecordCount;
            this.NodeInfos[0].SplitRecordCount              = (this.NodeInfos[0].MaxRecordCount * this.SplitPercent) / 100;
            this.NodeInfos[0].MergeRecordCount              = (this.NodeInfos[0].MaxRecordCount * this.MergePercent) / 100;
            this.NodeInfos[0].CumulatedTotalRecordCount     = this.NodeInfos[0].MaxRecordCount;
            this.NodeInfos[0].CumulatedTotalRecordCountSize = 0;

            /* Compute size to store # of records in each node */
            /* (uses leaf # of records because its the largest) */
            this.MaxRecordCountSize = (byte)H5Utils.FindMinByteCount(this.NodeInfos[0].MaxRecordCount);;

            /* Initialize internal node info */
            if (this.Depth > 0)
            {
                for (int i = 1; i < this.Depth + 1; i++)
                {
                    var pointerSize            = (uint)(superblock.OffsetsSize + this.MaxRecordCountSize + this.NodeInfos[i - 1].CumulatedTotalRecordCountSize);
                    var maxInternalRecordCount = (this.NodeSize - (fixedSizeOverhead + pointerSize)) / this.RecordSize + pointerSize;

                    this.NodeInfos[i].MaxRecordCount            = maxInternalRecordCount;
                    this.NodeInfos[i].SplitRecordCount          = (this.NodeInfos[i].MaxRecordCount * this.SplitPercent) / 100;
                    this.NodeInfos[i].MergeRecordCount          = (this.NodeInfos[i].MaxRecordCount * this.MergePercent) / 100;
                    this.NodeInfos[i].CumulatedTotalRecordCount =
                        (this.NodeInfos[i].MaxRecordCount + 1) *
                        this.NodeInfos[i - 1].MaxRecordCount + this.NodeInfos[i].MaxRecordCount;
                    this.NodeInfos[i].CumulatedTotalRecordCountSize = (byte)H5Utils.FindMinByteCount(this.NodeInfos[i].CumulatedTotalRecordCount);
                }
            }
        }