Skip to content

Releases: purelogiccode/RomValidator

release_2.8.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 05 Aug 17:13

New Features

  • Fluent Dark Theme — the UI is now built on WPF-UI with a professional Windows 11-style dark theme: a cohesive color palette (one blue accent, semantic green/red, neutral grays), dark ListView/GridView styling, and redesigned headers, buttons, and stat cards.
  • Screenshot Capture (F8) — press F8 anywhere in the main window to save a PNG screenshot of the app to %LOCALAPPDATA%\ROM Validator\Screenshot (works even when installed under Program Files).
  • App Data Button — the new App Data button (top-right, next to About) opens %LOCALAPPDATA%\ROM Validator in Explorer. Both the rolling logs (Logs\) and screenshots (Screenshot\) now live there, so you can find and share them in one click.
  • Binary DAT Detection — if you accidentally select a disc image, ROM, archive, or other binary file as a DAT, the app now recognizes common signatures (NES, CHD, 7z, RAR, GZIP, ZIP, PNG, PDF, RIFF) and shows a clear "incompatible file format" message instead of an XML parsing error.
  • Large Archive Streaming — archive entries larger than 256 MB are now extracted to a temporary file instead of memory, eliminating out-of-memory crashes on big ROM sets.
  • User-Error Classification — corrupt archives, cloud-only placeholder files, and locked files are now flagged as user-file errors: shown to you in the UI, but no longer sent to the developer as bug reports.

Improvements

  • Serilog Logging — replaced the hand-rolled logger with Serilog (Debug + daily rolling file sink, 7 days retained). Errors and exceptions are automatically forwarded to the bug-report service with full environment details, with recursion protection so logging failures can never cascade.
  • Smarter Temp-Directory Cleanup — deletion now retries with exponential backoff (up to ~22 s), falls back to individual file deletion after a forced GC, and then schedules background retries every 30 s until the folder is gone. No more "Failed to delete temp directory" errors when a file is momentarily locked.
  • Bug-Report Noise Reduction — network/connectivity failures during the update check, and errors caused by the user's own files, are no longer reported as application bugs.
  • Reliability Hardening — every user-facing action (navigation, browsing, cancel, reset, window close) is wrapped with error handling so a single failure can never take down the app; services are disposed in a safe order on shutdown.
  • Version Check Tuning — HTTP errors and timeouts during the update check are handled gracefully and never crash startup.

Testing

  • Added 104 unit and integration tests covering: hash calculation against known vectors (CRC32/MD5/SHA-1/SHA-256), empty/large/cancelled file scenarios, DAT model serialization, GitHub release parsing, bug-report payloads, logger behavior, and a regression test for temp-directory cleanup while a file is locked.
  • Test SDK updated to 18.8.1.

Technical

  • Upgraded dependencies: WPF-UI 4.3.0, Serilog 4.4.0, SharpSevenZip 2.0.109.
  • Built with .NET 10.0, targeting Windows x64 and ARM64.

Full Changelog: release_2.7.1...release_2.8.0

release_2.7.1

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 21 Jun 20:15

Fix: Retry dialog when file is locked

When moving a file fails because it's locked by another process (e.g., an emulator or file manager), ROM Validator now shows a Retry/Cancel dialog instead of silently failing.

  • Displays which file is locked
  • Asks you to close the application using the file
  • Click Retry to try again after closing the file
  • Click Cancel to skip moving that file

Update: SharpSevenZip 2.0.91 → 2.0.99

Updated the 7-Zip library to the latest version.

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

release_2.7.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 18 Jun 06:02

New Features

Startup Validation

  • Application now detects if running from a temporary directory or directly from a compressed archive and prompts the user to extract to a permanent location before proceeding.

DAT File Validation

  • Added file extension check — only .dat and .xml files are accepted.
  • Added hint text below the DAT file path field: "Only No-Intro XML DAT files are supported."
  • Improved error messages when incompatible formats are detected (ZIP, HTML, ClrMamePro, MAME).

Cloud Placeholder Support

  • Cloud-only placeholder files (e.g., OneDrive files not downloaded locally) are now automatically skipped during validation and hashing operations.
  • Skipped files are reported with a clear error message indicating the file needs to be downloaded first.

Duplicate File Handling

  • Files that would overwrite existing files during rename operations now generate unique filenames instead of failing (e.g., game (1).rom, game (2).rom).

Improvements

Async Status Bar Updates

  • All status bar messages now use an async pattern with cancellation support, improving UI responsiveness during long-running operations.

Rename Operations

  • Archive internal file rename operations now use Path.GetFileName() to prevent path traversal issues.
  • File move operations now correctly handle destination file overwrites.

File Enumeration

  • File scanning now uses EnumerationOptions to skip hidden, system, and reparse point files for better performance and reliability.

Bug Fixes

  • Fixed critical data loss bug where source files could be permanently deleted during archive rename operations when a filename collision occurred.
  • Fixed font crash — added fallback fonts (Courier New, Lucida Console) when Consolas is unavailable, preventing SEHException crash on systems with missing fonts.

Dependency Updates

Package Old Version New Version
SharpSevenZip 2.0.36 2.0.49
Microsoft.NET.Test.Sdk 18.4.0 18.6.0
coverlet.collector 10.0.0 10.0.1

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

release_2.6.1

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 23 Apr 01:16
  • Disk-full errors: Added pre-extraction disk-space check with automatic fallback across all available drives. Stops the queue gracefully if no drive has enough space.
  • Temp cleanup: All temp directories are now tracked and cleaned up after the validation queue finishes.

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

release_2.6.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 21 Apr 21:05

🔍 Duplicate ROM Detection

  • Automatically identifies duplicate ROM files (same hash, different filenames)
  • New Duplicate Files Window displays duplicate groups with SHA256 hashes
  • Duplicate files are moved to _duplicate folder during validation
  • Added "Duplicates" counter to validation statistics

📂 Enhanced Archive Support

  • Automatically renames files inside archives to match DAT specifications
  • RAR archives are converted to ZIP format when internal files need renaming
  • Improved error handling for corrupted or damaged archives

🛡️ Strict No-Intro Validation

  • Requires ALL hashes present in the DAT to match (strict No-Intro compliance)
  • Warns about DAT files containing filename collisions (same filename, different hashes)

📝 Comprehensive Documentation

  • Added extensive XML documentation to all public classes and methods
  • Improved code readability and maintainability

🔄 Async Method Standardization

  • Renamed async event handlers to follow *_ClickAsync naming convention
  • Updated XAML event bindings for consistency

🧹 Code Cleanup

  • Removed obsolete ExceptionHandler service
  • Simplified BugReportService API payload structure
  • Added global cancellation token support for application shutdown

🗂️ Archive Processing

  • Fixed archive extraction error handling with specific exception types
  • Improved error messages for corrupted archives
  • Fixed buffer overflow in CRC32 algorithm

🔍 Validation Logic

  • Fixed hash matching logic for strict No-Intro validation
  • Enhanced error handling for "destination already exists" scenarios

🖥️ UI Improvements

  • Added new UI styles for duplicate warning windows
  • Fixed status bar update methods with async support

🔧 Service Architecture

  • Moved ApplicationStatsService to centralized initialization
  • Improved LoggerService exception formatting

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

release_2.5.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 17 Apr 04:25

Archive Engine Overhaul

  • Migrated from SharpCompress to SharpSevenZip: Replaced the archive library for better 7z support and LZMA2 compression
  • Multi-Architecture Support: Added native 7z DLLs for both x64 and ARM64 architectures
  • 7z Archive Creation: New capability to repackage renamed ROM files into 7z archives with LZMA2 compression
  • Enhanced Archive Renaming: Now supports renaming files inside both ZIP and 7z archives

Error Handling & Bug Reporting

  • Centralized Exception Handling: New ExceptionHandler service with async/sync wrappers and automatic caller context capture
  • Enhanced Bug Reports: Structured error reporting with detailed environment info, error context, and full exception details including inner exceptions
  • Global Exception Handlers: Added handlers for UI thread, non-UI thread, and unobserved task exceptions

📊 DAT Format Compliance

  • Proper No-Intro XML Namespaces: DAT files now serialize with correct xsi namespace and schema location attributes
  • Updated Default URLs: Changed homepage/URL defaults to No-Intro official site

🎨 UI Improvements

  • Centralized Styling: Major refactor of XAML resources with organized color definitions and reusable styles
    • New button styles (Start, Cancel, Download, Close)
    • Standardized TextBlock styles (Header, SubHeader, Label, etc.)
    • Consistent Border styles (Card, Option, ProgressBar, Stats Panel)
    • Standard GridSplitter and ProgressBar styles
  • Better Color Management: All brushes now defined as static resources with hover/pressed variants

📝 Logging Enhancements

  • Expanded LoggerService: New methods for logging exceptions, warnings, info, and debug messages
  • Structured Exception Logging: Detailed exception capture with type, message, stack trace, and inner exceptions

🔩 Technical Changes

  • Hash Calculator: Now uses SharpSevenZip for all archive operations with improved stream handling
  • App.xaml.cs: Fully implemented with SevenZip library initialization, global exception handling, and bug report service integration

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

release_2.4.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 12 Apr 00:59

This release marks a significant milestone in the evolution of ROM Validator, focusing on architectural stability, performance optimizations, and enhanced support for the No-Intro ecosystem.

🔍 Enhanced Validation & DAT Support

  • SHA256 Support: Full integration of SHA256 hashing for No-Intro XML DATs, including parsing, indexing, and multi-hash verification.
  • Improved Format Detection: Advanced scanner to proactively identify and reject incompatible formats (ClrMamePro text, MAME XML, HTML, and ZIP) with descriptive user notifications.
  • Smart File Renaming: New option to automatically rename local files to match DAT entries when hashes match but filenames differ.
  • Internal Archive Renaming: Added support for renaming files inside ZIP archives to ensure full collection compliance.
  • Multi-ROM Support: Improved handling of game entries containing multiple ROM files.

🚀 Performance & Reliability

  • Library Migration: Replaced SevenZipSharp with SharpCompress, enabling native support for Zip, 7z, and RAR without requiring external 7z DLL dependencies.
  • Async Architecture: Fully migrated to OpenArchive and OpenEntryStreamAsync APIs for non-blocking I/O.
  • UI Responsiveness:
    • Implemented background file counting for dynamic, accurate progress bar updates.
    • Added UI virtualization (limiting displayed logs to 500 items) to prevent lag during large scans.
    • Offloaded DAT serialization to background threads.
  • Thread Safety: Integrated Interlocked counters and thread-safe buffers for UI updates.

📂 Collection Management

  • Permanent Deletion: Added a safety-confirmed option to permanently delete failed or unknown files from the disk.
  • Sequential Processing: Switched to a robust sequential processing model to prevent race conditions during file move/rename operations.
  • ZIP Fallback: Added a fallback extraction mechanism for ZIP files using incompatible compression methods.

💻 System & UX

  • Centralized Logging: Introduced LoggerService for standardized error and activity logging.
  • Automatic Bug Reporting: Integrated BugReportService to automatically capture and report application exceptions for faster troubleshooting.
  • Modern Standards: Updated codebase to .NET 10 and C# 14, utilizing GeneratedRegex and other modern language features.

Note: This version exclusively supports No-Intro XML DAT files. Users attempting to load ClrMamePro or MAME-specific DATs will be notified to download compatible XML files from the No-Intro website.

release_2.3.1

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 02 Feb 04:47

Improve DAT file validation to detect ClrMamePro text format.

release_2.3.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 31 Jan 02:35
  • Add retry logic with exponential backoff for file access errors during hash computation.
  • Improve exception handling for locked files.
  • Use Interlocked.Increment for thread-safe counter updates.
  • Improve file validation with error logging for missing files.
  • Fix CRC32 computation to return big-endian byte order.
  • Improve regex handling with GeneratedRegex attribute.
  • Enhance exception handling for cancellation propagation.
  • Simplify Dispose calls across services and view models.

release_2.2.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 13 Jan 01:55

Enhanced No-Intro DAT compatibility and overall robustness. Key changes include:

  • Archive Support: Added support for extracting and processing multiple ROMs from archive files (e.g., .zip, .7z) during DAT generation.
  • No-Intro DAT Generation: Refactored DAT generation to group and aggregate ROM files by GameName, aligning with the No-Intro DAT format, allowing a single Game entry to contain multiple Rom elements.
  • Robust DAT Validation: Greatly enhanced DAT file parsing with stricter No-Intro XML validation, detection of incompatible formats (like ClrMamePro text), detailed error handling, and file previews for improved debugging and bug reporting.
  • Comprehensive Hash Checking: Modified hash validation logic to ensure all provided hashes (SHA1, MD5, CRC32) must match for a ROM to be considered valid, and provides detailed mismatch reasons.
  • Performance & Stability: Improved UI update performance during hashing via batching, and implemented more robust cancellation token handling across validation and generation processes.
  • Centralized Logging: Introduced a LoggerService for centralized error logging, replacing direct Console.Error calls.
  • Model Alignment: Updated Datafile, Game, Header, and Rom models to strictly adhere to the No-Intro XML DAT schema, removing MAME-specific attributes and adding No-Intro relevant ones (e.g., Category, Date, Retool, Status, Serial).
  • Bug Fixes: Corrected an out-of-bounds error in CRC32 computation logic and enhanced filename sanitization using compiled regular expressions.
  • Minor Improvements: Replaced collection initializations with new() syntax, enhanced LINQ with static lambdas, and increased max sample length for XML sample reporting in bug reports.