Styleguide Rule Fixes and Cleanup

This commit is contained in:
Aaron Murgatroyd 2024-10-09 20:23:20 +10:00
parent 9425aaa972
commit 03c55d11c4
4 changed files with 67 additions and 62 deletions

View File

@ -27,7 +27,7 @@ namespace Ryujinx.Common.Utilities
} }
} }
public class XCIFileTrimmer public sealed class XCIFileTrimmer
{ {
private const long BytesInAMegabyte = 1024 * 1024; private const long BytesInAMegabyte = 1024 * 1024;
private const int BufferSize = 8 * (int)BytesInAMegabyte; private const int BufferSize = 8 * (int)BytesInAMegabyte;
@ -40,7 +40,10 @@ namespace Ryujinx.Common.Utilities
private const int DataSizeFilePos = 0x118; private const int DataSizeFilePos = 0x118;
private const string HeaderMagicValue = "HEAD"; private const string HeaderMagicValue = "HEAD";
private static readonly Dictionary<byte, long> _cartSizesGB = new() /// <summary>
/// Cartridge Sizes (ByteIdentifier, SizeInGB)
/// </summary>
private static readonly Dictionary<byte, long> s_cartSizesGB = new()
{ {
{ 0xFA, 1 }, { 0xFA, 1 },
{ 0xF8, 2 }, { 0xF8, 2 },
@ -135,45 +138,45 @@ namespace Ryujinx.Common.Utilities
public String Filename public String Filename
{ {
get => this._filename; get => _filename;
set set
{ {
this._filename = value; _filename = value;
Reset(); Reset();
} }
} }
public long Pos public long Pos
{ {
get => this._fileStream.Position; get => _fileStream.Position;
set => this._fileStream.Position = value; set => _fileStream.Position = value;
} }
public XCIFileTrimmer(string path, ILog log = null) public XCIFileTrimmer(string path, ILog log = null)
{ {
this.Log = log; Log = log;
this.Filename = path; Filename = path;
ReadHeader(); ReadHeader();
} }
public void CheckFreeSpace() public void CheckFreeSpace()
{ {
if (this.FreeSpaceChecked) if (FreeSpaceChecked)
return; return;
try try
{ {
if (this.CanBeTrimmed) if (CanBeTrimmed)
{ {
this._freeSpaceValid = false; _freeSpaceValid = false;
OpenReaders(); OpenReaders();
try try
{ {
this.Pos = this.TrimmedFileSizeB; Pos = TrimmedFileSizeB;
bool freeSpaceValid = true; bool freeSpaceValid = true;
long readSizeB = this.FileSizeB - this.TrimmedFileSizeB; long readSizeB = FileSizeB - TrimmedFileSizeB;
TimeSpan time = Performance.Measure(() => TimeSpan time = Performance.Measure(() =>
{ {
@ -188,7 +191,7 @@ namespace Ryujinx.Common.Utilities
if (freeSpaceValid) if (freeSpaceValid)
Log?.Write(LogType.Info, "Free space is valid"); Log?.Write(LogType.Info, "Free space is valid");
this._freeSpaceValid = freeSpaceValid; _freeSpaceValid = freeSpaceValid;
} }
finally finally
{ {
@ -199,12 +202,12 @@ namespace Ryujinx.Common.Utilities
else else
{ {
Log?.Write(LogType.Warn, "There is no free space to check."); Log?.Write(LogType.Warn, "There is no free space to check.");
this._freeSpaceValid = false; _freeSpaceValid = false;
} }
} }
finally finally
{ {
this._freeSpaceChecked = true; _freeSpaceChecked = true;
} }
} }
@ -233,31 +236,31 @@ namespace Ryujinx.Common.Utilities
return true; return true;
} }
protected void Reset() private void Reset()
{ {
this._freeSpaceChecked = false; _freeSpaceChecked = false;
this._freeSpaceValid = false; _freeSpaceValid = false;
ReadHeader(); ReadHeader();
} }
public OperationOutcome Trim() public OperationOutcome Trim()
{ {
if (!this.FileOK) if (!FileOK)
{ {
return OperationOutcome.InvalidXCIFile; return OperationOutcome.InvalidXCIFile;
} }
if (!this.CanBeTrimmed) if (!CanBeTrimmed)
{ {
return OperationOutcome.NoTrimNecessary; return OperationOutcome.NoTrimNecessary;
} }
if (!this.FreeSpaceChecked) if (!FreeSpaceChecked)
{ {
CheckFreeSpace(); CheckFreeSpace();
} }
if (!this.FreeSpaceValid) if (!FreeSpaceValid)
{ {
return OperationOutcome.FreeSpaceCheckFailed; return OperationOutcome.FreeSpaceCheckFailed;
} }
@ -266,13 +269,13 @@ namespace Ryujinx.Common.Utilities
try try
{ {
FileInfo info = new FileInfo(this.Filename); FileInfo info = new FileInfo(Filename);
if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{ {
try try
{ {
Log?.Write(LogType.Info, "Attempting to remove ReadOnly attribute"); Log?.Write(LogType.Info, "Attempting to remove ReadOnly attribute");
File.SetAttributes(this.Filename, info.Attributes & ~FileAttributes.ReadOnly); File.SetAttributes(Filename, info.Attributes & ~FileAttributes.ReadOnly);
} }
catch (Exception e) catch (Exception e)
{ {
@ -281,7 +284,7 @@ namespace Ryujinx.Common.Utilities
} }
} }
if (info.Length != this.FileSizeB) if (info.Length != FileSizeB)
{ {
Log?.Write(LogType.Error, "File size has changed, cannot safely trim."); Log?.Write(LogType.Error, "File size has changed, cannot safely trim.");
return OperationOutcome.FileSizeChanged; return OperationOutcome.FileSizeChanged;
@ -291,7 +294,7 @@ namespace Ryujinx.Common.Utilities
try try
{ {
outfileStream.SetLength(this.TrimmedFileSizeB); outfileStream.SetLength(TrimmedFileSizeB);
return OperationOutcome.Successful; return OperationOutcome.Successful;
} }
finally finally
@ -309,12 +312,12 @@ namespace Ryujinx.Common.Utilities
public OperationOutcome Untrim() public OperationOutcome Untrim()
{ {
if (!this.FileOK) if (!FileOK)
{ {
return OperationOutcome.InvalidXCIFile; return OperationOutcome.InvalidXCIFile;
} }
if (!this.CanBeUntrimmed) if (!CanBeUntrimmed)
{ {
return OperationOutcome.NoUntrimPossible; return OperationOutcome.NoUntrimPossible;
} }
@ -323,13 +326,13 @@ namespace Ryujinx.Common.Utilities
{ {
Log?.Write(LogType.Info, "Untrimming..."); Log?.Write(LogType.Info, "Untrimming...");
FileInfo info = new FileInfo(this.Filename); FileInfo info = new FileInfo(Filename);
if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{ {
try try
{ {
Log?.Write(LogType.Info, "Attempting to remove ReadOnly attribute"); Log?.Write(LogType.Info, "Attempting to remove ReadOnly attribute");
File.SetAttributes(this.Filename, info.Attributes & ~FileAttributes.ReadOnly); File.SetAttributes(Filename, info.Attributes & ~FileAttributes.ReadOnly);
} }
catch (Exception e) catch (Exception e)
{ {
@ -338,14 +341,14 @@ namespace Ryujinx.Common.Utilities
} }
} }
if (info.Length != this.FileSizeB) if (info.Length != FileSizeB)
{ {
Log?.Write(LogType.Error, "File size has changed, cannot safely untrim."); Log?.Write(LogType.Error, "File size has changed, cannot safely untrim.");
return OperationOutcome.FileSizeChanged; return OperationOutcome.FileSizeChanged;
} }
FileStream outfileStream = new FileStream(this._filename, FileMode.Append, FileAccess.Write, FileShare.Write); FileStream outfileStream = new FileStream(_filename, FileMode.Append, FileAccess.Write, FileShare.Write);
long bytesToWriteB = this.UntrimmedFileSizeB - this.FileSizeB; long bytesToWriteB = UntrimmedFileSizeB - FileSizeB;
try try
{ {
@ -400,21 +403,21 @@ namespace Ryujinx.Common.Utilities
} }
} }
protected void OpenReaders() private void OpenReaders()
{ {
if (_binaryReader == null) if (_binaryReader == null)
{ {
this._fileStream = new FileStream(this._filename, FileMode.Open, FileAccess.Read, FileShare.Read); _fileStream = new FileStream(_filename, FileMode.Open, FileAccess.Read, FileShare.Read);
this._binaryReader = new BinaryReader(this._fileStream); _binaryReader = new BinaryReader(_fileStream);
} }
} }
protected void CloseReaders() private void CloseReaders()
{ {
if (this._binaryReader != null && this._binaryReader.BaseStream != null) if (_binaryReader != null && _binaryReader.BaseStream != null)
this._binaryReader.Close(); _binaryReader.Close();
this._binaryReader = null; _binaryReader = null;
this._fileStream = null; _fileStream = null;
GC.Collect(); GC.Collect();
} }
@ -435,7 +438,7 @@ namespace Ryujinx.Common.Utilities
success = CheckAndReadHeader(true); success = CheckAndReadHeader(true);
} }
this._fileOK = success; _fileOK = success;
} }
finally finally
{ {
@ -445,18 +448,18 @@ namespace Ryujinx.Common.Utilities
catch (Exception ex) catch (Exception ex)
{ {
Log?.Write(LogType.Error, ex.Message); Log?.Write(LogType.Error, ex.Message);
this._fileOK = false; _fileOK = false;
this._dataSizeB = 0; _dataSizeB = 0;
this._cartSizeB = 0; _cartSizeB = 0;
this._fileSizeB = 0; _fileSizeB = 0;
this._offsetB = 0; _offsetB = 0;
} }
} }
private bool CheckAndReadHeader(bool assumeKeyArea) private bool CheckAndReadHeader(bool assumeKeyArea)
{ {
// Read file size // Read file size
this._fileSizeB = _fileStream.Length; _fileSizeB = _fileStream.Length;
if (_fileSizeB < 32 * 1024) if (_fileSizeB < 32 * 1024)
{ {
Log?.Write(LogType.Error, "The source file doesn't look like an XCI file as the data size is too small"); Log?.Write(LogType.Error, "The source file doesn't look like an XCI file as the data size is too small");
@ -464,10 +467,10 @@ namespace Ryujinx.Common.Utilities
} }
// Setup offset // Setup offset
this._offsetB = (long)(assumeKeyArea ? XCIFileTrimmer.CartKeyAreaSize : 0); _offsetB = (long)(assumeKeyArea ? XCIFileTrimmer.CartKeyAreaSize : 0);
// Check header // Check header
this.Pos = _offsetB + XCIFileTrimmer.HeaderFilePos; Pos = _offsetB + XCIFileTrimmer.HeaderFilePos;
string head = System.Text.Encoding.ASCII.GetString(_binaryReader.ReadBytes(4)); string head = System.Text.Encoding.ASCII.GetString(_binaryReader.ReadBytes(4));
if (head != XCIFileTrimmer.HeaderMagicValue) if (head != XCIFileTrimmer.HeaderMagicValue)
{ {
@ -484,19 +487,19 @@ namespace Ryujinx.Common.Utilities
} }
// Read Cart Size // Read Cart Size
this.Pos = _offsetB + XCIFileTrimmer.CartSizeFilePos; Pos = _offsetB + XCIFileTrimmer.CartSizeFilePos;
byte cartSizeId = _binaryReader.ReadByte(); byte cartSizeId = _binaryReader.ReadByte();
if (!_cartSizesGB.TryGetValue(cartSizeId, out long cartSizeNGB)) if (!s_cartSizesGB.TryGetValue(cartSizeId, out long cartSizeNGB))
{ {
Log?.Write(LogType.Error, $"The source file doesn't look like an XCI file as the Cartridge Size is incorrect (0x{cartSizeId:X2})"); Log?.Write(LogType.Error, $"The source file doesn't look like an XCI file as the Cartridge Size is incorrect (0x{cartSizeId:X2})");
return false; return false;
} }
this._cartSizeB = cartSizeNGB * XCIFileTrimmer.CartSizeMBinFormattedGB * XCIFileTrimmer.BytesInAMegabyte; _cartSizeB = cartSizeNGB * XCIFileTrimmer.CartSizeMBinFormattedGB * XCIFileTrimmer.BytesInAMegabyte;
// Read data size // Read data size
this.Pos = _offsetB + XCIFileTrimmer.DataSizeFilePos; Pos = _offsetB + XCIFileTrimmer.DataSizeFilePos;
long records = (long)BitConverter.ToUInt32(_binaryReader.ReadBytes(4), 0); long records = (long)BitConverter.ToUInt32(_binaryReader.ReadBytes(4), 0);
this._dataSizeB = RecordsToByte(records); _dataSizeB = RecordsToByte(records);
return true; return true;
} }

View File

@ -13,6 +13,7 @@ using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS;
using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Account.Acc;
@ -674,7 +675,7 @@ namespace Ryujinx.UI.Widgets
return; return;
} }
var trimmer = new Ryujinx.Common.Utilities.XCIFileTrimmer(_applicationData.Path, new XCIFileTrimmerLog(_parent)); var trimmer = new XCIFileTrimmer(_applicationData.Path, new XCIFileTrimmerLog(_parent));
if (trimmer.CanBeTrimmed) if (trimmer.CanBeTrimmed)
{ {
@ -697,7 +698,7 @@ namespace Ryujinx.UI.Widgets
try try
{ {
var operationOutcome = trimmer.Trim(); XCIFileTrimmer.OperationOutcome operationOutcome = trimmer.Trim();
Gtk.Application.Invoke(delegate Gtk.Application.Invoke(delegate
{ {

View File

@ -362,7 +362,6 @@ namespace Ryujinx.Ava.UI.Controls
public async void TrimXCI_Click(object sender, RoutedEventArgs args) public async void TrimXCI_Click(object sender, RoutedEventArgs args)
{ {
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel; var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
var item = (sender as MenuItem);
if (viewModel?.SelectedApplication != null) if (viewModel?.SelectedApplication != null)
{ {

View File

@ -20,6 +20,7 @@ using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.Cpu; using Ryujinx.Cpu;
using Ryujinx.HLE; using Ryujinx.HLE;
using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.FileSystem;
@ -506,6 +507,7 @@ namespace Ryujinx.Ava.UI.ViewModels
OnPropertyChanged(); OnPropertyChanged();
} }
} }
public string FifoStatusText public string FifoStatusText
{ {
get => _fifoStatusText; get => _fifoStatusText;
@ -1823,14 +1825,14 @@ namespace Ryujinx.Ava.UI.ViewModels
return; return;
} }
var trimmer = new Ryujinx.Common.Utilities.XCIFileTrimmer(filename, new Common.XCIFileTrimmerLog(this)); var trimmer = new XCIFileTrimmer(filename, new Common.XCIFileTrimmerLog(this));
if (trimmer.CanBeTrimmed) if (trimmer.CanBeTrimmed)
{ {
var savings = (double)trimmer.DiskSpaceSavingsB / 1024.0 / 1024.0; var savings = (double)trimmer.DiskSpaceSavingsB / 1024.0 / 1024.0;
var currentFileSize = (double)trimmer.FileSizeB / 1024.0 / 1024.0; var currentFileSize = (double)trimmer.FileSizeB / 1024.0 / 1024.0;
var cartDataSize = (double)trimmer.DataSizeB / 1024.0 / 1024.0; var cartDataSize = (double)trimmer.DataSizeB / 1024.0 / 1024.0;
var secondaryText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TrimXCIFileDialogSecondaryText, currentFileSize, cartDataSize, savings); string secondaryText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TrimXCIFileDialogSecondaryText, currentFileSize, cartDataSize, savings);
var result = await ContentDialogHelper.CreateConfirmationDialog( var result = await ContentDialogHelper.CreateConfirmationDialog(
LocaleManager.Instance[LocaleKeys.TrimXCIFileDialogPrimaryText], LocaleManager.Instance[LocaleKeys.TrimXCIFileDialogPrimaryText],
@ -1855,7 +1857,7 @@ namespace Ryujinx.Ava.UI.ViewModels
try try
{ {
var operationOutcome = trimmer.Trim(); XCIFileTrimmer.OperationOutcome operationOutcome = trimmer.Trim();
Dispatcher.UIThread.Post(() => Dispatcher.UIThread.Post(() =>
{ {