/// <inheritdoc/> public bool ReplaceItemByDialog(NefsItem item) { if (item == null) { Log.LogError($"Cannot replace item. Item is null."); return(false); } // Have user pick file (var result, var fileName) = this.UiService.ShowOpenFileDialog(); if (result != DialogResult.OK) { return(false); } // Check file exists if (!this.FileSystem.File.Exists(fileName)) { Log.LogError($"Cannot replace item. Replacement file does not exist: {fileName}."); return(false); } var fileSize = this.FileSystem.FileInfo.FromFileName(fileName).Length; var itemSize = new NefsItemSize((uint)fileSize); var newDataSource = new NefsFileDataSource(fileName, 0, itemSize, false); var cmd = new ReplaceFileCommand(item, item.DataSource, item.State, newDataSource); this.UndoBuffer.Execute(cmd); return(true); }
/// <summary> /// Creates an item for testing. /// </summary> /// <param name="id">The item id.</param> /// <param name="dirId">The directory id.</param> /// <param name="fileName">The item name.</param> /// <param name="dataOffset">Data offset.</param> /// <param name="extractedSize">Extracted size.</param> /// <param name="chunkSizes">Compressed chunks sizes.</param> /// <param name="type">The item type.</param> /// <returns>The new item.</returns> internal static NefsItem CreateItem( uint id, uint dirId, string fileName, UInt64 dataOffset, UInt32 extractedSize, IReadOnlyList <UInt32> chunkSizes, NefsItemType type) { var attributes = new NefsItemAttributes( isDirectory: type == NefsItemType.Directory, v16IsTransformed: true); var transform = TestTransform; var chunks = NefsDataChunk.CreateChunkList(chunkSizes, transform); var size = new NefsItemSize(extractedSize, chunks); var dataSource = new NefsFileDataSource(@"C:\source.txt", dataOffset, size, extractedSize != chunkSizes.LastOrDefault()); return(new NefsItem( Guid.NewGuid(), new NefsItemId(id), fileName, new NefsItemId(dirId), dataSource, transform, attributes)); }
/// <summary> /// Prepares an item's data to be written to the archive. /// </summary> /// <param name="item">The item to prepare.</param> /// <param name="workDir">The temporary working directory.</param> /// <param name="items">The source items list.</param> /// <param name="p">Progress info.</param> private async Task PrepareItemAsync(NefsItem item, string workDir, NefsItemList items, NefsProgress p) { // Deleted items should not be prepared if (item.State == NefsItemState.Removed) { throw new ArgumentException("Trying to prepare a removed item.", nameof(item)); } // Nothing to do for directories if (item.Type == NefsItemType.Directory) { return; } // Only added or replaced files need prepared if (item.State != NefsItemState.Added && item.State != NefsItemState.Replaced) { return; } // Item should have a data source if (item.DataSource == null) { throw new ArgumentException("Item does not have a data source.", nameof(item)); } // Make sure the new file still exists if (!this.FileSystem.File.Exists(item.DataSource.FilePath)) { throw new IOException($"Cannot find source file {item.DataSource.FilePath}."); } // Compress to temp location if needed if (!item.DataSource.IsTransformed) { // Prepare the working directory var filePathInArchive = items.GetItemFilePath(item.Id); var filePathInArchiveHash = HashHelper.HashStringMD5(filePathInArchive); var fileWorkDir = Path.Combine(workDir, filePathInArchiveHash); this.FileSystem.ResetOrCreateDirectory(fileWorkDir); // Transform the file var destFilePath = Path.Combine(workDir, "inject.dat"); var newSize = await this.Transformer.TransformFileAsync(item.DataSource, destFilePath, item.Transform, p); // Update data source to point to the transformed temp file var dataSource = new NefsFileDataSource(destFilePath, 0, newSize, isTransformed: true); item.UpdateDataSource(dataSource, NefsItemState.Replaced); } }
/// <summary> /// Creates an item for testing. /// </summary> /// <param name="id">The item id.</param> /// <param name="dirId">The directory id.</param> /// <param name="fileName">The item name.</param> /// <param name="dataOffset">Data offset.</param> /// <param name="extractedSize">Extracted size.</param> /// <param name="chunkSizes">Compressed chunks sizes.</param> /// <param name="type">The item type.</param> /// <returns>The new item.</returns> internal static NefsItem CreateItem( uint id, uint dirId, string fileName, UInt64 dataOffset, UInt32 extractedSize, IReadOnlyList <UInt32> chunkSizes, NefsItemType type) { var size = new NefsItemSize(extractedSize, chunkSizes); var dataSource = new NefsFileDataSource(@"C:\source.txt", dataOffset, size, extractedSize != chunkSizes.LastOrDefault()); return(new NefsItem( new NefsItemId(id), fileName, new NefsItemId(dirId), type, dataSource, CreateUnknownData())); }