diff --git a/Aaru.Gui/Aaru.Gui.csproj b/Aaru.Gui/Aaru.Gui.csproj index cfa8cf095..39d8de62c 100644 --- a/Aaru.Gui/Aaru.Gui.csproj +++ b/Aaru.Gui/Aaru.Gui.csproj @@ -347,9 +347,6 @@ Encodings.xaml - - DeviceInfo.xaml - FileSystem.xaml diff --git a/Aaru.Gui/ViewModels/Panels/DeviceInfoViewModel.cs b/Aaru.Gui/ViewModels/Panels/DeviceInfoViewModel.cs deleted file mode 100644 index 950751a65..000000000 --- a/Aaru.Gui/ViewModels/Panels/DeviceInfoViewModel.cs +++ /dev/null @@ -1,528 +0,0 @@ -// /*************************************************************************** -// Aaru Data Preservation Suite -// ---------------------------------------------------------------------------- -// -// Filename : DeviceInfoViewModel.cs -// Author(s) : Natalia Portillo -// -// Component : GUI view models. -// -// --[ Description ] ---------------------------------------------------------- -// -// View model and code for the device 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.Threading.Tasks; -using System.Windows.Input; -using Aaru.Decoders.SCSI.SSC; -using Aaru.Devices; -using Aaru.Gui.ViewModels.Tabs; -using Aaru.Gui.Views.Tabs; -using Aaru.Localization; -using Avalonia.Controls; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using Humanizer; -using Humanizer.Localisation; -using DeviceInfo = Aaru.Core.Devices.Info.DeviceInfo; - -namespace Aaru.Gui.ViewModels.Panels; - -public sealed partial class DeviceInfoViewModel : ViewModelBase -{ - readonly DeviceInfo _devInfo; - readonly Window _view; - [ObservableProperty] - AtaInfo _ataInfo; - [ObservableProperty] - string _blockLimits; - [ObservableProperty] - string _blockSizeGranularity; - [ObservableProperty] - string _cid; - [ObservableProperty] - string _csd; - [ObservableProperty] - string _densities; - [ObservableProperty] - string _deviceType; - [ObservableProperty] - string _extendedCsd; - [ObservableProperty] - string _firewireGuid; - [ObservableProperty] - string _firewireManufacturer; - [ObservableProperty] - string _firewireModel; - [ObservableProperty] - string _firewireModelId; - [ObservableProperty] - string _firewireVendorId; - [ObservableProperty] - bool _firewireVisible; - [ObservableProperty] - bool _kreon; - [ObservableProperty] - bool _kreonChallengeResponse; - [ObservableProperty] - bool _kreonChallengeResponse360; - [ObservableProperty] - bool _kreonDecryptSs; - [ObservableProperty] - bool _kreonDecryptSs360; - [ObservableProperty] - bool _kreonErrorSkipping; - [ObservableProperty] - bool _kreonLock; - [ObservableProperty] - bool _kreonWxripperUnlock; - [ObservableProperty] - bool _kreonWxripperUnlock360; - [ObservableProperty] - bool _kreonXtremeUnlock; - [ObservableProperty] - bool _kreonXtremeUnlock360; - [ObservableProperty] - string _manufacturer; - [ObservableProperty] - string _maxBlockSize; - [ObservableProperty] - string _mediumDensity; - [ObservableProperty] - string _mediumTypes; - [ObservableProperty] - string _minBlockSize; - [ObservableProperty] - string _model; - [ObservableProperty] - string _ocr; - [ObservableProperty] - PcmciaInfo _pcmciaInfo; - [ObservableProperty] - bool _plextorBitSetting; - [ObservableProperty] - bool _plextorBitSettingDl; - [ObservableProperty] - string _plextorCdReadTime; - [ObservableProperty] - string _plextorCdWriteTime; - [ObservableProperty] - string _plextorDiscs; - [ObservableProperty] - string _plextorDvd; - [ObservableProperty] - bool _plextorDvdPlusWriteTest; - [ObservableProperty] - string _plextorDvdReadTime; - [ObservableProperty] - bool _plextorDvdTimesVisible; - [ObservableProperty] - string _plextorDvdWriteTime; - [ObservableProperty] - bool _plextorEepromVisible; - [ObservableProperty] - bool _plextorGigaRec; - [ObservableProperty] - bool _plextorHidesRecordables; - [ObservableProperty] - bool _plextorHidesSessions; - [ObservableProperty] - bool _plextorHiding; - [ObservableProperty] - bool _plextorPoweRec; - [ObservableProperty] - bool _plextorPoweRecEnabled; - [ObservableProperty] - string _plextorPoweRecLast; - [ObservableProperty] - bool _plextorPoweRecLastVisible; - [ObservableProperty] - string _plextorPoweRecMax; - [ObservableProperty] - bool _plextorPoweRecMaxVisible; - [ObservableProperty] - string _plextorPoweRecRecommended; - [ObservableProperty] - bool _plextorPoweRecRecommendedVisible; - [ObservableProperty] - string _plextorPoweRecSelected; - [ObservableProperty] - bool _plextorPoweRecSelectedVisible; - [ObservableProperty] - bool _plextorSecuRec; - [ObservableProperty] - bool _plextorSilentMode; - [ObservableProperty] - string _plextorSilentModeAccessTime; - [ObservableProperty] - string _plextorSilentModeCdReadSpeedLimit; - [ObservableProperty] - string _plextorSilentModeCdWriteSpeedLimit; - [ObservableProperty] - string _plextorSilentModeDvdReadSpeedLimit; - [ObservableProperty] - bool _plextorSilentModeDvdReadSpeedLimitVisible; - [ObservableProperty] - bool _plextorSilentModeEnabled; - [ObservableProperty] - bool _plextorSpeedEnabled; - [ObservableProperty] - bool _plextorSpeedRead; - [ObservableProperty] - bool _plextorVariRec; - [ObservableProperty] - bool _plextorVariRecDvd; - [ObservableProperty] - bool _plextorVisible; - [ObservableProperty] - bool _removable; - [ObservableProperty] - bool _removableChecked; - [ObservableProperty] - string _revision; - [ObservableProperty] - bool _saveUsbDescriptorsEnabled; - [ObservableProperty] - string _scr; - [ObservableProperty] - ScsiInfo _scsiInfo; - [ObservableProperty] - string _scsiType; - [ObservableProperty] - string _sdMm; - [ObservableProperty] - SdMmcInfo _sdMmcInfo; - [ObservableProperty] - string _sdMmcText; - [ObservableProperty] - string _secureDigital; - [ObservableProperty] - string _serial; - [ObservableProperty] - bool _ssc; - [ObservableProperty] - string _usbConnected; - [ObservableProperty] - string _usbManufacturer; - [ObservableProperty] - string _usbProduct; - [ObservableProperty] - string _usbProductId; - [ObservableProperty] - string _usbSerial; - [ObservableProperty] - string _usbVendorId; - [ObservableProperty] - bool _usbVisible; - - public DeviceInfoViewModel(DeviceInfo devInfo, Window view) - { - SaveUsbDescriptorsCommand = new AsyncRelayCommand(SaveUsbDescriptorsAsync); - _view = view; - _devInfo = devInfo; - - DeviceType = devInfo.Type.ToString(); - Manufacturer = devInfo.Manufacturer; - Model = devInfo.Model; - Revision = devInfo.FirmwareRevision; - Serial = devInfo.Serial; - ScsiType = devInfo.ScsiType.ToString(); - Removable = devInfo.IsRemovable; - UsbVisible = devInfo.IsUsb; - - if(devInfo.IsUsb) - { - UsbVisible = true; - SaveUsbDescriptorsEnabled = devInfo.UsbDescriptors != null; - UsbVendorId = $"{devInfo.UsbVendorId:X4}"; - UsbProductId = $"{devInfo.UsbProductId:X4}"; - UsbManufacturer = devInfo.UsbManufacturerString; - UsbProduct = devInfo.UsbProductString; - UsbSerial = devInfo.UsbSerialString; - } - - if(devInfo.IsFireWire) - { - FirewireVisible = true; - FirewireVendorId = $"{devInfo.FireWireVendor:X4}"; - FirewireModelId = $"{devInfo.FireWireModel:X4}"; - FirewireManufacturer = devInfo.FireWireVendorName; - FirewireModel = devInfo.FireWireModelName; - FirewireGuid = $"{devInfo.FireWireGuid:X16}"; - } - - if(devInfo.IsPcmcia) - { - PcmciaInfo = new PcmciaInfo - { - DataContext = new PcmciaInfoViewModel(devInfo.Cis, _view) - }; - } - - if(devInfo.AtaIdentify != null || devInfo.AtapiIdentify != null) - { - AtaInfo = new AtaInfo - { - DataContext = - new AtaInfoViewModel(devInfo.AtaIdentify, devInfo.AtapiIdentify, devInfo.AtaMcptError, _view) - }; - } - - if(devInfo.ScsiInquiryData != null) - { - ScsiInfo = new ScsiInfo - { - DataContext = new ScsiInfoViewModel(devInfo.ScsiInquiryData, - devInfo.ScsiInquiry, - devInfo.ScsiEvpdPages, - devInfo.ScsiMode, - devInfo.ScsiType, - devInfo.ScsiModeSense6, - devInfo.ScsiModeSense10, - devInfo.MmcConfiguration, - _view) - }; - - if(devInfo.PlextorFeatures != null) - { - PlextorVisible = true; - - if(devInfo.PlextorFeatures.Eeprom != null) - { - PlextorEepromVisible = true; - PlextorDiscs = $"{devInfo.PlextorFeatures.Discs}"; - PlextorCdReadTime = devInfo.PlextorFeatures.CdReadTime.Seconds().Humanize(minUnit: TimeUnit.Second); - - PlextorCdWriteTime = - devInfo.PlextorFeatures.CdWriteTime.Seconds().Humanize(minUnit: TimeUnit.Second); - - if(devInfo.PlextorFeatures.IsDvd) - { - PlextorDvdTimesVisible = true; - - PlextorDvdReadTime = devInfo.PlextorFeatures.DvdReadTime.Seconds() - .Humanize(minUnit: TimeUnit.Second); - - PlextorDvdWriteTime = devInfo.PlextorFeatures.DvdWriteTime.Seconds() - .Humanize(minUnit: TimeUnit.Second); - } - } - - PlextorPoweRec = devInfo.PlextorFeatures.PoweRec; - - if(devInfo.PlextorFeatures.PoweRec) - { - PlextorPoweRecEnabled = devInfo.PlextorFeatures.PoweRecEnabled; - - if(devInfo.PlextorFeatures.PoweRecEnabled) - { - PlextorPoweRecEnabled = true; - - if(devInfo.PlextorFeatures.PoweRecRecommendedSpeed > 0) - { - PlextorPoweRecRecommendedVisible = true; - - PlextorPoweRecRecommended = - string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecRecommendedSpeed); - } - - if(devInfo.PlextorFeatures.PoweRecSelected > 0) - { - PlextorPoweRecSelectedVisible = true; - - PlextorPoweRecSelected = - string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecSelected); - } - - if(devInfo.PlextorFeatures.PoweRecMax > 0) - { - PlextorPoweRecMaxVisible = true; - PlextorPoweRecMax = string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecMax); - } - - if(devInfo.PlextorFeatures.PoweRecLast > 0) - { - PlextorPoweRecLastVisible = true; - PlextorPoweRecLast = string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecLast); - } - } - } - - PlextorSilentMode = devInfo.PlextorFeatures.SilentMode; - - if(devInfo.PlextorFeatures.SilentMode) - { - PlextorSilentModeEnabled = devInfo.PlextorFeatures.SilentModeEnabled; - - if(devInfo.PlextorFeatures.SilentModeEnabled) - { - PlextorSilentModeAccessTime = devInfo.PlextorFeatures.AccessTimeLimit == 2 - ? Localization.Core.Access_time_is_slow - : Localization.Core.Access_time_is_fast; - - PlextorSilentModeCdReadSpeedLimit = - devInfo.PlextorFeatures.CdReadSpeedLimit > 0 - ? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" - : UI.unlimited_as_in_speed; - - PlextorSilentModeCdWriteSpeedLimit = - devInfo.PlextorFeatures.CdWriteSpeedLimit > 0 - ? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" - : UI.unlimited_as_in_speed; - - if(devInfo.PlextorFeatures.IsDvd) - { - PlextorSilentModeDvdReadSpeedLimitVisible = true; - - PlextorSilentModeDvdReadSpeedLimit = - devInfo.PlextorFeatures.DvdReadSpeedLimit > 0 - ? $"{devInfo.PlextorFeatures.DvdReadSpeedLimit}x" - : UI.unlimited_as_in_speed; - } - } - } - - PlextorGigaRec = devInfo.PlextorFeatures.GigaRec; - PlextorSecuRec = devInfo.PlextorFeatures.SecuRec; - PlextorSpeedRead = devInfo.PlextorFeatures.SpeedRead; - - if(devInfo.PlextorFeatures.SpeedRead) PlextorSpeedEnabled = devInfo.PlextorFeatures.SpeedReadEnabled; - - PlextorHiding = devInfo.PlextorFeatures.Hiding; - - if(devInfo.PlextorFeatures.Hiding) - { - PlextorHidesRecordables = devInfo.PlextorFeatures.HidesRecordables; - PlextorHidesSessions = devInfo.PlextorFeatures.HidesSessions; - } - - 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.ScsiInquiry?.KreonPresent == true) - { - Kreon = true; - KreonChallengeResponse = devInfo.KreonFeatures.HasFlag(KreonFeatures.ChallengeResponse); - KreonDecryptSs = devInfo.KreonFeatures.HasFlag(KreonFeatures.DecryptSs); - KreonXtremeUnlock = devInfo.KreonFeatures.HasFlag(KreonFeatures.XtremeUnlock); - KreonWxripperUnlock = devInfo.KreonFeatures.HasFlag(KreonFeatures.WxripperUnlock); - - KreonChallengeResponse360 = devInfo.KreonFeatures.HasFlag(KreonFeatures.ChallengeResponse360); - - KreonDecryptSs360 = devInfo.KreonFeatures.HasFlag(KreonFeatures.DecryptSs360); - KreonXtremeUnlock360 = devInfo.KreonFeatures.HasFlag(KreonFeatures.XtremeUnlock360); - KreonWxripperUnlock360 = devInfo.KreonFeatures.HasFlag(KreonFeatures.WxripperUnlock360); - KreonLock = devInfo.KreonFeatures.HasFlag(KreonFeatures.Lock); - KreonErrorSkipping = devInfo.KreonFeatures.HasFlag(KreonFeatures.ErrorSkipping); - } - - if(devInfo.BlockLimits != null) - { - BlockLimits.BlockLimitsData? blockLimits = Decoders.SCSI.SSC.BlockLimits.Decode(devInfo.BlockLimits); - - if(blockLimits.HasValue) - { - Ssc = true; - - if(blockLimits.Value.minBlockLen == blockLimits.Value.maxBlockLen) - { - MinBlockSize = string.Format(Localization.Core.Device_block_size_is_fixed_at_0_bytes, - blockLimits.Value.minBlockLen); - } - else - { - MaxBlockSize = blockLimits.Value.maxBlockLen > 0 - ? string.Format(Localization.Core.Device_maximum_block_size_is_0_bytes, - blockLimits.Value.maxBlockLen) - : Localization.Core.Device_does_not_specify_a_maximum_block_size; - - MinBlockSize = string.Format(Localization.Core.Device_minimum_block_size_is_0_bytes, - blockLimits.Value.minBlockLen); - - if(blockLimits.Value.granularity > 0) - { - BlockSizeGranularity = - string.Format(Localization.Core.Device_needs_a_block_size_granularity_of_pow_0_1_bytes, - blockLimits.Value.granularity, - Math.Pow(2, blockLimits.Value.granularity)); - } - } - } - } - - if(devInfo.DensitySupport != null) - { - if(devInfo.DensitySupportHeader.HasValue) - Densities = DensitySupport.PrettifyDensity(devInfo.DensitySupportHeader); - } - - if(devInfo.MediumDensitySupport != null) - { - if(devInfo.MediaTypeSupportHeader.HasValue) - MediumTypes = DensitySupport.PrettifyMediumType(devInfo.MediaTypeSupportHeader); - - MediumDensity = DensitySupport.PrettifyMediumType(devInfo.MediumDensitySupport); - } - } - - SdMmcInfo = new SdMmcInfo - { - DataContext = new SdMmcInfoViewModel(devInfo.Type, - devInfo.CID, - devInfo.CSD, - devInfo.OCR, - devInfo.ExtendedCSD, - devInfo.SCR) - }; - } - - public ICommand SaveUsbDescriptorsCommand { get; } - - async Task SaveUsbDescriptorsAsync() - { - 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(_devInfo.UsbDescriptors, 0, _devInfo.UsbDescriptors.Length); - - saveFs.Close(); - } -} \ No newline at end of file diff --git a/Aaru.Gui/ViewModels/Windows/DeviceViewModel.cs b/Aaru.Gui/ViewModels/Windows/DeviceViewModel.cs index bb2c35e15..424c2d4d9 100644 --- a/Aaru.Gui/ViewModels/Windows/DeviceViewModel.cs +++ b/Aaru.Gui/ViewModels/Windows/DeviceViewModel.cs @@ -30,16 +30,22 @@ // Copyright © 2011-2025 Natalia Portillo // ****************************************************************************/ +using System; using System.Threading.Tasks; +using System.Windows.Input; using Aaru.CommonTypes.Enums; using Aaru.Core; +using Aaru.Decoders.SCSI.SSC; using Aaru.Devices; +using Aaru.Gui.ViewModels.Tabs; +using Aaru.Gui.Views.Tabs; using Aaru.Gui.Views.Windows; using Aaru.Localization; using Aaru.Logging; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using Humanizer; +using Humanizer.Localisation; using MsBox.Avalonia; using MsBox.Avalonia.Base; using MsBox.Avalonia.Enums; @@ -70,6 +76,154 @@ public partial class DeviceViewModel : ViewModelBase string _statusMessage; [ObservableProperty] bool _usbConnected; + [ObservableProperty] + bool _usbVisible; + [ObservableProperty] + string _usbVendorId; + [ObservableProperty] + string _usbProductId; + [ObservableProperty] + string _usbManufacturer; + [ObservableProperty] + string _usbProduct; + [ObservableProperty] + string _usbSerial; + [ObservableProperty] + bool _saveUsbDescriptorsEnabled; + [ObservableProperty] + bool _firewireVisible; + [ObservableProperty] + string _firewireVendorId; + [ObservableProperty] + string _firewireModelId; + [ObservableProperty] + string _firewireManufacturer; + [ObservableProperty] + string _firewireModel; + [ObservableProperty] + string _firewireGuid; + [ObservableProperty] + bool _plextorVisible; + [ObservableProperty] + bool _plextorEepromVisible; + [ObservableProperty] + bool _plextorDvdTimesVisible; + [ObservableProperty] + bool _plextorPoweRec; + [ObservableProperty] + bool _plextorPoweRecEnabled; + [ObservableProperty] + bool _plextorPoweRecRecommendedVisible; + [ObservableProperty] + bool _plextorPoweRecSelectedVisible; + [ObservableProperty] + bool _plextorPoweRecMaxVisible; + [ObservableProperty] + bool _plextorPoweRecLastVisible; + [ObservableProperty] + bool _plextorSilentMode; + [ObservableProperty] + bool _plextorSilentModeEnabled; + [ObservableProperty] + bool _plextorSilentModeDvdReadSpeedLimitVisible; + [ObservableProperty] + bool _plextorGigaRec; + [ObservableProperty] + bool _plextorSecuRec; + [ObservableProperty] + bool _plextorSpeedRead; + [ObservableProperty] + bool _plextorSpeedEnabled; + [ObservableProperty] + bool _plextorHiding; + [ObservableProperty] + bool _plextorHidesRecordables; + [ObservableProperty] + bool _plextorHidesSessions; + [ObservableProperty] + bool _plextorVariRec; + [ObservableProperty] + bool _plextorDvd; + [ObservableProperty] + bool _plextorVariRecDvd; + [ObservableProperty] + bool _plextorBitSetting; + [ObservableProperty] + bool _plextorBitSettingDl; + [ObservableProperty] + bool _plextorDvdPlusWriteTest; + [ObservableProperty] + string _plextorDiscs; + [ObservableProperty] + string _plextorCdReadTime; + [ObservableProperty] + string _plextorCdWriteTime; + [ObservableProperty] + string _plextorDvdReadTime; + [ObservableProperty] + string _plextorDvdWriteTime; + [ObservableProperty] + string _plextorPoweRecRecommended; + [ObservableProperty] + string _plextorPoweRecSelected; + [ObservableProperty] + string _plextorPoweRecMax; + [ObservableProperty] + string _plextorPoweRecLast; + [ObservableProperty] + string _plextorSilentModeAccessTime; + [ObservableProperty] + string _plextorSilentModeCdReadSpeedLimit; + [ObservableProperty] + string _plextorSilentModeCdWriteSpeedLimit; + [ObservableProperty] + string _plextorSilentModeDvdReadSpeedLimit; + [ObservableProperty] + bool _kreon; + [ObservableProperty] + bool _kreonChallengeResponse; + [ObservableProperty] + bool _kreonDecryptSs; + [ObservableProperty] + bool _kreonXtremeUnlock; + [ObservableProperty] + bool _kreonWxripperUnlock; + [ObservableProperty] + bool _kreonChallengeResponse360; + [ObservableProperty] + bool _kreonDecryptSs360; + [ObservableProperty] + bool _kreonXtremeUnlock360; + [ObservableProperty] + bool _kreonWxripperUnlock360; + [ObservableProperty] + bool _kreonLock; + [ObservableProperty] + bool _kreonErrorSkipping; + [ObservableProperty] + bool _ssc; + [ObservableProperty] + bool _blockLimits; + [ObservableProperty] + string _minBlockSize; + [ObservableProperty] + string _maxBlockSize; + [ObservableProperty] + string _blockSizeGranularity; + [ObservableProperty] + string _densities; + [ObservableProperty] + string _mediumTypes; + [ObservableProperty] + string _mediumDensity; + [ObservableProperty] + SdMmcInfo _sdMmcInfo; + [ObservableProperty] + ScsiInfo _scsiInfo; + [ObservableProperty] + PcmciaInfo _pcmciaInfo; + [ObservableProperty] + AtaInfo _ataInfo; public DeviceViewModel(DeviceView window, string devicePath) { @@ -82,6 +236,8 @@ public partial class DeviceViewModel : ViewModelBase _ = Task.Run(Worker); } + public ICommand SaveUsbDescriptorsCommand { get; } + void Worker() { Dispatcher.UIThread.Invoke(() => StatusMessage = "Opening device..."); @@ -140,6 +296,320 @@ public partial class DeviceViewModel : ViewModelBase }); _dev = dev; + + Statistics.AddDevice(dev); + + Dispatcher.UIThread.Invoke(() => + { + StatusMessage = "Querying device information..."; + }); + + var devInfo = new Aaru.Core.Devices.Info.DeviceInfo(dev); + + Dispatcher.UIThread.Invoke(() => + { + StatusMessage = "Device information queryied successfully..."; + }); + + if(devInfo.IsUsb) + { + Dispatcher.UIThread.Invoke(() => + { + UsbVisible = true; + SaveUsbDescriptorsEnabled = devInfo.UsbDescriptors != null; + UsbVendorId = $"[cyan]{devInfo.UsbVendorId:X4}[/]"; + UsbProductId = $"[cyan]{devInfo.UsbProductId:X4}[/]"; + UsbManufacturer = $"[blue]{devInfo.UsbManufacturerString}[/]"; + UsbProduct = $"[purple]{devInfo.UsbProductString}[/]"; + UsbSerial = $"[fuchsia]{devInfo.UsbSerialString}[/]"; + }); + } + + if(devInfo.IsFireWire) + { + Dispatcher.UIThread.Invoke(() => + { + FirewireVisible = true; + FirewireVendorId = $"[cyan]{devInfo.FireWireVendor:X4}[/]"; + FirewireModelId = $"[cyan]{devInfo.FireWireModel:X4}[/]"; + FirewireManufacturer = $"[blue]{devInfo.FireWireVendorName}[/]"; + FirewireModel = $"[purple]{devInfo.FireWireModelName}[/]"; + FirewireGuid = $"[fuchsia]{devInfo.FireWireGuid:X16}[/]"; + }); + } + + if(devInfo.IsPcmcia) + { + Dispatcher.UIThread.Invoke(() => + { + PcmciaInfo = new PcmciaInfo + { + DataContext = new PcmciaInfoViewModel(devInfo.Cis, _window) + }; + }); + } + + if(devInfo.AtaIdentify != null || devInfo.AtapiIdentify != null) + { + Dispatcher.UIThread.Invoke(() => + { + AtaInfo = new AtaInfo + { + DataContext = new AtaInfoViewModel(devInfo.AtaIdentify, + devInfo.AtapiIdentify, + devInfo.AtaMcptError, + _window) + }; + }); + } + + if(devInfo.ScsiInquiryData != null) + { + Dispatcher.UIThread.Invoke(() => + { + ScsiInfo = new ScsiInfo + { + DataContext = new ScsiInfoViewModel(devInfo.ScsiInquiryData, + devInfo.ScsiInquiry, + devInfo.ScsiEvpdPages, + devInfo.ScsiMode, + devInfo.ScsiType, + devInfo.ScsiModeSense6, + devInfo.ScsiModeSense10, + devInfo.MmcConfiguration, + _window) + }; + }); + + if(devInfo.PlextorFeatures != null) + { + Dispatcher.UIThread.Invoke(() => + { + PlextorVisible = true; + + if(devInfo.PlextorFeatures.Eeprom != null) + { + PlextorEepromVisible = true; + PlextorDiscs = $"{devInfo.PlextorFeatures.Discs}"; + + PlextorCdReadTime = devInfo.PlextorFeatures.CdReadTime.Seconds() + .Humanize(minUnit: TimeUnit.Second); + + PlextorCdWriteTime = devInfo.PlextorFeatures.CdWriteTime.Seconds() + .Humanize(minUnit: TimeUnit.Second); + + if(devInfo.PlextorFeatures.IsDvd) + { + PlextorDvdTimesVisible = true; + + PlextorDvdReadTime = devInfo.PlextorFeatures.DvdReadTime.Seconds() + .Humanize(minUnit: TimeUnit.Second); + + PlextorDvdWriteTime = devInfo.PlextorFeatures.DvdWriteTime.Seconds() + .Humanize(minUnit: TimeUnit.Second); + } + } + + PlextorPoweRec = devInfo.PlextorFeatures.PoweRec; + + if(devInfo.PlextorFeatures.PoweRec) + { + PlextorPoweRecEnabled = devInfo.PlextorFeatures.PoweRecEnabled; + + if(devInfo.PlextorFeatures.PoweRecEnabled) + { + PlextorPoweRecEnabled = true; + + if(devInfo.PlextorFeatures.PoweRecRecommendedSpeed > 0) + { + PlextorPoweRecRecommendedVisible = true; + + PlextorPoweRecRecommended = + string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecRecommendedSpeed); + } + + if(devInfo.PlextorFeatures.PoweRecSelected > 0) + { + PlextorPoweRecSelectedVisible = true; + + PlextorPoweRecSelected = + string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecSelected); + } + + if(devInfo.PlextorFeatures.PoweRecMax > 0) + { + PlextorPoweRecMaxVisible = true; + PlextorPoweRecMax = string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecMax); + } + + if(devInfo.PlextorFeatures.PoweRecLast > 0) + { + PlextorPoweRecLastVisible = true; + PlextorPoweRecLast = string.Format(UI._0_Kb_sec, devInfo.PlextorFeatures.PoweRecLast); + } + } + } + + PlextorSilentMode = devInfo.PlextorFeatures.SilentMode; + + if(devInfo.PlextorFeatures.SilentMode) + { + PlextorSilentModeEnabled = devInfo.PlextorFeatures.SilentModeEnabled; + + if(devInfo.PlextorFeatures.SilentModeEnabled) + { + PlextorSilentModeAccessTime = devInfo.PlextorFeatures.AccessTimeLimit == 2 + ? Localization.Core.Access_time_is_slow + : Localization.Core.Access_time_is_fast; + + PlextorSilentModeCdReadSpeedLimit = + devInfo.PlextorFeatures.CdReadSpeedLimit > 0 + ? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" + : UI.unlimited_as_in_speed; + + PlextorSilentModeCdWriteSpeedLimit = + devInfo.PlextorFeatures.CdWriteSpeedLimit > 0 + ? $"{devInfo.PlextorFeatures.CdReadSpeedLimit}x" + : UI.unlimited_as_in_speed; + + if(devInfo.PlextorFeatures.IsDvd) + { + PlextorSilentModeDvdReadSpeedLimitVisible = true; + + PlextorSilentModeDvdReadSpeedLimit = + devInfo.PlextorFeatures.DvdReadSpeedLimit > 0 + ? $"{devInfo.PlextorFeatures.DvdReadSpeedLimit}x" + : UI.unlimited_as_in_speed; + } + } + } + + PlextorGigaRec = devInfo.PlextorFeatures.GigaRec; + PlextorSecuRec = devInfo.PlextorFeatures.SecuRec; + PlextorSpeedRead = devInfo.PlextorFeatures.SpeedRead; + + if(devInfo.PlextorFeatures.SpeedRead) + PlextorSpeedEnabled = devInfo.PlextorFeatures.SpeedReadEnabled; + + PlextorHiding = devInfo.PlextorFeatures.Hiding; + + if(devInfo.PlextorFeatures.Hiding) + { + PlextorHidesRecordables = devInfo.PlextorFeatures.HidesRecordables; + PlextorHidesSessions = devInfo.PlextorFeatures.HidesSessions; + } + + 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.ScsiInquiry?.KreonPresent == true) + { + Dispatcher.UIThread.Invoke(() => + { + Kreon = true; + KreonChallengeResponse = devInfo.KreonFeatures.HasFlag(KreonFeatures.ChallengeResponse); + KreonDecryptSs = devInfo.KreonFeatures.HasFlag(KreonFeatures.DecryptSs); + KreonXtremeUnlock = devInfo.KreonFeatures.HasFlag(KreonFeatures.XtremeUnlock); + KreonWxripperUnlock = devInfo.KreonFeatures.HasFlag(KreonFeatures.WxripperUnlock); + + KreonChallengeResponse360 = devInfo.KreonFeatures.HasFlag(KreonFeatures.ChallengeResponse360); + + KreonDecryptSs360 = devInfo.KreonFeatures.HasFlag(KreonFeatures.DecryptSs360); + KreonXtremeUnlock360 = devInfo.KreonFeatures.HasFlag(KreonFeatures.XtremeUnlock360); + KreonWxripperUnlock360 = devInfo.KreonFeatures.HasFlag(KreonFeatures.WxripperUnlock360); + KreonLock = devInfo.KreonFeatures.HasFlag(KreonFeatures.Lock); + KreonErrorSkipping = devInfo.KreonFeatures.HasFlag(KreonFeatures.ErrorSkipping); + }); + } + + if(devInfo.BlockLimits != null) + { + BlockLimits.BlockLimitsData? blockLimits = Decoders.SCSI.SSC.BlockLimits.Decode(devInfo.BlockLimits); + + if(blockLimits.HasValue) + { + Dispatcher.UIThread.Invoke(() => + { + Ssc = true; + + if(blockLimits.Value.minBlockLen == blockLimits.Value.maxBlockLen) + { + MinBlockSize = string.Format(Localization.Core.Device_block_size_is_fixed_at_0_bytes, + blockLimits.Value.minBlockLen); + } + else + { + MaxBlockSize = blockLimits.Value.maxBlockLen > 0 + ? string.Format(Localization.Core.Device_maximum_block_size_is_0_bytes, + blockLimits.Value.maxBlockLen) + : Localization.Core.Device_does_not_specify_a_maximum_block_size; + + MinBlockSize = string.Format(Localization.Core.Device_minimum_block_size_is_0_bytes, + blockLimits.Value.minBlockLen); + + if(blockLimits.Value.granularity > 0) + { + BlockSizeGranularity = + string.Format(Localization.Core + .Device_needs_a_block_size_granularity_of_pow_0_1_bytes, + blockLimits.Value.granularity, + Math.Pow(2, blockLimits.Value.granularity)); + } + } + }); + } + } + + if(devInfo.DensitySupport != null) + { + if(devInfo.DensitySupportHeader.HasValue) + Dispatcher.UIThread.Invoke(() => + { + Densities = DensitySupport.PrettifyDensity(devInfo.DensitySupportHeader); + }); + } + + if(devInfo.MediumDensitySupport != null) + { + if(devInfo.MediaTypeSupportHeader.HasValue) + Dispatcher.UIThread.Invoke(() => + { + MediumTypes = DensitySupport.PrettifyMediumType(devInfo.MediaTypeSupportHeader); + }); + + Dispatcher.UIThread.Invoke(() => + { + MediumDensity = DensitySupport.PrettifyMediumType(devInfo.MediumDensitySupport); + }); + } + } + + if(devInfo.CID != null || + devInfo.CSD != null || + devInfo.OCR != null || + devInfo.ExtendedCSD != null || + devInfo.SCR != null) + Dispatcher.UIThread.Invoke(() => + { + SdMmcInfo = new SdMmcInfo + { + DataContext = new SdMmcInfoViewModel(devInfo.Type, + devInfo.CID, + devInfo.CSD, + devInfo.OCR, + devInfo.ExtendedCSD, + devInfo.SCR) + }; + }); } public void Closed() diff --git a/Aaru.Gui/Views/Panels/DeviceInfo.xaml b/Aaru.Gui/Views/Panels/DeviceInfo.xaml deleted file mode 100644 index f5b836c48..000000000 --- a/Aaru.Gui/Views/Panels/DeviceInfo.xaml +++ /dev/null @@ -1,480 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Aaru.Gui/Views/Panels/DeviceInfo.xaml.cs b/Aaru.Gui/Views/Panels/DeviceInfo.xaml.cs deleted file mode 100644 index 24b517d72..000000000 --- a/Aaru.Gui/Views/Panels/DeviceInfo.xaml.cs +++ /dev/null @@ -1,43 +0,0 @@ -// /*************************************************************************** -// Aaru Data Preservation Suite -// ---------------------------------------------------------------------------- -// -// Filename : DeviceInfo.xaml.cs -// Author(s) : Natalia Portillo -// -// Component : GUI panels. -// -// --[ Description ] ---------------------------------------------------------- -// -// Device 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 DeviceInfo : UserControl -{ - public DeviceInfo() => 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 ab5bc3480..017dbf443 100644 --- a/Aaru.Gui/Views/Windows/DeviceView.axaml +++ b/Aaru.Gui/Views/Windows/DeviceView.axaml @@ -12,81 +12,484 @@ Width="640" x:Class="Aaru.Gui.Views.Windows.DeviceView" x:DataType="windows:DeviceViewModel" - Title="DeviceView"> + Title="{Binding DevicePath, Mode=OneWay}"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file