Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
 public EntryChangedEventArgs(EPFArchiveEntry entry, EntryChangedEventType eventType)
 {
     Entry     = entry;
     EventType = eventType;
 }
Exemplo n.º 4
0
 private void AddEntry(EPFArchiveEntry entry)
 {
     _entries.Add(entry);
     _entryDictionary.Add(entry.Name, entry);
     RaiseEntryChanged(entry, EntryChangedEventType.Added);
 }
Exemplo n.º 5
0
 internal void RaiseEntryChanged(EPFArchiveEntry entry, EntryChangedEventType eventType)
 {
     OnEntryChanged(new EntryChangedEventArgs(entry, eventType));
 }