Exemple #1
0
        /// <inheritdoc />
        public async Task <LoadResult> LoadFile(IStateInfo stateInfo, ArchiveFileInfo afi, Guid pluginId, LoadFileContext loadFileContext)
        {
            // If stateInfo is no archive state
            if (!(stateInfo.PluginState is IArchiveState archiveState))
            {
                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
            // ArchiveFileInfos have stateInfo as their parent, if loaded like this
            var loadResult = await LoadFile(fileSystemAction, afi.FilePath, stateInfo, pluginId, 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 ArchiveContext(ContextNode contextNode, IContext parentContext, IInternalPluginManager pluginManager) : base(pluginManager, contextNode)
        {
            ContractAssertions.IsNotNull(contextNode, nameof(contextNode));
            ContractAssertions.IsNotNull(parentContext, nameof(parentContext));

            _stateInfo         = contextNode.StateInfo;
            _archiveState      = _stateInfo.PluginState as IArchiveState;
            _archiveFileSystem = FileSystemFactory.CreateAfiFileSystem(_stateInfo);
            _parentContext     = parentContext;
        }
        public async Task <IList <AnmcNamedImageRessource> > Load(string file)
        {
            if (_archiveStateInfo != null)
            {
                Close();
            }

            // Load archive
            _archiveStateInfo = await LoadArchive(file);

            // Load images
            var archiveFileSystem = FileSystemFactory.CreateAfiFileSystem(ArchiveState, UPath.Root, _archiveStateInfo.StreamManager);

            _imageStateInfos = await LoadImages(archiveFileSystem);

            // Load point mappings
            var mappings = await LoadPvb(archiveFileSystem);

            _pointMappings = await LoadPbis(archiveFileSystem, mappings);

            // Load RES.bin
            var nameIndices = await LoadResBin(archiveFileSystem);

            // Create image providers
            var imageStates    = _imageStateInfos.Select(x => x.State as IImageState).ToArray();
            var imageProviders = new ImageProvider[_imageStateInfos.Count];

            for (var i = 0; i < imageProviders.Length; i++)
            {
                imageProviders[i] = new ImageProvider(new KanvasImage(imageStates[i], imageStates[i].Images[0]));
            }

            // Create final image ressources
            var result = new List <AnmcNamedImageRessource>();

            for (var i = 0; i < Math.Min(_pointMappings.Count, nameIndices.Count); i++)
            {
                var nameIndex     = nameIndices.First(x => x.Value.pbiIndex == i);
                var imageProvider = imageProviders[nameIndex.Value.imageIndex];

                var partIndex       = 0;
                var imageRessources = new List <AnmcImageRessource>();
                for (var mappingIndex = 0; mappingIndex < _pointMappings[i].Count; mappingIndex += 6)
                {
                    var points         = _pointMappings[i].Skip(mappingIndex).Take(6).ToArray();
                    var imageRessource = new AnmcImageRessource(imageProvider, points, $"{nameIndex.Key} Part {partIndex++}");

                    imageRessources.Add(imageRessource);
                }

                result.Add(new AnmcNamedImageRessource(nameIndex.Key, imageRessources));
            }

            return(result);
        }
Exemple #4
0
        public ArchiveForm(IStateInfo stateInfo, IArchiveFormCommunicator communicator, PluginManager pluginManager, IProgressContext progress)
        {
            InitializeComponent();

            _stateInfo     = stateInfo;
            _communicator  = communicator;
            _pluginManager = pluginManager;
            _progress      = progress;

            _archiveFileSystem = FileSystemFactory.CreateAfiFileSystem(stateInfo);
            _openingFiles      = new List <IArchiveFileInfo>();

            _changedDirectories = new HashSet <UPath>();
            _selectedPath       = UPath.Root;

            _searchTerm              = new SearchTerm(searchTextBox);
            _searchTerm.TextChanged += searchTerm_TextChanged;

            _asyncOperation           = new AsyncOperation();
            _asyncOperation.Started  += asyncOperation_Started;
            _asyncOperation.Finished += asyncOperation_Finished;

            folderView.Expanded            += folderView_Expanded;
            folderView.Collapsed           += folderView_Collapsed;
            folderView.CellFormatting      += folderView_CellFormatting;
            folderView.SelectedItemChanged += folderView_SelectedItemChanged;

            fileView.SelectedItemsChanged += fileView_SelectedItemsChanged;
            fileView.CellDoubleClick      += fileView_CellDoubleClick;
            fileView.CellFormatting       += fileView_CellFormatting;

            searchClearCommand.Executed += searchClearCommand_Executed;
            cancelCommand.Executed      += cancelCommand_Executed;

            saveCommand.Executed   += SaveCommand_Executed;
            saveAsCommand.Executed += SaveAsCommand_Executed;

            openCommand.Executed        += openCommand_Executed;
            extractFileCommand.Executed += extractFileCommand_Executed;
            replaceFileCommand.Executed += replaceFileCommand_Executed;
            renameFileCommand.Executed  += RenameFileCommand_Executed;
            deleteFileCommand.Executed  += DeleteFileCommand_Executed;

            extractDirectoryCommand.Executed += extractDirectoryCommand_Executed;
            replaceDirectoryCommand.Executed += replaceDirectoryCommand_Executed;
            renameDirectoryCommand.Executed  += renameDirectoryCommand_Executed;
            addDirectoryCommand.Executed     += addDirectoryCommand_Executed;
            deleteDirectoryCommand.Executed  += deleteDirectoryCommand_Executed;

            UpdateProperties();
            LoadDirectories();
            UpdateFiles(_selectedPath);
        }
        public void Save(UPath savePath)
        {
            // 1. Create file system for archive
            var archiveFileSystem = FileSystemFactory.CreateAfiFileSystem(ArchiveState, UPath.Root, _archiveStateInfo.StreamManager);

            // 2. Save PVB and PBIs
            var distinctPointMappings = _pointMappings.SelectMany(x => x).Batch(6).Select(x => x.OrderBy(y => y.v).ThenBy(y => y.u)).SelectMany(x => x).Distinct().ToArray();

            SavePvb(archiveFileSystem, distinctPointMappings);
            SavePbis(archiveFileSystem, _pointMappings, distinctPointMappings);

            // 3. Save images
            foreach (var stateInfo in _imageStateInfos)
            {
                _pluginManager.SaveFile(stateInfo);
            }

            // 3. Save original archive
            _pluginManager.SaveFile(_archiveStateInfo, savePath);
        }
Exemple #6
0
        private async void Save(bool saveAs)
        {
            var wasSuccessful = await _communicator.Save(saveAs);

            if (!wasSuccessful)
            {
                return;
            }

            _changedDirectories.Clear();
            _archiveFileSystem = FileSystemFactory.CreateAfiFileSystem(_stateInfo);
            _selectedPath      = UPath.Root;

            await Application.Instance.InvokeAsync(() =>
            {
                LoadDirectories();
                UpdateFiles(UPath.Root);
                UpdateProperties();

                _communicator.Update(true, false);
            });
        }