[GUI] Add device information to device view.

This commit is contained in:
2025-11-19 18:07:32 +00:00
parent 0577767843
commit 36e80ed792
6 changed files with 946 additions and 1127 deletions

View File

@@ -347,9 +347,6 @@
<Compile Update="Views\Dialogs\Encodings.xaml.cs"> <Compile Update="Views\Dialogs\Encodings.xaml.cs">
<DependentUpon>Encodings.xaml</DependentUpon> <DependentUpon>Encodings.xaml</DependentUpon>
</Compile> </Compile>
<Compile Update="Views\Panels\DeviceInfo.xaml.cs">
<DependentUpon>DeviceInfo.xaml</DependentUpon>
</Compile>
<Compile Update="Views\Panels\FileSystem.xaml.cs"> <Compile Update="Views\Panels\FileSystem.xaml.cs">
<DependentUpon>FileSystem.xaml</DependentUpon> <DependentUpon>FileSystem.xaml</DependentUpon>
</Compile> </Compile>

View File

@@ -1,528 +0,0 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : DeviceInfoViewModel.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// 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 <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// 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<FilePickerFileType>
{
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();
}
}

View File

@@ -30,16 +30,22 @@
// Copyright © 2011-2025 Natalia Portillo // Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Input;
using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Enums;
using Aaru.Core; using Aaru.Core;
using Aaru.Decoders.SCSI.SSC;
using Aaru.Devices; using Aaru.Devices;
using Aaru.Gui.ViewModels.Tabs;
using Aaru.Gui.Views.Tabs;
using Aaru.Gui.Views.Windows; using Aaru.Gui.Views.Windows;
using Aaru.Localization; using Aaru.Localization;
using Aaru.Logging; using Aaru.Logging;
using Avalonia.Threading; using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using Humanizer; using Humanizer;
using Humanizer.Localisation;
using MsBox.Avalonia; using MsBox.Avalonia;
using MsBox.Avalonia.Base; using MsBox.Avalonia.Base;
using MsBox.Avalonia.Enums; using MsBox.Avalonia.Enums;
@@ -70,6 +76,154 @@ public partial class DeviceViewModel : ViewModelBase
string _statusMessage; string _statusMessage;
[ObservableProperty] [ObservableProperty]
bool _usbConnected; 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) public DeviceViewModel(DeviceView window, string devicePath)
{ {
@@ -82,6 +236,8 @@ public partial class DeviceViewModel : ViewModelBase
_ = Task.Run(Worker); _ = Task.Run(Worker);
} }
public ICommand SaveUsbDescriptorsCommand { get; }
void Worker() void Worker()
{ {
Dispatcher.UIThread.Invoke(() => StatusMessage = "Opening device..."); Dispatcher.UIThread.Invoke(() => StatusMessage = "Opening device...");
@@ -140,6 +296,320 @@ public partial class DeviceViewModel : ViewModelBase
}); });
_dev = dev; _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() public void Closed()

View File

@@ -1,480 +0,0 @@
<!--
// /***************************************************************************
// Aaru Data Preservation Suite
//
//
// Filename : DeviceInfo.xaml
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : GUI panel.
//
// [ 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 <http://www.gnu.org/licenses/>.
//
//
// Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/
-->
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:panels="clr-namespace:Aaru.Gui.ViewModels.Panels"
xmlns:localization="clr-namespace:Aaru.Localization;assembly=Aaru.Localization"
mc:Ignorable="d"
d:DesignWidth="800"
d:DesignHeight="450"
x:DataType="panels:DeviceInfoViewModel"
x:Class="Aaru.Gui.Views.Panels.DeviceInfo">
<Design.DataContext>
<panels:DeviceInfoViewModel />
</Design.DataContext>
<StackPanel Orientation="Vertical">
<TextBlock Text="{x:Static localization:UI.Title_Device_information}" />
<TabControl>
<TabItem>
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_General}" />
</TabItem.Header>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Device_type}" />
<TextBox Text="{Binding DeviceType}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Manufacturer}" />
<TextBox Text="{Binding Manufacturer}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Model}" />
<TextBox Text="{Binding Model}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Revision}" />
<TextBox Text="{Binding Revision}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Serial_number}" />
<TextBox Text="{Binding Serial}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Peripheral_device_type}" />
<TextBox Text="{Binding ScsiType}"
IsReadOnly="True" />
</StackPanel>
<CheckBox IsChecked="{Binding RemovableChecked}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Title_Removable_media}" />
</CheckBox>
<CheckBox IsChecked="{Binding UsbConnected}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Title_Connected_by_USB}" />
</CheckBox>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding UsbVisible}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_USB}" />
</TabItem.Header>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Vendor_ID}" />
<TextBox Text="{Binding UsbVendorId}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Product_ID}" />
<TextBox Text="{Binding UsbProductId}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Manufacturer}" />
<TextBox Text="{Binding UsbManufacturer}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Product}" />
<TextBox Text="{Binding UsbProduct}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Serial_number}" />
<TextBox Text="{Binding UsbSerial}"
IsReadOnly="True" />
</StackPanel>
<Button Command="{Binding SaveUsbDescriptorsCommand}"
IsVisible="{Binding SaveUsbDescriptorsEnabled}">
<TextBlock Text="{x:Static localization:UI.Save_descriptors_to_file}" />
</Button>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding FirewireVisible}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_FireWire}" />
</TabItem.Header>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Vendor_ID}" />
<TextBox Text="{Binding FirewireVendorId}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Model_ID}" />
<TextBox Text="{Binding FirewireModelId}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Manufacturer}" />
<TextBox Text="{Binding FirewireManufacturer}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_Model}" />
<TextBox Text="{Binding FirewireModel}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Title_GUID}" />
<TextBox Text="{Binding FirewireGuid}"
IsReadOnly="True" />
</StackPanel>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding PlextorVisible}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_Plextor}" />
</TabItem.Header>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorEepromVisible}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Total_loaded_discs}" />
<TextBox Text="{Binding PlextorDiscs}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Time_spent_reading_CDs}" />
<TextBox Text="{Binding PlextorCdReadTime}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Time_spent_writing_CDs}" />
<TextBox Text="{Binding PlextorCdWriteTime}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorDvdTimesVisible}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Time_spent_reading_DVDs}" />
<TextBox Text="{Binding PlextorDvdReadTime}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Time_spent_writing_DVDs}" />
<TextBox Text="{Binding PlextorDvdWriteTime}"
IsReadOnly="True" />
</StackPanel>
</StackPanel>
</StackPanel>
<CheckBox IsChecked="{Binding PlextorPoweRec}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_PoweRec}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorPoweRecEnabled}"
IsEnabled="False"
IsVisible="{Binding PlextorPoweRec}">
<TextBlock Text="{x:Static localization:UI.PoweRec_is_enabled}" />
</CheckBox>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecEnabled}">
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecRecommendedVisible}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Recommended_speed}" />
<TextBox Text="{Binding PlextorPoweRecRecommended}"
IsReadOnly="True" />
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecSelectedVisible}">
<StackPanel Orientation="Horizontal">
<TextBlock
Text="{x:Static localization:UI.Selected_PoweRec_speed_for_currently_inserted_media}" />
<TextBox Text="{Binding PlextorPoweRecSelected}"
IsReadOnly="True" />
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecMaxVisible}">
<StackPanel Orientation="Horizontal">
<TextBlock
Text="{x:Static localization:UI.Maximum_PoweRec_speed_for_currently_inserted_media}" />
<TextBox Text="{Binding PlextorPoweRecMax}"
IsReadOnly="True" />
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecLastVisible}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.Last_PoweRec_used_speed}" />
<TextBox Text="{Binding PlextorPoweRecLast}"
IsReadOnly="True" />
</StackPanel>
</StackPanel>
</StackPanel>
<CheckBox IsChecked="{Binding PlextorSilentMode}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_SilentMode}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorSilentModeEnabled}"
IsEnabled="False"
IsVisible="{Binding PlextorSilentMode}">
<TextBlock Text="{x:Static localization:UI.SilentMode_is_enabled}" />
</CheckBox>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorSilentModeEnabled}">
<TextBlock Text="{Binding PlextorSilentModeAccessTime}" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.CD_read_speed_limited_to}" />
<TextBox Text="{Binding PlextorSilentModeCdReadSpeedLimit}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.CD_write_speed_limited_to}" />
<TextBox Text="{Binding PlextorSilentModeCdWriteSpeedLimit}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorSilentModeDvdReadSpeedLimitVisible}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Static localization:UI.DVD_read_speed_limited_to}" />
<TextBox Text="{Binding PlextorSilentModeDvdReadSpeedLimit}"
IsReadOnly="True" />
</StackPanel>
</StackPanel>
</StackPanel>
<CheckBox IsChecked="{Binding PlextorGigaRec}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_GigaRec}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorSecuRec}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_SecuRec}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorSpeedRead}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_SpeedRead}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorSpeedEnabled}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.SpeedRead_is_enabled}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorHiding}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_hiding_CD_Rs_and_sessions}" />
</CheckBox>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorHiding}">
<CheckBox IsChecked="{Binding PlextorHidesRecordables}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Is_hiding_CD_Rs}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorHidesSessions}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Is_forcing_only_first_session}" />
</CheckBox>
</StackPanel>
<CheckBox IsChecked="{Binding PlextorVariRec}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_VariRec}" />
</CheckBox>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorDvd}">
<CheckBox IsChecked="{Binding PlextorVariRecDvd}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_VariRec_on_DVDs}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorBitSetting}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_bitsetting_DVD_R_book_type}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorBitSettingDl}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_bitsetting_DVD_R_DL_book_type}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorDvdPlusWriteTest}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:UI.Supports_test_writing_DVD_Plus}" />
</CheckBox>
</StackPanel>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding Kreon}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_Kreon}" />
</TabItem.Header>
<StackPanel Orientation="Vertical">
<CheckBox IsChecked="{Binding KreonChallengeResponse}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Can_do_challenge_response_with_Xbox_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonDecryptSs}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Can_read_and_decrypt_SS_from_Xbox_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonXtremeUnlock}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Can_set_xtreme_unlock_state_with_Xbox_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonWxripperUnlock}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Can_set_wxripper_unlock_state_with_Xbox_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonChallengeResponse360}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Can_do_challenge_response_with_Xbox_360_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonDecryptSs360}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Can_read_and_decrypt_SS_from_Xbox_360_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonXtremeUnlock360}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Can_set_xtreme_unlock_state_with_Xbox_360_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonWxripperUnlock360}"
IsEnabled="False">
<TextBlock
Text="{x:Static localization:Core.Can_set_wxripper_unlock_state_with_Xbox_360_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonLock}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Can_set_Kreon_locked_state}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonErrorSkipping}"
IsEnabled="False">
<TextBlock Text="{x:Static localization:Core.Kreon_Can_skip_read_errors}" />
</CheckBox>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding Ssc}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.SSC_Label}" />
</TabItem.Header>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical"
IsVisible="{Binding BlockLimits}">
<TextBlock Text="{Binding MinBlockSize}"
IsVisible="{Binding !!MinBlockSize}" />
<TextBlock Text="{Binding MaxBlockSize}"
IsVisible="{Binding !!MaxBlockSize}" />
<TextBlock Text="{Binding BlockSizeGranularity}"
IsVisible="{Binding !!BlockSizeGranularity}" />
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding !!Densities}">
<TextBlock Text="{x:Static localization:UI.Densities_supported_by_device}" />
<TextBox Text="{Binding Densities}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding !!MediumTypes}">
<TextBlock Text="{x:Static localization:UI.Medium_types_supported_by_device}" />
<TextBox Text="{Binding MediumTypes}"
IsReadOnly="True" />
</StackPanel>
<TextBox Text="{Binding MediumDensity}"
IsReadOnly="True"
IsVisible="{Binding !!MediumDensity}" />
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding SecureDigital}">
<TabItem.Header>
<TextBlock Text="{Binding SdMmcText}" />
</TabItem.Header>
<TabControl>
<TabItem IsVisible="{Binding !!Cid}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_CID}" />
</TabItem.Header>
<TextBox Text="{Binding Cid}"
IsReadOnly="True" />
</TabItem>
<TabItem IsVisible="{Binding !!Csd}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_CSD}" />
</TabItem.Header>
<TextBox Text="{Binding Csd}"
IsReadOnly="True" />
</TabItem>
<TabItem IsVisible="{Binding !!Ocr}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_OCR}" />
</TabItem.Header>
<TextBox Text="{Binding Ocr}"
IsReadOnly="True" />
</TabItem>
<TabItem IsVisible="{Binding !!ExtendedCsd}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_Extended_CSD}" />
</TabItem.Header>
<TextBox Text="{Binding ExtendedCsd}"
IsReadOnly="True" />
</TabItem>
<TabItem IsVisible="{Binding !!Scr}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_SCR}" />
</TabItem.Header>
<TextBox Text="{Binding Scr}"
IsReadOnly="True" />
</TabItem>
</TabControl>
</TabItem>
<TabItem IsVisible="{Binding !!PcmciaInfo}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_PCMCIA}" />
</TabItem.Header>
<ContentControl Content="{Binding PcmciaInfo}" />
</TabItem>
<TabItem IsVisible="{Binding !!AtaInfo}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_ATA_ATAPI}" />
</TabItem.Header>
<ContentControl Content="{Binding AtaInfo}" />
</TabItem>
<TabItem IsVisible="{Binding !!ScsiInfo}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_SCSI}" />
</TabItem.Header>
<ContentControl Content="{Binding ScsiInfo}" />
</TabItem>
<TabItem IsVisible="{Binding !!SdMmcInfo}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_SD_MMC}" />
</TabItem.Header>
<ContentControl Content="{Binding SdMmcInfo}" />
</TabItem>
</TabControl>
</StackPanel>
</UserControl>

View File

@@ -1,43 +0,0 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : DeviceInfo.xaml.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// 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 <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// 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);
}

View File

@@ -12,81 +12,484 @@
Width="640" Width="640"
x:Class="Aaru.Gui.Views.Windows.DeviceView" x:Class="Aaru.Gui.Views.Windows.DeviceView"
x:DataType="windows:DeviceViewModel" x:DataType="windows:DeviceViewModel"
Title="DeviceView"> Title="{Binding DevicePath, Mode=OneWay}">
<Grid RowDefinitions="Auto,*, Auto" <Grid RowDefinitions="Auto,*, Auto"
RowSpacing="8" RowSpacing="8"
Margin="12"> Margin="12">
<StackPanel Grid.Row="0" <Grid Grid.Row="0"
Orientation="Vertical" ColumnDefinitions="Auto, *"
Spacing="8"> ColumnSpacing="8"
<Grid ColumnDefinitions="Auto, *" IsVisible="{Binding DevicePath, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}">
ColumnSpacing="8" <controls:SpectreTextBlock Grid.Column="0"
IsVisible="{Binding DevicePath, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}"> Text="{x:Static localization:UI.Title_Device_path}" />
<controls:SpectreTextBlock Grid.Column="0" <TextBlock Grid.Column="1"
Text="{x:Static localization:UI.Title_Device_path}" /> Foreground="Green"
<TextBlock Grid.Column="1" Text="{Binding DevicePath, Mode=OneWay}" />
Foreground="Green" </Grid>
Text="{Binding DevicePath, Mode=OneWay}" /> <TabControl Grid.Row="1">
</Grid> <TabItem>
<Grid ColumnDefinitions="Auto, *" <TabItem.Header>
ColumnSpacing="8" <controls:SpectreTextBlock Text="{x:Static localization:UI.Title_General}" />
IsVisible="{Binding DeviceType, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}"> </TabItem.Header>
<controls:SpectreTextBlock Grid.Column="0" <StackPanel Margin="8"
Text="{x:Static localization:UI.Title_Device_type}" /> Orientation="Vertical"
<controls:SpectreTextBlock Grid.Column="1" Spacing="8">
Text="{Binding DeviceType}" /> <Grid ColumnDefinitions="Auto, *"
</Grid> ColumnSpacing="8"
<Grid ColumnDefinitions="Auto, *" IsVisible="{Binding DeviceType, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}">
ColumnSpacing="8" <controls:SpectreTextBlock Grid.Column="0"
IsVisible="{Binding Manufacturer, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}"> Text="{x:Static localization:UI.Title_Device_type}" />
<controls:SpectreTextBlock Grid.Column="0" <controls:SpectreTextBlock Grid.Column="1"
Text="{x:Static localization:UI.Title_Manufacturer}" /> Text="{Binding DeviceType, Mode=OneWay}" />
<controls:SpectreTextBlock Grid.Column="1" </Grid>
Text="{Binding Manufacturer}" /> <Grid ColumnDefinitions="Auto, *"
</Grid> ColumnSpacing="8"
<Grid ColumnDefinitions="Auto, *" IsVisible="{Binding Manufacturer, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}">
ColumnSpacing="8" <controls:SpectreTextBlock Grid.Column="0"
IsVisible="{Binding Model, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}"> Text="{x:Static localization:UI.Title_Manufacturer}" />
<controls:SpectreTextBlock Grid.Column="0" <controls:SpectreTextBlock Grid.Column="1"
Text="{x:Static localization:UI.Title_Model}" /> Text="{Binding Manufacturer, Mode=OneWay}" />
<controls:SpectreTextBlock Grid.Column="1" </Grid>
Text="{Binding Model}" /> <Grid ColumnDefinitions="Auto, *"
</Grid> ColumnSpacing="8"
<Grid ColumnDefinitions="Auto, *" IsVisible="{Binding Model, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}">
ColumnSpacing="8" <controls:SpectreTextBlock Grid.Column="0"
IsVisible="{Binding Revision, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}"> Text="{x:Static localization:UI.Title_Model}" />
<controls:SpectreTextBlock Grid.Column="0" <controls:SpectreTextBlock Grid.Column="1"
Text="{x:Static localization:UI.Title_Revision}" /> Text="{Binding Model, Mode=OneWay}" />
<controls:SpectreTextBlock Grid.Column="1" </Grid>
Text="{Binding Revision}" /> <Grid ColumnDefinitions="Auto, *"
</Grid> ColumnSpacing="8"
<Grid ColumnDefinitions="Auto, *" IsVisible="{Binding Revision, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}">
ColumnSpacing="8" <controls:SpectreTextBlock Grid.Column="0"
IsVisible="{Binding Serial, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}"> Text="{x:Static localization:UI.Title_Revision}" />
<controls:SpectreTextBlock Grid.Column="0" <controls:SpectreTextBlock Grid.Column="1"
Text="{x:Static localization:UI.Title_Serial_number}" /> Text="{Binding Revision, Mode=OneWay}" />
<controls:SpectreTextBlock Grid.Column="1" </Grid>
Text="{Binding Serial}" /> <Grid ColumnDefinitions="Auto, *"
</Grid> ColumnSpacing="8"
<Grid ColumnDefinitions="Auto, *" IsVisible="{Binding Serial, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}">
ColumnSpacing="8" <controls:SpectreTextBlock Grid.Column="0"
IsVisible="{Binding ScsiType, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}"> Text="{x:Static localization:UI.Title_Serial_number}" />
<controls:SpectreTextBlock Grid.Column="0" <controls:SpectreTextBlock Grid.Column="1"
Text="{x:Static localization:UI.Title_Peripheral_device_type}" /> Text="{Binding Serial, Mode=OneWay}" />
<controls:SpectreTextBlock Grid.Column="1" </Grid>
Text="{Binding ScsiType}" /> <Grid ColumnDefinitions="Auto, *"
</Grid> ColumnSpacing="8"
<CheckBox IsChecked="{Binding RemovableChecked}" IsVisible="{Binding ScsiType, Converter={x:Static StringConverters.IsNotNullOrEmpty}, Mode=OneWay}">
IsEnabled="False"> <controls:SpectreTextBlock Grid.Column="0"
<controls:SpectreTextBlock Text="{x:Static localization:UI.Title_Removable_media}" /> Text="{x:Static localization:UI.Title_Peripheral_device_type}" />
</CheckBox> <controls:SpectreTextBlock Grid.Column="1"
<CheckBox IsChecked="{Binding UsbConnected}" Text="{Binding ScsiType, Mode=OneWay}" />
IsEnabled="False"> </Grid>
<controls:SpectreTextBlock Text="{x:Static localization:UI.Title_Connected_by_USB}" /> <CheckBox IsChecked="{Binding RemovableChecked, Mode=OneWay}"
</CheckBox> IsEnabled="False">
</StackPanel> <controls:SpectreTextBlock Text="{x:Static localization:UI.Title_Removable_media}" />
<Panel Grid.Row="1" /> </CheckBox>
<TextBox Grid.Row="2" <CheckBox IsChecked="{Binding UsbConnected, Mode=OneWay}"
Text="{Binding StatusMessage, Mode=OneWay}" /> IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Title_Connected_by_USB}" />
</CheckBox>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding UsbVisible, Mode=OneWay}">
<TabItem.Header>
<controls:SpectreTextBlock Text="{x:Static localization:UI.Title_USB}" />
</TabItem.Header>
<StackPanel Orientation="Vertical"
Margin="8"
Spacing="8">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Vendor_ID}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding UsbVendorId, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Product_ID}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding UsbProductId, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Manufacturer}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding UsbManufacturer, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Product}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding UsbProduct, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Serial_number}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding UsbSerial, Mode=OneWay}" />
</Grid>
<Button Command="{Binding SaveUsbDescriptorsCommand, Mode=OneWay}"
IsVisible="{Binding SaveUsbDescriptorsEnabled, Mode=OneWay}">
<TextBlock Text="{x:Static localization:UI.Save_descriptors_to_file}" />
</Button>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding FirewireVisible, Mode=OneWay}">
<TabItem.Header>
<controls:SpectreTextBlock Text="{x:Static localization:UI.Title_FireWire}" />
</TabItem.Header>
<StackPanel Orientation="Vertical">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Vendor_ID}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding FirewireVendorId, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Model_ID}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding FirewireModelId, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Manufacturer}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding FirewireManufacturer, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_Model}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding FirewireModel, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Title_GUID}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding FirewireGuid, Mode=OneWay}" />
</Grid>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding PlextorVisible, Mode=OneWay}">
<TabItem.Header>
<controls:SpectreTextBlock Text="{x:Static localization:UI.Title_Plextor}" />
</TabItem.Header>
<ScrollViewer Margin="8">
<StackPanel Orientation="Vertical"
Spacing="8">
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorEepromVisible, Mode=OneWay}"
Spacing="8">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Total_loaded_discs}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorDiscs, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Time_spent_reading_CDs}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorCdReadTime, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Time_spent_writing_CDs}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorCdWriteTime, Mode=OneWay}" />
</Grid>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorDvdTimesVisible, Mode=OneWay}"
Spacing="8">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Time_spent_reading_DVDs}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorDvdReadTime, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Time_spent_writing_DVDs}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorDvdWriteTime, Mode=OneWay}" />
</Grid>
</StackPanel>
</StackPanel>
<CheckBox IsChecked="{Binding PlextorPoweRec, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Supports_PoweRec}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorPoweRecEnabled, Mode=OneWay}"
IsEnabled="False"
IsVisible="{Binding PlextorPoweRec, Mode=OneWay}">
<controls:SpectreTextBlock Text="{x:Static localization:UI.PoweRec_is_enabled}" />
</CheckBox>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecEnabled, Mode=OneWay}"
Spacing="8">
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecRecommendedVisible, Mode=OneWay}">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Recommended_speed}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorPoweRecRecommended, Mode=OneWay}" />
</Grid>
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecSelectedVisible, Mode=OneWay}">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Selected_PoweRec_speed_for_currently_inserted_media}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorPoweRecSelected, Mode=OneWay}" />
</Grid>
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecMaxVisible, Mode=OneWay}">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Maximum_PoweRec_speed_for_currently_inserted_media}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorPoweRecMax, Mode=OneWay}" />
</Grid>
</StackPanel>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorPoweRecLastVisible, Mode=OneWay}">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.Last_PoweRec_used_speed}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorPoweRecLast, Mode=OneWay}" />
</Grid>
</StackPanel>
</StackPanel>
<CheckBox IsChecked="{Binding PlextorSilentMode, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Supports_SilentMode}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorSilentModeEnabled, Mode=OneWay}"
IsEnabled="False"
IsVisible="{Binding PlextorSilentMode, Mode=OneWay}">
<controls:SpectreTextBlock Text="{x:Static localization:UI.SilentMode_is_enabled}" />
</CheckBox>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorSilentModeEnabled, Mode=OneWay}"
Spacing="8">
<TextBlock Text="{Binding PlextorSilentModeAccessTime, Mode=OneWay}" />
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.CD_read_speed_limited_to}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorSilentModeCdReadSpeedLimit, Mode=OneWay}" />
</Grid>
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.CD_write_speed_limited_to}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorSilentModeCdWriteSpeedLimit, Mode=OneWay}" />
</Grid>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorSilentModeDvdReadSpeedLimitVisible, Mode=OneWay}">
<Grid ColumnDefinitions="Auto, *"
ColumnSpacing="8">
<controls:SpectreTextBlock Grid.Column="0"
Text="{x:Static localization:UI.DVD_read_speed_limited_to}" />
<controls:SpectreTextBlock Grid.Column="1"
Text="{Binding PlextorSilentModeDvdReadSpeedLimit, Mode=OneWay}" />
</Grid>
</StackPanel>
</StackPanel>
<CheckBox IsChecked="{Binding PlextorGigaRec, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Supports_GigaRec}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorSecuRec, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Supports_SecuRec}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorSpeedRead, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Supports_SpeedRead}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorSpeedEnabled, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.SpeedRead_is_enabled}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorHiding, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock
Text="{x:Static localization:UI.Supports_hiding_CD_Rs_and_sessions}" />
</CheckBox>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorHiding, Mode=OneWay}">
<CheckBox IsChecked="{Binding PlextorHidesRecordables, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Is_hiding_CD_Rs}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorHidesSessions, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock
Text="{x:Static localization:UI.Is_forcing_only_first_session}" />
</CheckBox>
</StackPanel>
<CheckBox IsChecked="{Binding PlextorVariRec, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Supports_VariRec}" />
</CheckBox>
<StackPanel Orientation="Vertical"
IsVisible="{Binding PlextorDvd, Mode=OneWay}">
<CheckBox IsChecked="{Binding PlextorVariRecDvd, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Supports_VariRec_on_DVDs}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorBitSetting, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock
Text="{x:Static localization:UI.Supports_bitsetting_DVD_R_book_type}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorBitSettingDl, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock
Text="{x:Static localization:UI.Supports_bitsetting_DVD_R_DL_book_type}" />
</CheckBox>
<CheckBox IsChecked="{Binding PlextorDvdPlusWriteTest, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock
Text="{x:Static localization:UI.Supports_test_writing_DVD_Plus}" />
</CheckBox>
</StackPanel>
</StackPanel>
</ScrollViewer>
</TabItem>
<TabItem IsVisible="{Binding Kreon, Mode=OneWay}">
<TabItem.Header>
<controls:SpectreTextBlock Text="{x:Static localization:UI.Title_Kreon}" />
</TabItem.Header>
<StackPanel Orientation="Vertical" Margin="8">
<CheckBox IsChecked="{Binding KreonChallengeResponse, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Can_do_challenge_response_with_Xbox_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonDecryptSs, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Can_read_and_decrypt_SS_from_Xbox_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonXtremeUnlock, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Can_set_xtreme_unlock_state_with_Xbox_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonWxripperUnlock, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Can_set_wxripper_unlock_state_with_Xbox_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonChallengeResponse360, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Can_do_challenge_response_with_Xbox_360_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonDecryptSs360, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Can_read_and_decrypt_SS_from_Xbox_360_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonXtremeUnlock360, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Can_set_xtreme_unlock_state_with_Xbox_360_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonWxripperUnlock360, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock
Text="{x:Static localization:Core.Can_set_wxripper_unlock_state_with_Xbox_360_discs}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonLock, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Can_set_Kreon_locked_state}" />
</CheckBox>
<CheckBox IsChecked="{Binding KreonErrorSkipping, Mode=OneWay}"
IsEnabled="False">
<controls:SpectreTextBlock Text="{x:Static localization:Core.Kreon_Can_skip_read_errors}" />
</CheckBox>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding Ssc, Mode=OneWay}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.SSC_Label}" />
</TabItem.Header>
<StackPanel Orientation="Vertical" Margin="8" Spacing="8">
<StackPanel Orientation="Vertical" Spacing="8"
IsVisible="{Binding BlockLimits, Mode=OneWay}">
<controls:SpectreTextBlock Text="{Binding MinBlockSize, Mode=OneWay}"
IsVisible="{Binding !!MinBlockSize, Mode=OneWay}" />
<controls:SpectreTextBlock Text="{Binding MaxBlockSize, Mode=OneWay}"
IsVisible="{Binding !!MaxBlockSize, Mode=OneWay}" />
<controls:SpectreTextBlock Text="{Binding BlockSizeGranularity, Mode=OneWay}"
IsVisible="{Binding !!BlockSizeGranularity, Mode=OneWay}" />
</StackPanel>
<StackPanel Orientation="Vertical" Spacing="8"
IsVisible="{Binding !!Densities, Mode=OneWay}">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Densities_supported_by_device}" VerticalAlignment="Center"/>
<TextBox Text="{Binding Densities, Mode=OneWay}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Vertical" Spacing="8"
IsVisible="{Binding !!MediumTypes, Mode=OneWay}">
<controls:SpectreTextBlock Text="{x:Static localization:UI.Medium_types_supported_by_device}" VerticalAlignment="Center"/>
<TextBox Text="{Binding MediumTypes, Mode=OneWay}"
IsReadOnly="True" />
</StackPanel>
<TextBox Text="{Binding MediumDensity, Mode=OneWay}"
IsReadOnly="True"
IsVisible="{Binding !!MediumDensity, Mode=OneWay}" />
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding !!PcmciaInfo, Mode=OneWay}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_PCMCIA}" />
</TabItem.Header>
<ContentControl Content="{Binding PcmciaInfo, Mode=OneWay}" />
</TabItem>
<TabItem IsVisible="{Binding !!AtaInfo, Mode=OneWay}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_ATA_ATAPI}" />
</TabItem.Header>
<ContentControl Content="{Binding AtaInfo, Mode=OneWay}" />
</TabItem>
<TabItem IsVisible="{Binding !!ScsiInfo, Mode=OneWay}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_SCSI}" />
</TabItem.Header>
<ContentControl Content="{Binding ScsiInfo, Mode=OneWay}" />
</TabItem>
<TabItem IsVisible="{Binding !!SdMmcInfo, Mode=OneWay}">
<TabItem.Header>
<TextBlock Text="{x:Static localization:UI.Title_SD_MMC}" />
</TabItem.Header>
<ContentControl Content="{Binding SdMmcInfo, Mode=OneWay}" />
</TabItem>
</TabControl>
<TextBlock Grid.Row="2"
Text="{Binding StatusMessage, Mode=OneWay}" />
</Grid> </Grid>
</Window> </Window>