private void ReadEntries() { char[] signature = ArchiveReader.ReadChars(4); if (!signature.SequenceEqual(SIGNATURE)) { throw new InvalidDataException("Missing EPFS signature."); } UInt32 fatOffset = ArchiveReader.ReadUInt32(); byte unknown = ArchiveReader.ReadByte(); UInt16 numberOfFiles = ArchiveReader.ReadUInt16(); long dataPos = ArchiveReader.BaseStream.Position; //Jump to file table at the end of the file if (fatOffset > ArchiveReader.BaseStream.Length) { throw new FormatException("FAT offset is higher than archive file length."); } ArchiveReader.BaseStream.Position = fatOffset; //Read file table entries for (int i = 0; i < numberOfFiles; i++) { EPFArchiveEntry epfArchiveEntry = null; if (_mode == EPFArchiveMode.Update) { epfArchiveEntry = new EPFArchiveEntryForUpdate(this, dataPos); } else if (_mode == EPFArchiveMode.Read) { epfArchiveEntry = new EPFArchiveEntryForRead(this, dataPos); } else { throw new InvalidOperationException("Reading archive entries only possible in Read or Update mode."); } epfArchiveEntry.ReadInfo(ArchiveReader); if (_entryDictionary.ContainsKey(epfArchiveEntry.Name)) { throw new InvalidOperationException($"Entry with name '{epfArchiveEntry.Name}' already exists."); } AddEntry(epfArchiveEntry); dataPos += epfArchiveEntry.CompressedLength; } _hiddenDataPos = dataPos; _hiddenDataLength = (int)(fatOffset - dataPos); HasHiddenData = _hiddenDataLength > 0; }
/// <summary> /// Find entry with given name (case insensitive search) and returns entry object controller /// </summary> /// <param name="entryName"></param> /// <returns></returns> public EPFArchiveEntry FindEntry(string entryName) { if (entryName == null) { throw new ArgumentNullException("entryName"); } if (_mode == EPFArchiveMode.Create) { throw new NotSupportedException("Cannot access entries in Create mode."); } EPFArchiveEntry entry = null; _entryDictionary.TryGetValue(entryName, out entry); return(entry); }
public EntryChangedEventArgs(EPFArchiveEntry entry, EntryChangedEventType eventType) { Entry = entry; EventType = eventType; }
private void AddEntry(EPFArchiveEntry entry) { _entries.Add(entry); _entryDictionary.Add(entry.Name, entry); RaiseEntryChanged(entry, EntryChangedEventType.Added); }
internal void RaiseEntryChanged(EPFArchiveEntry entry, EntryChangedEventType eventType) { OnEntryChanged(new EntryChangedEventArgs(entry, eventType)); }