diff --git a/Aaru.Gui/Aaru.Gui.csproj b/Aaru.Gui/Aaru.Gui.csproj index 39d8de62c..da60d32a0 100644 --- a/Aaru.Gui/Aaru.Gui.csproj +++ b/Aaru.Gui/Aaru.Gui.csproj @@ -353,9 +353,6 @@ ImageInfo.xaml - - MediaInfo.xaml - Partition.xaml diff --git a/Aaru.Gui/ViewModels/Panels/MediaInfoViewModel.cs b/Aaru.Gui/ViewModels/Panels/MediaInfoViewModel.cs deleted file mode 100644 index 2106a5874..000000000 --- a/Aaru.Gui/ViewModels/Panels/MediaInfoViewModel.cs +++ /dev/null @@ -1,362 +0,0 @@ -// /*************************************************************************** -// Aaru Data Preservation Suite -// ---------------------------------------------------------------------------- -// -// Filename : MediaInfoViewModel.cs -// Author(s) : Natalia Portillo -// -// Component : GUI view models. -// -// --[ Description ] ---------------------------------------------------------- -// -// View model and code for the media information panel. -// -// --[ License ] -------------------------------------------------------------- -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General public License for more details. -// -// You should have received a copy of the GNU General public License -// along with this program. If not, see . -// -// ---------------------------------------------------------------------------- -// Copyright © 2011-2025 Natalia Portillo -// ****************************************************************************/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Input; -using Aaru.Gui.ViewModels.Tabs; -using Aaru.Gui.ViewModels.Windows; -using Aaru.Gui.Views.Tabs; -using Aaru.Gui.Views.Windows; -using Aaru.Localization; -using Avalonia.Controls; -using Avalonia.Media.Imaging; -using Avalonia.Platform; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using Humanizer.Bytes; -using MsBox.Avalonia; -using MsBox.Avalonia.Enums; -using ScsiInfo = Aaru.Core.Media.Info.ScsiInfo; - -namespace Aaru.Gui.ViewModels.Panels; - -public sealed partial class MediaInfoViewModel : ViewModelBase -{ - readonly string _devicePath; - readonly ScsiInfo _scsiInfo; - readonly Window _view; - [ObservableProperty] - BlurayInfo _blurayInfo; - [ObservableProperty] - CompactDiscInfo _compactDiscInfo; - [ObservableProperty] - string _densitySupport; - [ObservableProperty] - DvdInfo _dvdInfo; - [ObservableProperty] - DvdWritableInfo _dvdWritableInfo; - [ObservableProperty] - string _generalVisible; - [ObservableProperty] - Bitmap _mediaLogo; - [ObservableProperty] - string _mediaSerial; - [ObservableProperty] - string _mediaSize; - [ObservableProperty] - string _mediaType; - [ObservableProperty] - string _mediumSupport; - [ObservableProperty] - bool _mmcVisible; - [ObservableProperty] - bool _saveDensitySupportVisible; - [ObservableProperty] - bool _saveGetConfigurationVisible; - [ObservableProperty] - bool _saveMediumSupportVisible; - [ObservableProperty] - bool _saveReadCapacity16Visible; - [ObservableProperty] - bool _saveReadCapacityVisible; - [ObservableProperty] - bool _saveReadMediaSerialVisible; - [ObservableProperty] - bool _saveRecognizedFormatLayersVisible; - [ObservableProperty] - bool _saveWriteProtectionStatusVisible; - [ObservableProperty] - bool _sscVisible; - [ObservableProperty] - XboxInfo _xboxInfo; - - public MediaInfoViewModel(ScsiInfo scsiInfo, string devicePath, Window view) - { - _view = view; - SaveReadMediaSerialCommand = new AsyncRelayCommand(SaveReadMediaSerial); - SaveReadCapacityCommand = new AsyncRelayCommand(SaveReadCapacity); - SaveReadCapacity16Command = new AsyncRelayCommand(SaveReadCapacity16); - SaveGetConfigurationCommand = new AsyncRelayCommand(SaveGetConfiguration); - SaveRecognizedFormatLayersCommand = new AsyncRelayCommand(SaveRecognizedFormatLayers); - SaveWriteProtectionStatusCommand = new AsyncRelayCommand(SaveWriteProtectionStatus); - SaveDensitySupportCommand = new AsyncRelayCommand(SaveDensitySupport); - SaveMediumSupportCommand = new AsyncRelayCommand(SaveMediumSupport); - DumpCommand = new AsyncRelayCommand(DumpAsync); - ScanCommand = new AsyncRelayCommand(ScanAsync); - _devicePath = devicePath; - _scsiInfo = scsiInfo; - - var mediaResource = new Uri($"avares://Aaru.Gui/Assets/Logos/Media/{scsiInfo.MediaType}.png"); - - MediaLogo = AssetLoader.Exists(mediaResource) ? new Bitmap(AssetLoader.Open(mediaResource)) : null; - - MediaType = scsiInfo.MediaType.ToString(); - - if(scsiInfo.Blocks != 0 && scsiInfo.BlockSize != 0) - { - MediaSize = string.Format(Localization.Core.Media_has_0_blocks_of_1_bytes_each_for_a_total_of_2, - scsiInfo.Blocks, - scsiInfo.BlockSize, - ByteSize.FromBytes(scsiInfo.Blocks * scsiInfo.BlockSize).ToString("0.000")); - } - - if(scsiInfo.MediaSerialNumber != null) - { - var sbSerial = new StringBuilder(); - - for(var i = 4; i < scsiInfo.MediaSerialNumber.Length; i++) - sbSerial.Append($"{scsiInfo.MediaSerialNumber[i]:X2}"); - - MediaSerial = sbSerial.ToString(); - } - - SaveReadMediaSerialVisible = scsiInfo.MediaSerialNumber != null; - SaveReadCapacityVisible = scsiInfo.ReadCapacity != null; - SaveReadCapacity16Visible = scsiInfo.ReadCapacity16 != null; - - SaveGetConfigurationVisible = scsiInfo.MmcConfiguration != null; - SaveRecognizedFormatLayersVisible = scsiInfo.RecognizedFormatLayers != null; - SaveWriteProtectionStatusVisible = scsiInfo.WriteProtectionStatus != null; - - MmcVisible = SaveGetConfigurationVisible || - SaveRecognizedFormatLayersVisible || - SaveWriteProtectionStatusVisible; - - if(scsiInfo.DensitySupportHeader.HasValue) - DensitySupport = Decoders.SCSI.SSC.DensitySupport.PrettifyDensity(scsiInfo.DensitySupportHeader); - - if(scsiInfo.MediaTypeSupportHeader.HasValue) - MediumSupport = Decoders.SCSI.SSC.DensitySupport.PrettifyMediumType(scsiInfo.MediaTypeSupportHeader); - - SaveDensitySupportVisible = scsiInfo.DensitySupport != null; - SaveMediumSupportVisible = scsiInfo.MediaTypeSupport != null; - - SscVisible = SaveDensitySupportVisible || SaveMediumSupportVisible; - - CompactDiscInfo = new CompactDiscInfo - { - DataContext = new CompactDiscInfoViewModel(scsiInfo.Toc, - scsiInfo.Atip, - scsiInfo.DiscInformation, - scsiInfo.Session, - scsiInfo.RawToc, - scsiInfo.Pma, - scsiInfo.CdTextLeadIn, - scsiInfo.DecodedToc, - scsiInfo.DecodedAtip, - scsiInfo.DecodedSession, - scsiInfo.FullToc, - scsiInfo.DecodedCdTextLeadIn, - scsiInfo.DecodedDiscInformation, - scsiInfo.Mcn, - scsiInfo.Isrcs, - _view) - }; - - DvdInfo = new DvdInfo - { - DataContext = new DvdInfoViewModel(scsiInfo.DvdPfi, - scsiInfo.DvdDmi, - scsiInfo.DvdCmi, - scsiInfo.HddvdCopyrightInformation, - scsiInfo.DvdBca, - scsiInfo.DvdAacs, - scsiInfo.DecodedPfi, - _view) - }; - - XboxInfo = new XboxInfo - { - DataContext = new XboxInfoViewModel(scsiInfo.XgdInfo, - scsiInfo.DvdDmi, - scsiInfo.XboxSecuritySector, - scsiInfo.DecodedXboxSecuritySector, - _view) - }; - - DvdWritableInfo = new DvdWritableInfo - { - DataContext = new DvdWritableInfoViewModel(scsiInfo.DvdRamDds, - scsiInfo.DvdRamCartridgeStatus, - scsiInfo.DvdRamSpareArea, - scsiInfo.LastBorderOutRmd, - scsiInfo.DvdPreRecordedInfo, - scsiInfo.DvdrMediaIdentifier, - scsiInfo.DvdrPhysicalInformation, - scsiInfo.HddvdrMediumStatus, - scsiInfo.HddvdrLastRmd, - scsiInfo.DvdrLayerCapacity, - scsiInfo.DvdrDlMiddleZoneStart, - scsiInfo.DvdrDlJumpIntervalSize, - scsiInfo.DvdrDlManualLayerJumpStartLba, - scsiInfo.DvdrDlRemapAnchorPoint, - scsiInfo.DvdPlusAdip, - scsiInfo.DvdPlusDcb, - _view) - }; - - BlurayInfo = new BlurayInfo - { - DataContext = new BlurayInfoViewModel(scsiInfo.BlurayDiscInformation, - scsiInfo.BlurayBurstCuttingArea, - scsiInfo.BlurayDds, - scsiInfo.BlurayCartridgeStatus, - scsiInfo.BluraySpareAreaInformation, - scsiInfo.BlurayPowResources, - scsiInfo.BlurayTrackResources, - scsiInfo.BlurayRawDfl, - scsiInfo.BlurayPac, - _view) - }; - } - - public ICommand SaveReadMediaSerialCommand { get; } - public ICommand SaveReadCapacityCommand { get; } - public ICommand SaveReadCapacity16Command { get; } - public ICommand SaveGetConfigurationCommand { get; } - public ICommand SaveRecognizedFormatLayersCommand { get; } - public ICommand SaveWriteProtectionStatusCommand { get; } - public ICommand SaveDensitySupportCommand { get; } - public ICommand SaveMediumSupportCommand { get; } - public ICommand DumpCommand { get; } - public ICommand ScanCommand { get; } - - async Task SaveElementAsync(byte[] data) - { - IStorageFile result = await _view.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - FileTypeChoices = new List - { - FilePickerFileTypes.Binary - } - }); - - if(result is null) return; - - var saveFs = new FileStream(result.Path.AbsolutePath, FileMode.Create); - saveFs.Write(data, 0, data.Length); - - saveFs.Close(); - } - - Task SaveReadMediaSerial() => SaveElementAsync(_scsiInfo.MediaSerialNumber); - - Task SaveReadCapacity() => SaveElementAsync(_scsiInfo.ReadCapacity); - - Task SaveReadCapacity16() => SaveElementAsync(_scsiInfo.ReadCapacity16); - - Task SaveGetConfiguration() => SaveElementAsync(_scsiInfo.MmcConfiguration); - - Task SaveRecognizedFormatLayers() => SaveElementAsync(_scsiInfo.RecognizedFormatLayers); - - Task SaveWriteProtectionStatus() => SaveElementAsync(_scsiInfo.WriteProtectionStatus); - - Task SaveDensitySupport() => SaveElementAsync(_scsiInfo.DensitySupport); - - Task SaveMediumSupport() => SaveElementAsync(_scsiInfo.MediaTypeSupport); - - async Task DumpAsync() - { - switch(_scsiInfo.MediaType) - { - case CommonTypes.MediaType.GDR or CommonTypes.MediaType.GDROM: - await MessageBoxManager - .GetMessageBoxStandard(UI.Title_Error, - Localization.Core.GD_ROM_dump_support_is_not_yet_implemented, - ButtonEnum.Ok, - Icon.Error) - .ShowWindowDialogAsync(_view); - - return; - case CommonTypes.MediaType.XGD or CommonTypes.MediaType.XGD2 or CommonTypes.MediaType.XGD3 - when _scsiInfo.DeviceInfo.ScsiInquiry?.KreonPresent != true: - await MessageBoxManager - .GetMessageBoxStandard(UI.Title_Error, - Localization.Core - .Dumping_Xbox_Game_Discs_requires_a_drive_with_Kreon_firmware, - ButtonEnum.Ok, - Icon.Error) - .ShowWindowDialogAsync(_view); - - return; - } - - var mediaDumpWindow = new MediaDump(); - - mediaDumpWindow.DataContext = - new MediaDumpViewModel(_devicePath, _scsiInfo.DeviceInfo, mediaDumpWindow, _scsiInfo); - - mediaDumpWindow.Show(); - } - - async Task ScanAsync() - { - switch(_scsiInfo.MediaType) - { - // TODO: GD-ROM - case CommonTypes.MediaType.GDR: - case CommonTypes.MediaType.GDROM: - await MessageBoxManager - .GetMessageBoxStandard(UI.Title_Error, - Localization.Core.GD_ROM_scan_support_is_not_yet_implemented, - ButtonEnum.Ok, - Icon.Error) - .ShowWindowDialogAsync(_view); - - return; - - // TODO: Xbox - case CommonTypes.MediaType.XGD: - case CommonTypes.MediaType.XGD2: - case CommonTypes.MediaType.XGD3: - await MessageBoxManager.GetMessageBoxStandard(UI.Title_Error, - Localization.Core - .Scanning_Xbox_discs_is_not_yet_supported, - ButtonEnum.Ok, - Icon.Error) - .ShowWindowDialogAsync(_view); - - return; - } - - var mediaScanWindow = new MediaScan(); - - mediaScanWindow.DataContext = new MediaScanViewModel(_devicePath, mediaScanWindow); - - mediaScanWindow.Show(); - } -} \ No newline at end of file diff --git a/Aaru.Gui/ViewModels/Windows/DeviceViewModel.cs b/Aaru.Gui/ViewModels/Windows/DeviceViewModel.cs index 61612a292..723b8986f 100644 --- a/Aaru.Gui/ViewModels/Windows/DeviceViewModel.cs +++ b/Aaru.Gui/ViewModels/Windows/DeviceViewModel.cs @@ -32,9 +32,11 @@ using System; using System.IO; +using System.Text; using System.Threading.Tasks; using System.Windows.Input; using Aaru.CommonTypes.Enums; +using Aaru.CommonTypes.Structs.Devices.SCSI; using Aaru.Core; using Aaru.Decoders.SCSI.SSC; using Aaru.Devices; @@ -43,16 +45,22 @@ using Aaru.Gui.Views.Tabs; using Aaru.Gui.Views.Windows; using Aaru.Localization; using Aaru.Logging; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Avalonia.Platform; using Avalonia.Platform.Storage; +using Avalonia.Svg; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Humanizer; +using Humanizer.Bytes; using Humanizer.Localisation; using MsBox.Avalonia; using MsBox.Avalonia.Base; using MsBox.Avalonia.Enums; using DeviceInfo = Aaru.Core.Devices.Info.DeviceInfo; +using ScsiInfo = Aaru.Core.Media.Info.ScsiInfo; namespace Aaru.Gui.ViewModels.Windows; @@ -66,6 +74,10 @@ public partial class DeviceViewModel : ViewModelBase [ObservableProperty] string _blockSizeGranularity; [ObservableProperty] + BlurayInfo _blurayInfo; + [ObservableProperty] + CompactDiscInfo _compactDiscInfo; + [ObservableProperty] string _densities; Device _dev; [ObservableProperty] @@ -73,6 +85,10 @@ public partial class DeviceViewModel : ViewModelBase [ObservableProperty] string _deviceType; [ObservableProperty] + DvdInfo _dvdInfo; + [ObservableProperty] + DvdWritableInfo _dvdWritableInfo; + [ObservableProperty] string _firewireGuid; [ObservableProperty] string _firewireManufacturer; @@ -111,12 +127,27 @@ public partial class DeviceViewModel : ViewModelBase [ObservableProperty] string _maxBlockSize; [ObservableProperty] + bool _mediaHasInformation; + ScsiInfo _mediaInfo; + [ObservableProperty] + bool _mediaIsInserted; + [ObservableProperty] + IImage _mediaLogo; + [ObservableProperty] + string _mediaSerial; + [ObservableProperty] + string _mediaSize; + [ObservableProperty] + string _mediaType; + [ObservableProperty] string _mediumDensity; [ObservableProperty] string _mediumTypes; [ObservableProperty] string _minBlockSize; [ObservableProperty] + bool _mmcVisible; + [ObservableProperty] string _model; [ObservableProperty] PcmciaInfo _pcmciaInfo; @@ -201,9 +232,21 @@ public partial class DeviceViewModel : ViewModelBase [ObservableProperty] string _revision; [ObservableProperty] + bool _saveGetConfigurationVisible; + [ObservableProperty] + bool _saveReadCapacity16Visible; + [ObservableProperty] + bool _saveReadCapacityVisible; + [ObservableProperty] + bool _saveReadMediaSerialVisible; + [ObservableProperty] + bool _saveRecognizedFormatLayersVisible; + [ObservableProperty] bool _saveUsbDescriptorsEnabled; [ObservableProperty] - ScsiInfo _scsiInfo; + bool _saveWriteProtectionStatusVisible; + [ObservableProperty] + Views.Tabs.ScsiInfo _scsiInfo; [ObservableProperty] string _scsiType; [ObservableProperty] @@ -215,6 +258,8 @@ public partial class DeviceViewModel : ViewModelBase [ObservableProperty] string _statusMessage; [ObservableProperty] + bool _statusMessageVisible; + [ObservableProperty] bool _usbConnected; byte[] _usbDescriptors; [ObservableProperty] @@ -229,16 +274,61 @@ public partial class DeviceViewModel : ViewModelBase string _usbVendorId; [ObservableProperty] bool _usbVisible; + [ObservableProperty] + XboxInfo _xboxInfo; public DeviceViewModel(DeviceView window, string devicePath) { _window = window; DevicePath = devicePath; - SaveUsbDescriptorsCommand = new AsyncRelayCommand(SaveUsbDescriptorsAsync); + SaveUsbDescriptorsCommand = new AsyncRelayCommand(SaveUsbDescriptorsAsync); + SaveReadMediaSerialCommand = new AsyncRelayCommand(SaveReadMediaSerialAsync); + SaveReadCapacityCommand = new AsyncRelayCommand(SaveReadCapacityAsync); + SaveReadCapacity16Command = new AsyncRelayCommand(SaveReadCapacity16Async); + SaveGetConfigurationCommand = new AsyncRelayCommand(SaveGetConfigurationAsync); + SaveRecognizedFormatLayersCommand = new AsyncRelayCommand(SaveRecognizedFormatLayersAsync); + SaveWriteProtectionStatusCommand = new AsyncRelayCommand(SaveWriteProtectionStatusAsync); + DumpCommand = new AsyncRelayCommand(DumpAsync); + ScanCommand = new AsyncRelayCommand(ScanAsync); } - public ICommand SaveUsbDescriptorsCommand { get; } + public ICommand SaveUsbDescriptorsCommand { get; } + public ICommand SaveReadMediaSerialCommand { get; } + public ICommand SaveReadCapacityCommand { get; } + public ICommand SaveReadCapacity16Command { get; } + public ICommand SaveGetConfigurationCommand { get; } + public ICommand SaveRecognizedFormatLayersCommand { get; } + public ICommand SaveWriteProtectionStatusCommand { get; } + public ICommand DumpCommand { get; } + public ICommand ScanCommand { get; } + + Task SaveReadMediaSerialAsync() => SaveElementAsync(_mediaInfo.MediaSerialNumber); + + Task SaveReadCapacityAsync() => SaveElementAsync(_mediaInfo.ReadCapacity); + + Task SaveReadCapacity16Async() => SaveElementAsync(_mediaInfo.ReadCapacity16); + + Task SaveGetConfigurationAsync() => SaveElementAsync(_mediaInfo.MmcConfiguration); + + Task SaveRecognizedFormatLayersAsync() => SaveElementAsync(_mediaInfo.RecognizedFormatLayers); + + Task SaveWriteProtectionStatusAsync() => SaveElementAsync(_mediaInfo.WriteProtectionStatus); + + async Task SaveElementAsync(byte[] data) + { + IStorageFile result = await _window.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions + { + FileTypeChoices = [FilePickerFileTypes.Binary] + }); + + if(result is null) return; + + var saveFs = new FileStream(result.Path.AbsolutePath, FileMode.Create); + await saveFs.WriteAsync(data, 0, data.Length); + + saveFs.Close(); + } public void LoadData() { @@ -262,7 +352,11 @@ public partial class DeviceViewModel : ViewModelBase void Worker() { - Dispatcher.UIThread.Invoke(() => StatusMessage = "Opening device..."); + Dispatcher.UIThread.Invoke(() => + { + StatusMessageVisible = true; + StatusMessage = "Opening device..."; + }); var dev = Device.Create(DevicePath, out ErrorNumber devErrno); @@ -321,11 +415,11 @@ public partial class DeviceViewModel : ViewModelBase Statistics.AddDevice(dev); - Dispatcher.UIThread.Invoke(() => { StatusMessage = "Querying device information..."; }); + Dispatcher.UIThread.Invoke(() => StatusMessage = "Querying device information..."); var devInfo = new DeviceInfo(dev); - Dispatcher.UIThread.Invoke(() => { StatusMessage = "Device information queryied successfully..."; }); + Dispatcher.UIThread.Invoke(() => StatusMessage = "Device information queryied successfully..."); if(devInfo.IsUsb) { @@ -378,6 +472,8 @@ public partial class DeviceViewModel : ViewModelBase devInfo.AtaMcptError, _window) }; + + MediaIsInserted = true; }); } @@ -385,7 +481,7 @@ public partial class DeviceViewModel : ViewModelBase { Dispatcher.UIThread.Invoke(() => { - ScsiInfo = new ScsiInfo + ScsiInfo = new Views.Tabs.ScsiInfo { DataContext = new ScsiInfoViewModel(devInfo.ScsiInquiryData, devInfo.ScsiInquiry, @@ -519,13 +615,12 @@ public partial class DeviceViewModel : ViewModelBase PlextorVariRec = devInfo.PlextorFeatures.VariRec; - if(devInfo.PlextorFeatures.IsDvd) - { - PlextorVariRecDvd = devInfo.PlextorFeatures.VariRecDvd; - PlextorBitSetting = devInfo.PlextorFeatures.BitSetting; - PlextorBitSettingDl = devInfo.PlextorFeatures.BitSettingDl; - PlextorDvdPlusWriteTest = devInfo.PlextorFeatures.DvdPlusWriteTest; - } + if(!devInfo.PlextorFeatures.IsDvd) return; + + PlextorVariRecDvd = devInfo.PlextorFeatures.VariRecDvd; + PlextorBitSetting = devInfo.PlextorFeatures.BitSetting; + PlextorBitSettingDl = devInfo.PlextorFeatures.BitSettingDl; + PlextorDvdPlusWriteTest = devInfo.PlextorFeatures.DvdPlusWriteTest; }); } @@ -617,6 +712,233 @@ public partial class DeviceViewModel : ViewModelBase DensitySupport.PrettifyMediumType(devInfo.MediumDensitySupport); }); } + + Dispatcher.UIThread.Invoke(() => StatusMessage = "Querying media information..."); + + var mediaInfo = new ScsiInfo(dev); + + if(!mediaInfo.MediaInserted) + { + Dispatcher.UIThread.Invoke(() => StatusMessageVisible = false); + + return; + } + + MediaIsInserted = true; + + var genericHddIcon = + new Bitmap(AssetLoader.Open(new Uri("avares://Aaru.Gui/Assets/Icons/oxygen/32x32/drive-harddisk.png"))); + + var genericOpticalIcon = + new Bitmap(AssetLoader.Open(new Uri("avares://Aaru.Gui/Assets/Icons/oxygen/32x32/drive-optical.png"))); + + var genericFolderIcon = + new Bitmap(AssetLoader + .Open(new Uri("avares://Aaru.Gui/Assets/Icons/oxygen/32x32/inode-directory.png"))); + + var mediaResource = new Uri($"avares://Aaru.Gui/Assets/Logos/Media/{mediaInfo.MediaType}.svg"); + + Dispatcher.UIThread.Invoke(() => + { + MediaLogo = AssetLoader.Exists(mediaResource) + ? new SvgImage + { + Source = SvgSource.Load(AssetLoader.Open(mediaResource)) + } + : dev.ScsiType == PeripheralDeviceTypes.DirectAccess + ? genericHddIcon + : dev.ScsiType == PeripheralDeviceTypes.MultiMediaDevice + ? genericOpticalIcon + : genericFolderIcon; + + MediaType = mediaInfo.MediaType.ToString(); + }); + + if(mediaInfo.Blocks != 0 && mediaInfo.BlockSize != 0) + { + Dispatcher.UIThread.Invoke(() => + { + MediaSize = + string.Format(Localization.Core + .Media_has_0_blocks_of_1_bytes_each_for_a_total_of_2, + mediaInfo.Blocks, + mediaInfo.BlockSize, + ByteSize.FromBytes(mediaInfo.Blocks * + mediaInfo.BlockSize) + .ToString("0.000")); + }); + } + + if(mediaInfo.MediaSerialNumber != null) + { + var sbSerial = new StringBuilder(); + + for(var i = 4; i < mediaInfo.MediaSerialNumber.Length; i++) + sbSerial.Append($"{mediaInfo.MediaSerialNumber[i]:X2}"); + + Dispatcher.UIThread.Invoke(() => MediaSerial = sbSerial.ToString()); + } + + Dispatcher.UIThread.Invoke(() => + { + MediaHasInformation = true; + + SaveReadMediaSerialVisible = mediaInfo.MediaSerialNumber != null; + SaveReadCapacityVisible = mediaInfo.ReadCapacity != null; + SaveReadCapacity16Visible = mediaInfo.ReadCapacity16 != null; + + SaveGetConfigurationVisible = mediaInfo.MmcConfiguration != null; + + SaveRecognizedFormatLayersVisible = mediaInfo.RecognizedFormatLayers != null; + + SaveWriteProtectionStatusVisible = mediaInfo.WriteProtectionStatus != null; + + MmcVisible = SaveGetConfigurationVisible || + SaveRecognizedFormatLayersVisible || + SaveWriteProtectionStatusVisible; + }); + + _mediaInfo = mediaInfo; + + Dispatcher.UIThread.Invoke(() => + { + if(_mediaInfo.Toc != null || + _mediaInfo.Atip != null || + _mediaInfo.DiscInformation != null || + _mediaInfo.Session != null || + _mediaInfo.RawToc != null || + _mediaInfo.Pma != null || + _mediaInfo.CdTextLeadIn != null || + _mediaInfo.DecodedToc != null || + _mediaInfo.DecodedAtip != null || + _mediaInfo.DecodedSession != null || + _mediaInfo.FullToc != null || + _mediaInfo.DecodedCdTextLeadIn != null || + _mediaInfo.DecodedDiscInformation != null || + _mediaInfo.Mcn != null || + _mediaInfo.Isrcs != null) + { + CompactDiscInfo = new CompactDiscInfo + { + DataContext = new CompactDiscInfoViewModel(_mediaInfo.Toc, + _mediaInfo.Atip, + _mediaInfo.DiscInformation, + _mediaInfo.Session, + _mediaInfo.RawToc, + _mediaInfo.Pma, + _mediaInfo.CdTextLeadIn, + _mediaInfo.DecodedToc, + _mediaInfo.DecodedAtip, + _mediaInfo.DecodedSession, + _mediaInfo.FullToc, + _mediaInfo.DecodedCdTextLeadIn, + _mediaInfo.DecodedDiscInformation, + _mediaInfo.Mcn, + _mediaInfo.Isrcs, + _window) + }; + } + + if(_mediaInfo.DvdPfi != null || + _mediaInfo.DvdDmi != null || + _mediaInfo.DvdCmi != null || + _mediaInfo.HddvdCopyrightInformation != null || + _mediaInfo.DvdBca != null || + _mediaInfo.DvdAacs != null || + _mediaInfo.DecodedPfi != null) + { + DvdInfo = new DvdInfo + { + DataContext = new DvdInfoViewModel(_mediaInfo.DvdPfi, + _mediaInfo.DvdDmi, + _mediaInfo.DvdCmi, + _mediaInfo.HddvdCopyrightInformation, + _mediaInfo.DvdBca, + _mediaInfo.DvdAacs, + _mediaInfo.DecodedPfi, + _window) + }; + } + + if(_mediaInfo.XgdInfo != null || + _mediaInfo.DvdDmi != null || + _mediaInfo.XboxSecuritySector != null || + _mediaInfo.DecodedXboxSecuritySector != null) + { + XboxInfo = new XboxInfo + { + DataContext = new XboxInfoViewModel(_mediaInfo.XgdInfo, + _mediaInfo.DvdDmi, + _mediaInfo.XboxSecuritySector, + _mediaInfo.DecodedXboxSecuritySector, + _window) + }; + } + + if(_mediaInfo.DvdRamDds != null || + _mediaInfo.DvdRamCartridgeStatus != null || + _mediaInfo.DvdRamSpareArea != null || + _mediaInfo.LastBorderOutRmd != null || + _mediaInfo.DvdPreRecordedInfo != null || + _mediaInfo.DvdrMediaIdentifier != null || + _mediaInfo.DvdrPhysicalInformation != null || + _mediaInfo.HddvdrMediumStatus != null || + _mediaInfo.HddvdrLastRmd != null || + _mediaInfo.DvdrLayerCapacity != null || + _mediaInfo.DvdrDlMiddleZoneStart != null || + _mediaInfo.DvdrDlJumpIntervalSize != null || + _mediaInfo.DvdrDlManualLayerJumpStartLba != null || + _mediaInfo.DvdrDlRemapAnchorPoint != null || + _mediaInfo.DvdPlusAdip != null || + _mediaInfo.DvdPlusDcb != null) + { + DvdWritableInfo = new DvdWritableInfo + { + DataContext = new DvdWritableInfoViewModel(_mediaInfo.DvdRamDds, + _mediaInfo.DvdRamCartridgeStatus, + _mediaInfo.DvdRamSpareArea, + _mediaInfo.LastBorderOutRmd, + _mediaInfo.DvdPreRecordedInfo, + _mediaInfo.DvdrMediaIdentifier, + _mediaInfo.DvdrPhysicalInformation, + _mediaInfo.HddvdrMediumStatus, + _mediaInfo.HddvdrLastRmd, + _mediaInfo.DvdrLayerCapacity, + _mediaInfo.DvdrDlMiddleZoneStart, + _mediaInfo.DvdrDlJumpIntervalSize, + _mediaInfo.DvdrDlManualLayerJumpStartLba, + _mediaInfo.DvdrDlRemapAnchorPoint, + _mediaInfo.DvdPlusAdip, + _mediaInfo.DvdPlusDcb, + _window) + }; + } + + if(_mediaInfo.BlurayDiscInformation != null || + _mediaInfo.BlurayBurstCuttingArea != null || + _mediaInfo.BlurayDds != null || + _mediaInfo.BlurayCartridgeStatus != null || + _mediaInfo.BluraySpareAreaInformation != null || + _mediaInfo.BlurayPowResources != null || + _mediaInfo.BlurayTrackResources != null || + _mediaInfo.BlurayRawDfl != null || + _mediaInfo.BlurayPac != null) + { + BlurayInfo = new BlurayInfo + { + DataContext = new BlurayInfoViewModel(_mediaInfo.BlurayDiscInformation, + _mediaInfo.BlurayBurstCuttingArea, + _mediaInfo.BlurayDds, + _mediaInfo.BlurayCartridgeStatus, + _mediaInfo.BluraySpareAreaInformation, + _mediaInfo.BlurayPowResources, + _mediaInfo.BlurayTrackResources, + _mediaInfo.BlurayRawDfl, + _mediaInfo.BlurayPac, + _window) + }; + } + }); } if(devInfo.CID != null || @@ -636,12 +958,91 @@ public partial class DeviceViewModel : ViewModelBase devInfo.ExtendedCSD, devInfo.SCR) }; + + MediaIsInserted = true; }); } + + Dispatcher.UIThread.Invoke(() => StatusMessageVisible = false); } public void Closed() { _dev?.Close(); } + + async Task DumpAsync() + { + /* + switch(_scsiInfo.MediaType) + { + case CommonTypes.MediaType.GDR or CommonTypes.MediaType.GDROM: + await MessageBoxManager + .GetMessageBoxStandard(UI.Title_Error, + Localization.Core.GD_ROM_dump_support_is_not_yet_implemented, + ButtonEnum.Ok, + Icon.Error) + .ShowWindowDialogAsync(_view); + + return; + case CommonTypes.MediaType.XGD or CommonTypes.MediaType.XGD2 or CommonTypes.MediaType.XGD3 + when _scsiInfo.DeviceInfo.ScsiInquiry?.KreonPresent != true: + await MessageBoxManager + .GetMessageBoxStandard(UI.Title_Error, + Localization.Core + .Dumping_Xbox_Game_Discs_requires_a_drive_with_Kreon_firmware, + ButtonEnum.Ok, + Icon.Error) + .ShowWindowDialogAsync(_view); + + return; + } + + var mediaDumpWindow = new MediaDump(); + + mediaDumpWindow.DataContext = + new MediaDumpViewModel(_devicePath, _scsiInfo.DeviceInfo, mediaDumpWindow, _scsiInfo); + + mediaDumpWindow.Show(); + */ + } + + async Task ScanAsync() + { + /* + switch(_scsiInfo.MediaType) + { + // TODO: GD-ROM + case CommonTypes.MediaType.GDR: + case CommonTypes.MediaType.GDROM: + await MessageBoxManager + .GetMessageBoxStandard(UI.Title_Error, + Localization.Core.GD_ROM_scan_support_is_not_yet_implemented, + ButtonEnum.Ok, + Icon.Error) + .ShowWindowDialogAsync(_view); + + return; + + // TODO: Xbox + case CommonTypes.MediaType.XGD: + case CommonTypes.MediaType.XGD2: + case CommonTypes.MediaType.XGD3: + await MessageBoxManager.GetMessageBoxStandard(UI.Title_Error, + Localization.Core + .Scanning_Xbox_discs_is_not_yet_supported, + ButtonEnum.Ok, + Icon.Error) + .ShowWindowDialogAsync(_view); + + return; + } + + var mediaScanWindow = new MediaScan(); + + mediaScanWindow.DataContext = new MediaScanViewModel(_devicePath, mediaScanWindow); + + mediaScanWindow.Show(); + */ + } } \ No newline at end of file diff --git a/Aaru.Gui/Views/Panels/MediaInfo.xaml b/Aaru.Gui/Views/Panels/MediaInfo.xaml deleted file mode 100644 index 1fdb7133b..000000000 --- a/Aaru.Gui/Views/Panels/MediaInfo.xaml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Aaru.Gui/Views/Panels/MediaInfo.xaml.cs b/Aaru.Gui/Views/Panels/MediaInfo.xaml.cs deleted file mode 100644 index e90a12f61..000000000 --- a/Aaru.Gui/Views/Panels/MediaInfo.xaml.cs +++ /dev/null @@ -1,43 +0,0 @@ -// /*************************************************************************** -// Aaru Data Preservation Suite -// ---------------------------------------------------------------------------- -// -// Filename : MediaInfo.xaml.cs -// Author(s) : Natalia Portillo -// -// Component : GUI panels. -// -// --[ Description ] ---------------------------------------------------------- -// -// Media information panel. -// -// --[ License ] -------------------------------------------------------------- -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General public License for more details. -// -// You should have received a copy of the GNU General public License -// along with this program. If not, see . -// -// ---------------------------------------------------------------------------- -// Copyright © 2011-2025 Natalia Portillo -// ****************************************************************************/ - -using Avalonia.Controls; -using Avalonia.Markup.Xaml; - -namespace Aaru.Gui.Views.Panels; - -public sealed class MediaInfo : UserControl -{ - public MediaInfo() => InitializeComponent(); - - void InitializeComponent() => AvaloniaXamlLoader.Load(this); -} \ No newline at end of file diff --git a/Aaru.Gui/Views/Windows/DeviceView.axaml b/Aaru.Gui/Views/Windows/DeviceView.axaml index 017dbf443..aeeea0e34 100644 --- a/Aaru.Gui/Views/Windows/DeviceView.axaml +++ b/Aaru.Gui/Views/Windows/DeviceView.axaml @@ -13,7 +13,7 @@ x:Class="Aaru.Gui.Views.Windows.DeviceView" x:DataType="windows:DeviceViewModel" Title="{Binding DevicePath, Mode=OneWay}"> - - + - + - + - + - + - + - + - + @@ -437,8 +445,11 @@ - - + @@ -447,15 +458,19 @@ - - + - - + @@ -466,30 +481,148 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + \ No newline at end of file