Skip to content

Releases: purelogiccode/BatchConvertIsoToXiso

release_2.7.1

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 05 Jul 05:01

New Features

  • New unit tests — Added tests for DiskMonitorService, FileExtractorService, OrchestratorService, and StatsService.

Improvements

  • Better DirectoryNotFoundException handling in ExtractXisoService — Shows a clear message when a drive or path is missing instead of a generic error.
  • Better EndOfStreamException handling in ExtractFiles — Corrupt/incomplete archives now show a "re-download" message.
  • Better xdvdfs error messages — Non-zero exit codes now suggest the ISO may be invalid or corrupt, without sending a bug report.
  • Encrypted archives no longer trigger bug reports — Password-protected archives are treated as environmental errors.
  • CancellationToken passed to temp folder cleanup — Cleanup operations now respect cancellation instead of running unconditionally.

UI Changes

  • Terminal text color changed from green to white.
  • Start button changed from green to cyan.
  • Exit button changed from slate gray to purple.

Internal

  • Added static annotation to lambda expressions where applicable.
  • Microsoft.NET.Test.Sdk updated from 18.6.0 to 18.7.0.

Full Changelog: release_2.7.0...release_2.7.1

release_2.7.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 21 Jun 18:31

Improved ISO Compatibility

  • Rebuilt XISO support — Added detection of XDVDFS volumes at Sector 0 for rebuilt XISO images that have no video partition header
  • Secondary signature validation — Now validates both the primary signature at the header offset and the secondary signature at +0x7EC, matching the reference implementations in extract-xiso and xdvdfs
  • Relaxed partition validation — Reduced false negatives when detecting valid Xbox disc images by accepting empty root directories (rootOffset == 0 && rootSize == 0) and removing overly aggressive first-entry validation
  • Expanded scan regions — The sector-by-sector fallback scan now covers 64KB–512MB (previously 8MB–512MB), catching XGD3 partitions that start closer to the beginning of the file
  • Windows-1252 encoding for filenames — Xbox filenames with accented characters (e.g. é, ü, ñ) are now displayed correctly instead of being garbled by ASCII decoding

Disk Space Detection & Error Handling

  • Centralized disk space detection — Consolidated IsDiskSpaceError and IsNetworkError into PathHelper, eliminating duplicate code across OrchestratorService, ExtractXisoService, and ExtractFiles
  • Multilingual network error detection — Added support for German (Netzwerk, nicht mehr verfügbar), French (réseau, n'est plus disponible), Spanish (la red, de red), and Italian (rete) network error messages
  • Improved "device" error filtering — Excludes "The device is not ready" (ERROR_NOT_READY) from network error matches, preventing false positives on disconnected USB drives
  • Inner exception checkingIsNetworkError and IsDiskSpaceError now check InnerException messages, catching wrapped errors from network share failures
  • Centralized temp directory resolutionPathHelper.ResolveTempDirectory provides a single implementation used by both OrchestratorService and ExtractXisoService

Cancellation & Threading Improvements

  • TaskCompletionSource for shutdown — Replaced the polling loop in WaitForOperationToCompleteAsync with TaskCompletionSource, enabling instant detection of operation completion during window close
  • Proper shutdown ordering_cts.Cancel() now fires after the operation is fully set up, preventing race conditions where cancel is called before the operation starts
  • Fixed cancellation token in process termination — Process kill tasks now use CancellationToken.None since the original token is already cancelled at that point
  • Safe CTS disposal — Wrapped CancellationTokenSource.Dispose() in try-catch to handle ObjectDisposedException during shutdown
  • Thread-safe XisoExplorer — Added _explorerIsoStLock to protect the ISO stream from concurrent access during drag-and-drop, file open, and directory navigation

Memory & Performance

  • ArrayPool for large buffers — Surface scan and file verification now rent 4MB buffers from ArrayPool<byte>.Shared instead of allocating new arrays each time, reducing GC pressure during batch operations
  • Stopwatch for elapsed time — Replaced DateTime.Now subtraction with System.Diagnostics.Stopwatch for accurate, high-resolution operation timing
  • IHttpClientFactory integrationBugReportService, StatsService, and UpdateChecker now receive HttpClient from the DI container via IHttpClientFactory, enabling proper connection pooling and DNS refresh

UI Improvements

  • Subfolder search for ISO testing — Added a "Search for files in subfolders" checkbox to the Test tab, matching the existing behavior on the Convert tab
  • Responsive XISO Explorer columns — The Name column auto-resizes to fill available space when the explorer panel is resized
  • Delayed temp file cleanup — Files extracted for "Open" or drag-and-drop are cleaned up after a 30-second delay instead of immediately, preventing file-in-use errors
  • Async log readingReportBugAsync now uses Dispatcher.InvokeAsync for reading the log viewer, avoiding potential deadlocks on the UI thread

Code Quality & Correctness

  • Fixed Utils.WriteBytes — The buffer read offset was always 0, overwriting previously-read bytes; now correctly reads at (int)numBytes
  • Fixed output filename for renamed filesOrchestratorService now uses the original filename (not the temp copy path) when generating the output .iso name
  • Removed Math.Abs from HResult — HResult values for ERROR_DISK_FULL (0x70) and ERROR_HANDLE_DISK_FULL (0x27) are positive; the Math.Abs was a no-op
  • Proper using for HTTP resourcesJsonContent and HttpResponseMessage are now disposed correctly in BugReportService
  • BinaryReader leave-openIsoSt now creates its BinaryReader with leaveOpen: true, preventing the stream from being closed when the reader is disposed
  • Fixed Zip Slip detection — Changed from entryPath.Contains("..") to checking individual path components, preventing false positives on filenames like "my..file.txt"
  • AggregateException formattingExceptionFormatter now iterates all inner exceptions in an AggregateException, not just the first one
  • Fixed sharing violation detectionIsFileLocked now uses the HResult code (0x80070020) instead of string matching on the error message

Removed Unused Dependencies

  • Removed System.Text.Encoding.CodePages NuGet package — The encoding provider is registered at startup via CodePagesEncodingProvider.Instance, but the explicit package reference was no longer needed in the main project (added to tests via ModuleInitializer)

Test Coverage

  • 222 tests passing — All existing and new tests pass with zero warnings
  • New tests for: empty root directory handling, rebuilt XISO detection, multilingual network/disk errors, ConvertToPastTense grammar rules, XisoWriter.GetXgdType mapping, and UrlOpenerService error logging

Full Changelog: release_2.6.1...release_2.7.0

release_2.6.1

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 18 Jun 05:33

Features

  • Support for multiple Xbox disc formats: Added detection for XGD1, XGD2, XGD3, and additional disc variants. The converter now tries multiple known partition offsets when reading the XDVDFS volume descriptor, improving compatibility with a wider range of Xbox ISO dumps.

Bug Fixes

  • Fixed missing partition offset in signature scan: The fallback signature scan (FindXisoSignatureOffset) now includes the 0x89D80000 offset, matching the offset used by XisoWriter for Redump type 5 ISOs. Previously, if signature validation failed at the expected offset, the scan would not find this variant.

Full Changelog: release_2.6.0...release_2.6.1

release_2.6.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 14 Jun 22:37

New Features

7-Zip CLI Fallback for Unsupported Compression Methods

  • ZIP archives using unsupported compression methods (e.g., ZSTD/method 21) now automatically fall back to 7-Zip CLI extraction
  • If 7-Zip is not installed, provides clear instructions on how to install it or place 7za.exe in the application directory

Multilingual Network Error Detection

  • Added network error detection with support for multiple languages:
    • English: "network", "device", "no longer available"
    • German: "Netzwerk", "nicht mehr verfügbar"
    • French: "réseau", "n'est plus disponible"
    • Spanish: "red"
    • Italian: "rete"
  • Network errors now display helpful guidance to users instead of generic error messages

Improved Disk Space Handling

  • Added ResolveTempDirectory method to automatically find alternative drives when default temp drive lacks space
  • Pre-conversion disk space checks now use IDiskMonitorService for better accuracy
  • TempFolderCleanupHelper now scans all fixed drives for orphaned temp folders

Bug Fixes

Archive Extraction Improvements

  • Fixed bug #56363: 7-Zip fallback for unsupported compression methods
  • Fixed bug #56306: Improved path validation for archive extraction
  • Improved disk space error detection to handle:
    • Negative HResult values
    • Inner exceptions
    • French error messages ("Espace insuffisant", "disque plein")

IO Error Resilience

  • Added retry logic with exponential backoff for transient IO errors in file copy operations
  • Added retry logic for directory enumeration during extraction
  • Handle EndOfStreamException in XDVDFS traversal to return partial results for corrupted ISOs
  • Catch InvalidDataException and NullReferenceException during integrity check and startup

XISO Explorer Improvements

  • Improved disk space handling in XISO Explorer extraction
  • Better error messages for disk space issues

Dependencies

  • Updated Microsoft.Extensions.DependencyInjection to version 10.0.9
  • Updated SharpCompress to version 0.49.1

Full Changelog: release_2.5.0...release_2.6.0

release_2.5.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 29 May 03:21

7-Zip CLI Fallback for .7z Archives

SharpCompress can struggle with certain .7z archives (especially those using newer compression methods). This release adds an automatic fallback to the 7-Zip command-line tool when SharpCompress fails.

Smart Temp Drive Selection

When the system temp drive runs low on space during archive extraction, the app now automatically searches alternative local drives with sufficient free space. This prevents failures when processing large archives on systems where the C: drive is nearly full.

Archive Info Pre-Scan

Before extraction, archives are now analyzed to determine their uncompressed size and file count. This enables the drive space check to be smarter and provides a more accurate progress indicator before extraction begins.

Enhanced Error Handling

  • Added bug reporting for failures in ExternalToolService, ExtractXisoService, NativeIsoIntegrityService, and XisoWriter
  • Disk space checks now include a 10% safety buffer (minimum 200MB) to account for filesystem overhead

Under the Hood

  • Upgraded SharpCompress to 0.49.0
  • Over 30 new unit tests covering DisplayInstructions, Formatter, GenerateFilename, and ConvertToPastTense

Full Changelog: release_2.4.0...release_2.5.0

release_2.4.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 24 May 02:10

Encrypted Archive Detection

Password-protected archives (ZIP, RAR, 7z) are now automatically detected. Instead of cryptic "bad state" or "end of stream" errors, you'll see a clear message explaining the file is encrypted and guidance on how to extract it manually. This prevents confusion when processing archives downloaded from sites that password-protect their downloads.

File Lock Detection

If an archive is currently open in another program (file explorer preview, antivirus scan, download manager, etc.), the application now detects this before attempting extraction and provides a clear error message asking you to close the locking program.

Retry Logic with Exponential Backoff

Archive analysis and extraction now include automatic retry on transient I/O errors (up to 3 attempts with increasing delays), reducing failures caused by temporary file locks or brief network interruptions.

Drive Readiness Check

Before processing files, the application verifies the target drive is actually ready — preventing confusing errors when working with disconnected external drives or network shares that have gone offline.

Improved Shutdown Handling

  • The application now properly cancels and disposes background operations when closing
  • Added a safety net that force-terminates the process if the UI becomes unresponsive during shutdown (prevents the app from lingering in the background)
  • Closing the window while an operation is running is now smoother and more reliable

Code Quality & Maintainability

  • Extracted GetXgdType method for cleaner Redump ISO type detection
  • BuildFullMessage made testable (now internal static)
  • UpdateChecker now uses injected version string instead of runtime assembly reflection
  • Removed unused ApplicationSettings model and orphaned methods (GetUncompressedArchiveSizeAsync, RobustMoveFileAsync)
  • Added 4 new unit test files, bringing the test suite to 173 passing tests
  • Async methods now follow the Async suffix naming convention
  • NuGet dependencies updated: SharpCompress 0.48.1, Microsoft.Extensions.DependencyInjection 10.0.8

Full Changelog: release_2.3.1...release_2.4.0

release_2.3.1

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 15 Apr 15:42
  • Update Microsoft.Extensions.DependencyInjection to 10.0.6
  • Remove unused TextOptions from App.xaml
  • Fix a bug during application launch

release_2.3.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 14 Apr 02:03
  • Add fallback-safe font families (Segoe UI, Arial, etc.) and terminal fonts for better rendering on Windows, Wine/Proton, and Linux.
  • Enhance error handling for font/rendering issues with detailed diagnostics and user guidance.
  • Update SharpCompress package.
  • Improve exception reporting with environment details.

release_2.2.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 04 Apr 04:12
  • Add a helper method to detect when output drives or network paths become unavailable. When such errors occur, the batch operation is now stopped immediately rather than continuing to process files that cannot be written.
  • Improves error detection by checking specific HRESULT codes.
  • Adds Czech translation support for device not ready errors.
  • Batch operations will now stop immediately on fatal environmental errors instead of marking files as failed and continuing.
  • Implement IsDiskSpaceError check to stop batch processing when the  output drive is full.
  • Improve the bug reports.
  • Update SharpCompress dependency to version 0.47.3.

release_2.1.2

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 17 Mar 18:15

1. New Features & Improvements

  • Disk Space Verification: Added a CheckDiskSpace method that calculates the total size of an archive's contents and verifies if the destination drive has sufficient free space before starting the extraction.
  • Extraction Metadata: The logs now display the total size of the files to be extracted alongside the file count and archive format.
  • Dependency Update: Updated the SharpCompress library from version 0.47.0 to 0.47.1.

2. Enhanced Error Handling

  • Specific Archive Exceptions: Added dedicated catch blocks for ArchiveException and ArchiveOperationException. This provides users with clearer feedback if an archive is corrupt, invalid, or in an unsupported format.
  • Disk Space Alerts: Improved the reporting of "not enough space" errors, providing a user-friendly message suggesting the user free up space rather than showing a generic IO error.
  • Refined Bug Reporting Filters: Updated the exception filtering logic to ensure that environmental issues (like low disk space) and archive-specific errors (like corruption or invalid passwords) are handled gracefully and not flagged as application bugs.

3. Code Cleanup

  • Simplified the extraction loop by pre-filtering entries to exclude directories.
  • Added necessary imports (SharpCompress.Common) to support new exception types.