public static Node FromStreamV2(BinaryReader reader, int index, StringBlock stringBlock, byte[] dataBlock) { reader.BaseStream.Seek(index * 17, SeekOrigin.Begin); var nameOffset = reader.ReadInt32(); var siblingIndex = reader.ReadInt32(); var name = stringBlock.GetString(nameOffset); var type = reader.ReadByte(); if (type == 0) { return(IntermediateNode.IntermediateV2(siblingIndex, name, reader, stringBlock, dataBlock)); } else { return(LeafNode.LeafV2(siblingIndex, name, reader, type, dataBlock)); } }
public IntermediateNode(int peerOffset, string name, BinaryReader reader, StringBlock stringBlock, byte[] dataBlock) : base(peerOffset, name) { if (reader == null) { throw new ArgumentNullException("reader"); } //int zero = reader.ReadInt32(); reader.BaseStream.Seek(sizeof(int), SeekOrigin.Current); children = new List <Node>(); int childOffset = reader.ReadInt32(); if (childOffset > 0) { int next = childOffset; do { if (children.Count > 500000) { throw new Exception("Node overflow. Broken UTF?"); } Node n = Node.FromStream(reader, next, stringBlock, dataBlock); children.Add(n); next = n.PeerOffset; } while (next > 0); } //else //throw new FileContentsException(UtfFile.FILE_TYPE, "IntermediateNode " + Name + " doesn't have any child nodes."); //int allocatedSize = reader.ReadInt32(); //int size = reader.ReadInt32(); //int size2 = reader.ReadInt32(); //int timestamp1 = reader.ReadInt32(); //int timestamp2 = reader.ReadInt32(); //int timestamp3 = reader.ReadInt32(); }
public static Node FromStream(BinaryReader reader, int offset, StringBlock stringBlock, byte[] dataBlock) { if (reader == null) { throw new ArgumentNullException("reader"); } if (stringBlock == null) { throw new ArgumentNullException("stringBlock"); } if (dataBlock == null) { throw new ArgumentNullException("dataBlock"); } reader.BaseStream.Seek(offset, SeekOrigin.Begin); int peerOffset = reader.ReadInt32(); int nameOffset = reader.ReadInt32(); string name = stringBlock.GetString(nameOffset); NodeFlags flags = (NodeFlags)reader.ReadInt32(); if ((flags & NodeFlags.Intermediate) == NodeFlags.Intermediate) { return(new IntermediateNode(peerOffset, name, reader, stringBlock, dataBlock)); } else if ((flags & NodeFlags.Leaf) == NodeFlags.Leaf) { return(new LeafNode(peerOffset, name, reader, dataBlock)); } else { //throw new FileContentException(UtfFile.FILE_TYPE, "Neither required flag set. Flags: " + flags); return(new LeafNode(peerOffset, name, reader, dataBlock)); } }