Exemple #1
0
        /// <inheritdoc />
        public async Task <LoadResult> LoadFile(IStateInfo stateInfo, IArchiveFileInfo afi, LoadFileContext loadFileContext)
        {
            // If stateInfo is no archive state
            if (!(stateInfo.PluginState is IArchiveState _))
            {
                throw new InvalidOperationException("The state represents no archive.");
            }

            // If file is already loaded
            var absoluteFilePath = UPath.Combine(stateInfo.AbsoluteDirectory, stateInfo.FilePath.ToRelative(), afi.FilePath.ToRelative());

            if (IsLoaded(absoluteFilePath))
            {
                return(new LoadResult(GetLoadedFile(absoluteFilePath)));
            }

            // 1. Create file system action
            var fileSystemAction = new Func <IStreamManager, IFileSystem>(streamManager =>
                                                                          FileSystemFactory.CreateAfiFileSystem(stateInfo, UPath.Root, streamManager));

            // 2. Load file
            // IArchiveFileInfos have stateInfo as their parent, if loaded like this
            var loadResult = await LoadFile(fileSystemAction, afi.FilePath, stateInfo, loadFileContext);

            if (!loadResult.IsSuccessful)
            {
                return(loadResult);
            }

            // 3. Add archive child to parent
            // ArchiveChildren are only added, if a file is loaded like this
            stateInfo.ArchiveChildren.Add(loadResult.LoadedState);

            return(loadResult);
        }
Exemple #2
0
        public void Save(Stream output, IArchiveFileInfo file)
        {
            using var bw = new BinaryWriterX(output);

            // Calculate offsets
            var subHeaderOffset = _header.dataStart;
            var fileOffset      = (subHeaderOffset + SubHeaderSize + 0x7F) & ~0x7F;

            // Write file
            output.Position = fileOffset;

            var writtenSize = (file as ArchiveFileInfo).SaveFileData(output);

            bw.WriteAlignment(0x80);

            // Write sub header
            output.Position = subHeaderOffset;

            _subHeader.size = (int)writtenSize;
            bw.WriteType(_subHeader);

            // Write header
            output.Position = 0;
            _header.size    = (int)output.Length;
            bw.WriteType(_header);
        }
Exemple #3
0
        public IList <IArchiveFileInfo> Load(Stream incStream, Stream datStream, string version)
        {
            using var incBr = new BinaryReaderX(incStream);

            var entryCount = (int)(incStream.Length / FileEntrySize);
            var entries    = incBr.ReadMultiple <AAPackFileEntry>(entryCount);

            var nameMapping = AAPackSupport.GetMapping(version);

            var result = new IArchiveFileInfo[entryCount];

            for (var i = 0; i < entryCount; i++)
            {
                var subStream = new SubStream(datStream, entries[i].offset, entries[i].compSize);

                var compressionMethod = NintendoCompressor.PeekCompressionMethod(subStream);

                var fileName = $"{i:00000000}.bin";
                if (nameMapping.ContainsKey(entries[i].hash))
                {
                    fileName = nameMapping[entries[i].hash];
                }

                result[i] = new AAPackArchiveFileInfo(subStream, fileName,
                                                      NintendoCompressor.GetConfiguration(compressionMethod), entries[i].uncompSize, entries[i]);
            }

            return(result);
        }
Exemple #4
0
        public void Save(Stream output, IArchiveFileInfo file)
        {
            using var bw = new BinaryWriterX(output);

            // Calculate offsets
            var sizeOffset = HeaderSize;
            var blockCount = file.ContentChanged ? (int)Math.Ceiling(file.FileSize / (float)_header.decompBlockSize) : _blockSizes.Count;
            var dataOffset = (sizeOffset + blockCount * 4 + 0x7F) & ~0x7F;

            // Chunk stream into blocks
            output.Position = dataOffset;
            var blockSizes = _blockSizes;

            if (file.ContentChanged)
            {
                blockSizes         = GzStream.ChunkStream(file.GetFileData().Result, output, _header.decompBlockSize, 0x80);
                _header.decompSize = (int)file.FileSize;
            }
            else
            {
                _origStream.Position = 0;
                _origStream.CopyTo(output);
            }

            // Write header
            _header.blockCount = blockSizes.Count;

            output.Position = 0;
            bw.WriteType(_header);

            // Write block sizes
            bw.WriteMultiple(blockSizes);
        }
Exemple #5
0
        public Task <bool> Close(IArchiveFileInfo file)
        {
            return(_mainForm.CloseFile(_stateInfo, file));
            //if (_mainFormControl != null && _mainFormControl.InvokeRequired)
            //    return (Task<bool>)_mainFormControl.Invoke(new Func<IStateInfo, IArchiveFileInfo, Task<bool>>((s1, a1) => _mainForm.CloseFile(s1, a1)), _stateInfo, file);

            //return _mainForm.CloseFile(_stateInfo, file);
        }
Exemple #6
0
        public Task <bool> Open(IArchiveFileInfo file, Guid pluginId)
        {
            return(_mainForm.OpenFile(_stateInfo, file, pluginId));
            //if (_mainFormControl != null && _mainFormControl.InvokeRequired)
            //    return (Task<bool>)_mainFormControl.Invoke(new Func<IStateInfo, IArchiveFileInfo, Guid, Task<bool>>((s1, a1, g1) => _mainForm.OpenFile(s1, a1, g1)), _stateInfo, file, pluginId);

            //return _mainForm.OpenFile(_stateInfo, file, pluginId);
        }
Exemple #7
0
        public void ReplaceFile(IArchiveFileInfo afi, Stream fileData)
        {
            using var br = new BinaryReaderX(fileData, true);
            if (br.ReadString(5) != "NXTCH")
            {
                throw new InvalidOperationException("File needs to be a valid NXTCH.");
            }

            afi.SetFileData(fileData);
        }
Exemple #8
0
        public void Save(Stream output, IArchiveFileInfo file)
        {
            var ms = new MemoryStream();

            using var bw       = new BinaryWriterX(ms);
            using var outputBw = new BinaryWriterX(output);

            // Calculate offsets
            var outerDataOffset = HeaderSize;
            var innerDataOffset = (SubHeaderSize + 0x7F) & ~0x7F;

            // Write file data
            ms.Position = innerDataOffset;
            (file as ArchiveFileInfo).SaveFileData(ms);

            // Write sub header
            var subHeader = new DatSubHeader
            {
                dataOffset = innerDataOffset,
                dataSize   = (int)file.FileSize,
                fileCount  = 1
            };

            ms.Position = 0;
            bw.WriteType(subHeader);

            // Compress file
            ms.Position     = 0;
            output.Position = outerDataOffset;
            Compressions.IrLz.Build().Compress(ms, output);

            // Write header
            var header = new DatHeader
            {
                dataOffset = outerDataOffset,
                decompSize = (int)ms.Length,
                fileSize   = (int)output.Length
            };

            output.Position = 0;
            outputBw.WriteType(header);
        }
Exemple #9
0
        private bool IsFileLocked(IArchiveFileInfo afi, bool lockOnLoaded)
        {
            var absolutePath = _stateInfo.AbsoluteDirectory / _stateInfo.FilePath.ToRelative() / afi.FilePath.ToRelative();

            var isLoaded = _pluginManager.IsLoaded(absolutePath);

            if (!isLoaded)
            {
                return(false);
            }

            if (lockOnLoaded)
            {
                return(true);
            }

            var openedState = _pluginManager.GetLoadedFile(absolutePath);

            return(openedState.StateChanged);
        }
Exemple #10
0
 public Task <bool> Open(IArchiveFileInfo file)
 {
     return(Open(file, Guid.Empty));
 }
Exemple #11
0
 public void Rename(IArchiveFileInfo afi, UPath path)
 {
     afi.FilePath = path;
 }
Exemple #12
0
 public FileElement(IArchiveFileInfo afi, Color color)
 {
     ArchiveFileInfo = afi;
     Color           = color;
 }
Exemple #13
0
 public void ReplaceFile(IArchiveFileInfo afi, Stream fileData)
 {
     afi.SetFileData(fileData);
 }
Exemple #14
0
 /// <inheritdoc />
 public Task <LoadResult> LoadFile(IStateInfo stateInfo, IArchiveFileInfo afi, LoadFileContext loadFileContext)
 {
     return(_parentPluginManager.LoadFile(stateInfo, afi, loadFileContext));
 }
Exemple #15
0
 public AfiFileEntry(IArchiveFileInfo afi) : base(afi.FilePath, afi.FileSize)
 {
     ArchiveFileInfo = afi;
 }
Exemple #16
0
 public void RemoveFile(IArchiveFileInfo afi)
 {
     Files.Remove(afi);
     _hasDeletedFiles = true;
 }
Exemple #17
0
 /// <inheritdoc />
 public Task <LoadResult> LoadFile(IStateInfo stateInfo, IArchiveFileInfo afi, Guid pluginId)
 {
     return(_parentPluginManager.LoadFile(stateInfo, afi, new LoadFileContext {
         PluginId = pluginId
     }));
 }
Exemple #18
0
 private Task <bool> OpenFile(IArchiveFileInfo afi, Guid pluginId = default)
 {
     return(pluginId == default ? _communicator.Open(afi) : _communicator.Open(afi, pluginId));
 }
Exemple #19
0
 public FileElement(IArchiveFileInfo afi) : this(afi, KnownColors.Black)
 {
 }
Exemple #20
0
 /// <inheritdoc />
 public Task <LoadResult> LoadFile(IStateInfo stateInfo, IArchiveFileInfo afi)
 {
     return(LoadFile(stateInfo, afi, new LoadFileContext()));
 }
 /// <inheritdoc />
 public Task <LoadResult> LoadFile(IFileState fileState, IArchiveFileInfo afi, Guid pluginId)
 {
     return(_parentFileManager.LoadFile(fileState, afi, new LoadFileContext {
         PluginId = pluginId
     }));
 }
 /// <inheritdoc />
 public Task <LoadResult> LoadFile(IFileState fileState, IArchiveFileInfo afi, LoadFileContext loadFileContext)
 {
     return(_parentFileManager.LoadFile(fileState, afi, loadFileContext));
 }
Exemple #23
0
 public void Rename(IArchiveFileInfo file, UPath renamedPath)
 {
     InvokeAction(() => _mainForm.RenameFile(_stateInfo, file, renamedPath));
 }
Exemple #24
0
 public DdtInfoHolder(IArchiveFileInfo fileInfo)
 {
     File  = fileInfo;
     Entry = new DdtEntry();
 }