/// <summary> /// Reads header part 7 from an input stream. /// </summary> /// <param name="stream">The stream to read from.</param> /// <param name="offset">The offset to the header part from the beginning of the stream.</param> /// <param name="numEntries">Number of entries.</param> /// <param name="p">Progress info.</param> /// <returns>The loaded header part.</returns> internal async Task <NefsHeaderPart7> ReadHeaderPart7Async(Stream stream, uint offset, uint numEntries, NefsProgress p) { var entries = new List <NefsHeaderPart7Entry>(); var size = numEntries * NefsHeaderPart7Entry.Size; // Validate inputs if (!this.ValidateHeaderPartStream(stream, offset, (uint)size, "7")) { return(new NefsHeaderPart7(entries)); } // Get entries in part 7 var entryOffset = offset; for (var i = 0; i < numEntries; ++i) { using (p.BeginTask(1.0f / numEntries)) { // Read the entry data var entry = new NefsHeaderPart7Entry(); await FileData.ReadDataAsync(stream, entryOffset, entry, NefsVersion.Version200, p); entryOffset += NefsHeaderPart7Entry.Size; entries.Add(entry); } } return(new NefsHeaderPart7(entries)); }
/// <summary> /// Reads header part 7 from an input stream. /// </summary> /// <param name="stream">The stream to read from.</param> /// <param name="offset">The offset to the header part from the beginning of the stream.</param> /// <param name="size">The size of the header part.</param> /// <param name="p">Progress info.</param> /// <returns>The loaded header part.</returns> internal async Task <NefsHeaderPart7> ReadHeaderPart7Async(Stream stream, uint offset, uint size, NefsProgress p) { var entries = new List <NefsHeaderPart7Entry>(); var ids = new HashSet <NefsItemId>(); // Validate inputs if (!this.ValidateHeaderPartStream(stream, offset, size, "7")) { return(new NefsHeaderPart7(entries)); } // Get entries in part 7 var numEntries = size / NefsHeaderPart7Entry.Size; var entryOffset = offset; for (var i = 0; i < numEntries; ++i) { using (p.BeginTask(1.0f / numEntries)) { var entry = new NefsHeaderPart7Entry(); await FileData.ReadDataAsync(stream, entryOffset, entry, p); // Check for duplicate item ids var id = new NefsItemId(entry.Id.Value); if (ids.Contains(id)) { Log.LogWarning($"Found duplicate item id in part 7: {id.Value}"); } ids.Add(id); entries.Add(entry); entryOffset += NefsHeaderPart7Entry.Size; } } return(new NefsHeaderPart7(entries)); }