Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        /// <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()));
        }