Migrate SCSI info from Eto.Forms to Avalonia.

This commit is contained in:
2020-04-12 04:14:48 +01:00
parent 8250e17e19
commit ec8ef12dae
11 changed files with 356 additions and 393 deletions

View File

@@ -1254,6 +1254,7 @@
<e p="PartitionSchemeModel.cs" t="Include" /> <e p="PartitionSchemeModel.cs" t="Include" />
<e p="PluginModel.cs" t="Include" /> <e p="PluginModel.cs" t="Include" />
<e p="RootModel.cs" t="Include" /> <e p="RootModel.cs" t="Include" />
<e p="ScsiPageModel.cs" t="Include" />
</e> </e>
<e p="obj" t="ExcludeRecursive"> <e p="obj" t="ExcludeRecursive">
<e p="Debug" t="Include"> <e p="Debug" t="Include">
@@ -1281,6 +1282,8 @@
</e> </e>
<e p="ResourceHandler.cs" t="Include" /> <e p="ResourceHandler.cs" t="Include" />
<e p="Tabs" t="Include"> <e p="Tabs" t="Include">
<e p="ScsiInfoTab.xaml" t="Include" />
<e p="ScsiInfoTab.xaml.cs" t="Include" />
<e p="tabAtaInfo.xeto" t="Include" /> <e p="tabAtaInfo.xeto" t="Include" />
<e p="tabAtaInfo.xeto.cs" t="Include" /> <e p="tabAtaInfo.xeto.cs" t="Include" />
<e p="tabBlurayInfo.xeto" t="Include" /> <e p="tabBlurayInfo.xeto" t="Include" />
@@ -1293,8 +1296,6 @@
<e p="tabDvdWritableInfo.xeto.cs" t="Include" /> <e p="tabDvdWritableInfo.xeto.cs" t="Include" />
<e p="tabPcmciaInfo.xeto" t="Include" /> <e p="tabPcmciaInfo.xeto" t="Include" />
<e p="tabPcmciaInfo.xeto.cs" t="Include" /> <e p="tabPcmciaInfo.xeto.cs" t="Include" />
<e p="tabScsiInfo.xeto" t="Include" />
<e p="tabScsiInfo.xeto.cs" t="Include" />
<e p="tabSdMmcInfo.xeto" t="Include" /> <e p="tabSdMmcInfo.xeto" t="Include" />
<e p="tabSdMmcInfo.xeto.cs" t="Include" /> <e p="tabSdMmcInfo.xeto.cs" t="Include" />
<e p="tabXboxInfo.xeto" t="Include" /> <e p="tabXboxInfo.xeto" t="Include" />
@@ -1309,6 +1310,7 @@
<e p="LicenseDialogViewModel.cs" t="Include" /> <e p="LicenseDialogViewModel.cs" t="Include" />
<e p="MainWindowViewModel.cs" t="Include" /> <e p="MainWindowViewModel.cs" t="Include" />
<e p="PluginsDialogViewModel.cs" t="Include" /> <e p="PluginsDialogViewModel.cs" t="Include" />
<e p="ScsiInfoViewModel.cs" t="Include" />
<e p="SettingsDialogViewModel.cs" t="Include" /> <e p="SettingsDialogViewModel.cs" t="Include" />
<e p="SplashWindowViewModel.cs" t="Include" /> <e p="SplashWindowViewModel.cs" t="Include" />
<e p="StatisticsDialogViewModel.cs" t="Include" /> <e p="StatisticsDialogViewModel.cs" t="Include" />

View File

@@ -352,6 +352,9 @@
<Compile Update="Panels\ImageInfoPanel.xaml.cs"> <Compile Update="Panels\ImageInfoPanel.xaml.cs">
<DependentUpon>ImageInfoPanel.xaml</DependentUpon> <DependentUpon>ImageInfoPanel.xaml</DependentUpon>
</Compile> </Compile>
<Compile Update="Tabs\ScsiInfoTab.xaml.cs">
<DependentUpon>ScsiInfoTab.xaml</DependentUpon>
</Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<UpToDateCheckInput Remove="Views\MainWindow.xaml" /> <UpToDateCheckInput Remove="Views\MainWindow.xaml" />

View File

@@ -0,0 +1,9 @@
namespace Aaru.Gui.Models
{
public class ScsiPageModel
{
public byte[] Data;
public string Page { get; set; }
public string Description { get; set; }
}
}

View File

@@ -114,6 +114,12 @@
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>
</TabItem> </TabItem>
<TabItem IsVisible="{Binding !!ScsiInfo}">
<TabItem.Header>
<TextBlock Text="SCSI" />
</TabItem.Header>
<ContentControl Content="{Binding ScsiInfo}" />
</TabItem>
</TabControl> </TabControl>
<StackPanel Orientation="Horizontal" Spacing="5"> <StackPanel Orientation="Horizontal" Spacing="5">
<Button Command="{Binding EntropyCommand}"> <Button Command="{Binding EntropyCommand}">

View File

@@ -97,6 +97,7 @@ namespace Aaru.Gui.Panels
tabInfos.Pages.Add(tabAtaInfo); tabInfos.Pages.Add(tabAtaInfo);
} }
/*
if(devInfo.ScsiInquiryData != null) if(devInfo.ScsiInquiryData != null)
{ {
var tabScsiInfo = new tabScsiInfo(); var tabScsiInfo = new tabScsiInfo();
@@ -310,6 +311,7 @@ namespace Aaru.Gui.Panels
txtMediumDensity.Text = DensitySupport.PrettifyMediumType(devInfo.MediumDensitySupport); txtMediumDensity.Text = DensitySupport.PrettifyMediumType(devInfo.MediumDensitySupport);
} }
} }
*/
var tabSdMmcInfo = new tabSdMmcInfo(); var tabSdMmcInfo = new tabSdMmcInfo();

View File

@@ -0,0 +1,97 @@
<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:vm="clr-namespace:Aaru.Gui.ViewModels" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Aaru.Gui.Tabs.ScsiInfoTab">
<Design.DataContext>
<vm:ScsiInfoViewModel />
</Design.DataContext>
<TabControl>
<TabItem IsVisible="{Binding !!InquiryData}">
<TabItem.Header>
<TextBlock Text="INQUIRY" />
</TabItem.Header>
<StackPanel>
<TextBlock Text="SCSI INQUIRY" HorizontalAlignment="Center" />
<TextBox Text="{Binding ScsiInquiryText}" IsReadOnly="True" />
<StackPanel Orientation="Horizontal">
<Button Command="{Binding SaveInquiryBinaryCommand}">
<TextBlock Text="Save binary to file" />
</Button>
<Button Command="{Binding SaveInquiryTextCommand}">
<TextBlock Text="Save text to file" />
</Button>
</StackPanel>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding !!ModeSensePages.Count}">
<TabItem.Header>
<TextBlock Text="MODE SENSE" />
</TabItem.Header>
<StackPanel>
<StackPanel Orientation="Horizontal">
<DataGrid HorizontalAlignment="Left" VerticalAlignment="Stretch" Items="{Binding ModeSensePages}"
SelectedItem="{Binding SelectedModeSensePage}" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Page" Binding="{Binding Page}" />
</DataGrid.Columns>
</DataGrid>
<TextBox HorizontalAlignment="Right" VerticalAlignment="Stretch" Text="{Binding ModeSensePageText}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Command="{Binding SaveModeSense6Command}">
<TextBlock Text="Save MODE SENSE (6) response to file" />
</Button>
<Button Command="{Binding SaveModeSense10Command}">
<TextBlock Text="Save MODE SENSE (10) response to file" />
</Button>
</StackPanel>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding !!EvpdPages.Count}">
<TabItem.Header>
<TextBlock Text="EVPD" />
</TabItem.Header>
<StackPanel>
<StackPanel Orientation="Horizontal">
<DataGrid HorizontalAlignment="Left" VerticalAlignment="Stretch" Items="{Binding EvpdPages}"
SelectedItem="{Binding SelectedEvpdPage}" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Page" Binding="{Binding Page}" />
</DataGrid.Columns>
</DataGrid>
<TextBox HorizontalAlignment="Right" VerticalAlignment="Stretch" Text="{Binding EvpdPageText}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Command="{Binding SaveEvpdPageCommand}">
<TextBlock Text="Save EVPD page to file" />
</Button>
</StackPanel>
</StackPanel>
</TabItem>
<TabItem IsVisible="{Binding !!MmcFeatures.Count}">
<TabItem.Header>
<TextBlock Text="MMC FEATURES" />
</TabItem.Header>
<StackPanel>
<StackPanel Orientation="Horizontal">
<DataGrid HorizontalAlignment="Left" VerticalAlignment="Stretch" Items="{Binding MmcFeatures}"
SelectedItem="{Binding SelectedMmcFeature}" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Feature" Binding="{Binding Page}" />
</DataGrid.Columns>
</DataGrid>
<TextBox HorizontalAlignment="Right" VerticalAlignment="Stretch" Text="{Binding MmcFeatureText}"
IsReadOnly="True" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Command="{Binding SaveMmcFeaturesCommand}">
<TextBlock Text="Save MMC GET CONFIGURATION response to file" />
</Button>
</StackPanel>
</StackPanel>
</TabItem>
</TabControl>
</UserControl>

View File

@@ -0,0 +1,12 @@
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Aaru.Gui.Tabs
{
public class ScsiInfoTab : UserControl
{
public ScsiInfoTab() => InitializeComponent();
void InitializeComponent() => AvaloniaXamlLoader.Load(this);
}
}

View File

@@ -1,117 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!--
// /***************************************************************************
// The Disc Image Chef
// ============================================================================
//
// Filename : tabScsiInfo.xeto
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Device information.
//
// ==[ Description ] ==========================================================
//
// Defines the structure for the SCSI device information.
//
// ==[ 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-2020 Natalia Portillo
// ****************************************************************************/
-->
<TabPage Text="SCSI" Visible="False" xmlns="http://schema.picoe.ca/eto.forms"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TabControl>
<TabPage ID="tabScsiInquiry" Text="INQUIRY">
<StackLayout Orientation="Vertical">
<StackLayoutItem HorizontalAlignment="Center">
<Label ID="lblScsiInquiry" Text="SCSI INQUIRY"/>
</StackLayoutItem>
<StackLayoutItem HorizontalAlignment="Stretch" Expand="True">
<TextArea ID="txtScsiInquiry" ReadOnly="True"/>
</StackLayoutItem>
<StackLayoutItem HorizontalAlignment="Right" VerticalAlignment="Bottom">
<StackLayout Orientation="Horizontal">
<Button ID="btnSaveInquiryBinary" Text="Save binary to file" Click="OnBtnSaveInquiryBinary"/>
<Button ID="btnSaveInquiryText" Text="Save text to file" Click="OnBtnSaveInquiryText"/>
</StackLayout>
</StackLayoutItem>
</StackLayout>
</TabPage>
<TabPage ID="tabScsiModeSense" Text="MODE SENSE" Visible="False">
<StackLayout Orientation="Vertical">
<StackLayoutItem HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Expand="True">
<StackLayout Orientation="Horizontal">
<StackLayoutItem HorizontalAlignment="Left" VerticalAlignment="Stretch" Expand="True">
<TreeGridView ID="treeModeSensePages"
SelectedItemChanged="OnTreeModePagesSelectedItemChanged"/>
</StackLayoutItem>
<StackLayoutItem HorizontalAlignment="Right" VerticalAlignment="Stretch" Expand="True">
<TextArea ID="txtModeSensePage" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
</StackLayoutItem>
<StackLayoutItem HorizontalAlignment="Right" VerticalAlignment="Bottom">
<StackLayout Orientation="Horizontal">
<Button ID="btnSaveMode6" Text="Save MODE SENSE (6) response to file" Click="OnBtnSaveMode6"
Visible="False"/>
<Button ID="btnSaveMode10" Text="Save MODE SENSE (10) response to file" Click="OnBtnSaveMode10"
Visible="False"/>
</StackLayout>
</StackLayoutItem>
</StackLayout>
</TabPage>
<TabPage ID="tabScsiEvpd" Text="EVPD" Visible="False">
<StackLayout Orientation="Vertical">
<StackLayoutItem HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Expand="True">
<StackLayout Orientation="Horizontal">
<StackLayoutItem HorizontalAlignment="Left" VerticalAlignment="Stretch" Expand="True">
<TreeGridView ID="treeEvpdPages" SelectedItemChanged="OnTreeEvpdPagesSelectedItemChanged"/>
</StackLayoutItem>
<StackLayoutItem HorizontalAlignment="Right" VerticalAlignment="Stretch" Expand="True">
<TextArea ID="txtEvpdPage" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
</StackLayoutItem>
<StackLayoutItem HorizontalAlignment="Right" VerticalAlignment="Bottom">
<StackLayout Orientation="Horizontal">
<Button ID="btnSaveEvpd" Text="Save EVPD page to file" Click="OnBtnSaveEvpd"/>
</StackLayout>
</StackLayoutItem>
</StackLayout>
</TabPage>
<TabPage ID="tabMmcFeatures" Text="Features" Visible="False">
<StackLayout Orientation="Vertical">
<StackLayoutItem HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Expand="True">
<StackLayout Orientation="Horizontal">
<StackLayoutItem HorizontalAlignment="Left" VerticalAlignment="Stretch" Expand="True">
<TreeGridView ID="treeMmcFeatures"
SelectedItemChanged="OnTreeMmcFeaturesSelectedItemChanged"/>
</StackLayoutItem>
<StackLayoutItem HorizontalAlignment="Right" VerticalAlignment="Stretch" Expand="True">
<TextArea ID="txtMmcFeature" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
</StackLayoutItem>
<StackLayoutItem HorizontalAlignment="Right" VerticalAlignment="Bottom">
<StackLayout Orientation="Horizontal">
<Button ID="btnSaveMmcFeatures" Text="Save MMC GET CONFIGURATION response to file"
Click="OnBtnSaveMmcFeatures"/>
</StackLayout>
</StackLayoutItem>
</StackLayout>
</TabPage>
</TabControl>
</TabPage>

View File

@@ -5,27 +5,34 @@ using System.Reactive;
using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Structs; using Aaru.CommonTypes.Structs;
using Aaru.CommonTypes.Structs.Devices.SCSI;
using Aaru.Decoders.SCSI;
using Aaru.Gui.Models; using Aaru.Gui.Models;
using Aaru.Gui.Tabs;
using Avalonia; using Avalonia;
using Avalonia.Controls;
using Avalonia.Media.Imaging; using Avalonia.Media.Imaging;
using Avalonia.Platform; using Avalonia.Platform;
using ReactiveUI; using ReactiveUI;
using Schemas; using Schemas;
using Inquiry = Aaru.CommonTypes.Structs.Devices.SCSI.Inquiry;
namespace Aaru.Gui.ViewModels namespace Aaru.Gui.ViewModels
{ {
public class ImageInfoViewModel public class ImageInfoViewModel : ViewModelBase
{ {
readonly IMediaImage _imageFormat; readonly IMediaImage _imageFormat;
IFilter _filter; IFilter _filter;
string _imagePath; string _imagePath;
readonly Window _view;
public ImageInfoViewModel(string imagePath, IFilter filter, IMediaImage imageFormat) public ImageInfoViewModel(string imagePath, IFilter filter, IMediaImage imageFormat, Window view)
{ {
_imagePath = imagePath; _imagePath = imagePath;
_filter = filter; _filter = filter;
_imageFormat = imageFormat; _imageFormat = imageFormat;
_view = view;
IAssetLoader assets = AvaloniaLocator.Current.GetService<IAssetLoader>(); IAssetLoader assets = AvaloniaLocator.Current.GetService<IAssetLoader>();
MediaTagsList = new ObservableCollection<string>(); MediaTagsList = new ObservableCollection<string>();
SectorTagsList = new ObservableCollection<string>(); SectorTagsList = new ObservableCollection<string>();
@@ -145,7 +152,6 @@ namespace Aaru.Gui.ViewModels
foreach(SectorTagType tag in imageFormat.Info.ReadableSectorTags.OrderBy(t => t)) foreach(SectorTagType tag in imageFormat.Info.ReadableSectorTags.OrderBy(t => t))
SectorTagsList.Add(tag.ToString()); SectorTagsList.Add(tag.ToString());
/* TODO: tabScsiInfo
PeripheralDeviceTypes scsiDeviceType = PeripheralDeviceTypes.DirectAccess; PeripheralDeviceTypes scsiDeviceType = PeripheralDeviceTypes.DirectAccess;
byte[] scsiInquiryData = null; byte[] scsiInquiryData = null;
Inquiry? scsiInquiry = null; Inquiry? scsiInquiry = null;
@@ -177,13 +183,11 @@ namespace Aaru.Gui.ViewModels
scsiMode = Modes.DecodeMode10(scsiModeSense10, scsiDeviceType); scsiMode = Modes.DecodeMode10(scsiModeSense10, scsiDeviceType);
} }
var tabScsiInfo = new tabScsiInfo(); ScsiInfo = new ScsiInfoTab
{
tabScsiInfo.LoadData(scsiInquiryData, scsiInquiry, null, scsiMode, scsiDeviceType, scsiModeSense6, DataContext = new ScsiInfoViewModel(scsiInquiryData, scsiInquiry, null, scsiMode, scsiDeviceType,
scsiModeSense10, null); scsiModeSense6, scsiModeSense10, null, _view)
};
tabInfos.Pages.Add(tabScsiInfo);
*/
/* TODO: tabAtaInfo /* TODO: tabAtaInfo
byte[] ataIdentify = null; byte[] ataIdentify = null;
@@ -644,6 +648,8 @@ namespace Aaru.Gui.ViewModels
} }
} }
public ScsiInfoTab ScsiInfo { get; }
public Bitmap MediaLogo { get; } public Bitmap MediaLogo { get; }
public string ImagePathText { get; } public string ImagePathText { get; }
public string FilterText { get; } public string FilterText { get; }

View File

@@ -268,7 +268,7 @@ namespace Aaru.Gui.ViewModels
? _genericOpticalIcon ? _genericOpticalIcon
: _genericFolderIcon, : _genericFolderIcon,
FileName = Path.GetFileName(result[0]), Image = imageFormat, FileName = Path.GetFileName(result[0]), Image = imageFormat,
ViewModel = new ImageInfoViewModel(result[0], inputFilter, imageFormat) ViewModel = new ImageInfoViewModel(result[0], inputFilter, imageFormat, _view)
}; };
// TODO: pnlImageInfo // TODO: pnlImageInfo

View File

@@ -1,107 +1,65 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : tabScsiInfo.xeto.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Device information.
//
// --[ Description ] ----------------------------------------------------------
//
// Implements the SCSI device information.
//
// --[ 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-2020 Natalia Portillo
// ****************************************************************************/
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reactive;
using Aaru.CommonTypes.Structs.Devices.SCSI; using Aaru.CommonTypes.Structs.Devices.SCSI;
using Aaru.Console; using Aaru.Console;
using Aaru.Decoders.SCSI; using Aaru.Decoders.SCSI;
using Aaru.Decoders.SCSI.MMC; using Aaru.Decoders.SCSI.MMC;
using Eto.Forms; using Aaru.Gui.Models;
using Eto.Serialization.Xaml; using Avalonia.Controls;
using ReactiveUI;
using Inquiry = Aaru.CommonTypes.Structs.Devices.SCSI.Inquiry; using Inquiry = Aaru.CommonTypes.Structs.Devices.SCSI.Inquiry;
namespace Aaru.Gui.Tabs namespace Aaru.Gui.ViewModels
{ {
public class tabScsiInfo : TabPage public class ScsiInfoViewModel : ViewModelBase
{ {
byte[] configuration; readonly byte[] _configuration;
Dictionary<byte, byte[]> evpdPages; readonly byte[] _scsiModeSense10;
Inquiry? inquiry; readonly byte[] _scsiModeSense6;
byte[] inquiryData; string _evpdPageText;
Modes.DecodedMode? mode; string _mmcFeatureText;
byte[] modeSense10; string _scsiModeSensePageText;
byte[] modeSense6; object _selectedEvpdPage;
PeripheralDeviceTypes type; object _selectedMmcFeature;
object _selectedModeSensePage;
Window _view;
public tabScsiInfo() => XamlReader.Load(this); public ScsiInfoViewModel(byte[] scsiInquiryData, Inquiry? scsiInquiry, Dictionary<byte, byte[]> scsiEvpdPages,
Modes.DecodedMode? scsiMode, PeripheralDeviceTypes scsiType, byte[] scsiModeSense6,
internal void LoadData(byte[] scsiInquiryData, Inquiry? scsiInquiry, Dictionary<byte, byte[]> scsiEvpdPages, byte[] scsiModeSense10, byte[] mmcConfiguration, Window view)
Modes.DecodedMode? scsiMode, PeripheralDeviceTypes scsiType, byte[] scsiModeSense6,
byte[] scsiModeSense10, byte[] mmcConfiguration)
{ {
inquiryData = scsiInquiryData; InquiryData = scsiInquiryData;
inquiry = scsiInquiry; _scsiModeSense6 = scsiModeSense6;
evpdPages = scsiEvpdPages; _scsiModeSense10 = scsiModeSense10;
mode = scsiMode; _configuration = mmcConfiguration;
type = scsiType; ModeSensePages = new ObservableCollection<ScsiPageModel>();
modeSense6 = scsiModeSense6; EvpdPages = new ObservableCollection<ScsiPageModel>();
modeSense10 = scsiModeSense10; MmcFeatures = new ObservableCollection<ScsiPageModel>();
configuration = mmcConfiguration; SaveInquiryBinaryCommand = ReactiveCommand.Create(ExecuteSaveInquiryBinaryCommand);
SaveInquiryTextCommand = ReactiveCommand.Create(ExecuteSaveInquiryTextCommand);
SaveModeSense6Command = ReactiveCommand.Create(ExecuteSaveModeSense6Command);
SaveModeSense10Command = ReactiveCommand.Create(ExecuteSaveModeSense10Command);
SaveEvpdPageCommand = ReactiveCommand.Create(ExecuteSaveEvpdPageCommand);
SaveMmcFeaturesCommand = ReactiveCommand.Create(ExecuteSaveMmcFeaturesCommand);
if(inquiryData == null || if(InquiryData == null ||
!inquiry.HasValue) !scsiInquiry.HasValue)
return; return;
Visible = true; ScsiInquiryText = Decoders.SCSI.Inquiry.Prettify(scsiInquiry);
txtScsiInquiry.Text = Decoders.SCSI.Inquiry.Prettify(inquiry);
if(mode.HasValue) if(scsiMode.HasValue)
{ {
tabScsiModeSense.Visible = true; ModeSensePages.Add(new ScsiPageModel
var modePagesList = new TreeGridItemCollection();
treeModeSensePages.Columns.Add(new GridColumn
{ {
HeaderText = "Page", DataCell = new TextBoxCell(0) Page = "Header", Description = Modes.PrettifyModeHeader(scsiMode.Value.Header, scsiType)
}); });
treeModeSensePages.AllowMultipleSelection = false; if(scsiMode.Value.Pages != null)
treeModeSensePages.ShowHeader = false; foreach(Modes.ModePage page in scsiMode.Value.Pages.OrderBy(t => t.Page).ThenBy(t => t.Subpage))
treeModeSensePages.DataStore = modePagesList;
modePagesList.Add(new TreeGridItem
{
Values = new object[]
{
"Header", Modes.PrettifyModeHeader(mode.Value.Header, type)
}
});
if(mode.Value.Pages != null)
foreach(Modes.ModePage page in mode.Value.Pages.OrderBy(t => t.Page).ThenBy(t => t.Subpage))
{ {
string pageNumberText = page.Subpage == 0 ? $"MODE {page.Page:X2}h" string pageNumberText = page.Subpage == 0 ? $"MODE {page.Page:X2}h"
: $"MODE {page.Page:X2} Subpage {page.Subpage:X2}"; : $"MODE {page.Page:X2} Subpage {page.Subpage:X2}";
@@ -112,7 +70,7 @@ namespace Aaru.Gui.Tabs
{ {
case 0x00: case 0x00:
{ {
if(type == PeripheralDeviceTypes.MultiMediaDevice && if(scsiType == PeripheralDeviceTypes.MultiMediaDevice &&
page.Subpage == 0) page.Subpage == 0)
decodedText = Modes.PrettifyModePage_00_SFF(page.PageResponse); decodedText = Modes.PrettifyModePage_00_SFF(page.PageResponse);
else else
@@ -123,7 +81,7 @@ namespace Aaru.Gui.Tabs
case 0x01: case 0x01:
{ {
if(page.Subpage == 0) if(page.Subpage == 0)
decodedText = type == PeripheralDeviceTypes.MultiMediaDevice decodedText = scsiType == PeripheralDeviceTypes.MultiMediaDevice
? Modes.PrettifyModePage_01_MMC(page.PageResponse) ? Modes.PrettifyModePage_01_MMC(page.PageResponse)
: Modes.PrettifyModePage_01(page.PageResponse); : Modes.PrettifyModePage_01(page.PageResponse);
else else
@@ -179,7 +137,7 @@ namespace Aaru.Gui.Tabs
case 0x07: case 0x07:
{ {
if(page.Subpage == 0) if(page.Subpage == 0)
decodedText = type == PeripheralDeviceTypes.MultiMediaDevice decodedText = scsiType == PeripheralDeviceTypes.MultiMediaDevice
? Modes.PrettifyModePage_07_MMC(page.PageResponse) ? Modes.PrettifyModePage_07_MMC(page.PageResponse)
: Modes.PrettifyModePage_07(page.PageResponse); : Modes.PrettifyModePage_07(page.PageResponse);
else else
@@ -246,7 +204,7 @@ namespace Aaru.Gui.Tabs
case 0x10: case 0x10:
{ {
if(page.Subpage == 0) if(page.Subpage == 0)
decodedText = type == PeripheralDeviceTypes.SequentialAccess decodedText = scsiType == PeripheralDeviceTypes.SequentialAccess
? Modes.PrettifyModePage_10_SSC(page.PageResponse) ? Modes.PrettifyModePage_10_SSC(page.PageResponse)
: Modes.PrettifyModePage_10(page.PageResponse); : Modes.PrettifyModePage_10(page.PageResponse);
else else
@@ -297,7 +255,7 @@ namespace Aaru.Gui.Tabs
case 0x1C: case 0x1C:
{ {
if(page.Subpage == 0) if(page.Subpage == 0)
decodedText = type == PeripheralDeviceTypes.MultiMediaDevice decodedText = scsiType == PeripheralDeviceTypes.MultiMediaDevice
? Modes.PrettifyModePage_1C_SFF(page.PageResponse) ? Modes.PrettifyModePage_1C_SFF(page.PageResponse)
: Modes.PrettifyModePage_1C(page.PageResponse); : Modes.PrettifyModePage_1C(page.PageResponse);
else if(page.Subpage == 1) else if(page.Subpage == 1)
@@ -318,7 +276,7 @@ namespace Aaru.Gui.Tabs
} }
case 0x21: case 0x21:
{ {
if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "CERTANCE") if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "CERTANCE")
decodedText = Modes.PrettifyCertanceModePage_21(page.PageResponse); decodedText = Modes.PrettifyCertanceModePage_21(page.PageResponse);
else else
goto default; goto default;
@@ -327,7 +285,7 @@ namespace Aaru.Gui.Tabs
} }
case 0x22: case 0x22:
{ {
if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "CERTANCE") if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "CERTANCE")
decodedText = Modes.PrettifyCertanceModePage_22(page.PageResponse); decodedText = Modes.PrettifyCertanceModePage_22(page.PageResponse);
else else
goto default; goto default;
@@ -336,7 +294,7 @@ namespace Aaru.Gui.Tabs
} }
case 0x24: case 0x24:
{ {
if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "IBM")
decodedText = Modes.PrettifyIBMModePage_24(page.PageResponse); decodedText = Modes.PrettifyIBMModePage_24(page.PageResponse);
else else
goto default; goto default;
@@ -354,7 +312,7 @@ namespace Aaru.Gui.Tabs
} }
case 0x2F: case 0x2F:
{ {
if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "IBM")
decodedText = Modes.PrettifyIBMModePage_2F(page.PageResponse); decodedText = Modes.PrettifyIBMModePage_2F(page.PageResponse);
else else
goto default; goto default;
@@ -372,7 +330,7 @@ namespace Aaru.Gui.Tabs
} }
case 0x3B: case 0x3B:
{ {
if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "HP")
decodedText = Modes.PrettifyHPModePage_3B(page.PageResponse); decodedText = Modes.PrettifyHPModePage_3B(page.PageResponse);
else else
goto default; goto default;
@@ -381,7 +339,7 @@ namespace Aaru.Gui.Tabs
} }
case 0x3C: case 0x3C:
{ {
if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "HP")
decodedText = Modes.PrettifyHPModePage_3C(page.PageResponse); decodedText = Modes.PrettifyHPModePage_3C(page.PageResponse);
else else
goto default; goto default;
@@ -390,9 +348,9 @@ namespace Aaru.Gui.Tabs
} }
case 0x3D: case 0x3D:
{ {
if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "IBM") if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "IBM")
decodedText = Modes.PrettifyIBMModePage_3D(page.PageResponse); decodedText = Modes.PrettifyIBMModePage_3D(page.PageResponse);
else if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") else if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "HP")
decodedText = Modes.PrettifyHPModePage_3D(page.PageResponse); decodedText = Modes.PrettifyHPModePage_3D(page.PageResponse);
else else
goto default; goto default;
@@ -401,9 +359,9 @@ namespace Aaru.Gui.Tabs
} }
case 0x3E: case 0x3E:
{ {
if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "FUJITSU") if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "FUJITSU")
decodedText = Modes.PrettifyFujitsuModePage_3E(page.PageResponse); decodedText = Modes.PrettifyFujitsuModePage_3E(page.PageResponse);
else if(StringHandlers.CToString(inquiry?.VendorIdentification).Trim() == "HP") else if(StringHandlers.CToString(scsiInquiry?.VendorIdentification).Trim() == "HP")
decodedText = Modes.PrettifyHPModePage_3E(page.PageResponse); decodedText = Modes.PrettifyHPModePage_3E(page.PageResponse);
else else
goto default; goto default;
@@ -422,33 +380,16 @@ namespace Aaru.Gui.Tabs
if(decodedText == null) if(decodedText == null)
decodedText = "Error decoding page, please open an issue."; decodedText = "Error decoding page, please open an issue.";
modePagesList.Add(new TreeGridItem ModeSensePages.Add(new ScsiPageModel
{ {
Values = new object[] Page = pageNumberText, Description = decodedText
{
pageNumberText, decodedText
}
}); });
} }
} }
if(evpdPages != null) if(scsiEvpdPages != null)
{ {
tabScsiEvpd.Visible = true; foreach(KeyValuePair<byte, byte[]> page in scsiEvpdPages.OrderBy(t => t.Key))
treeEvpdPages.ShowHeader = false;
var evpdPagesList = new TreeGridItemCollection();
treeEvpdPages.Columns.Add(new GridColumn
{
HeaderText = "Page", DataCell = new TextBoxCell(0)
});
treeEvpdPages.AllowMultipleSelection = false;
treeEvpdPages.ShowHeader = false;
treeEvpdPages.DataStore = evpdPagesList;
foreach(KeyValuePair<byte, byte[]> page in evpdPages.OrderBy(t => t.Key))
{ {
string evpdPageTitle = ""; string evpdPageTitle = "";
string evpdDecodedPage = ""; string evpdDecodedPage = "";
@@ -525,44 +466,44 @@ namespace Aaru.Gui.Tabs
evpdDecodedPage = EVPD.DecodePageB4(page.Value); evpdDecodedPage = EVPD.DecodePageB4(page.Value);
} }
else if(page.Key == 0xC0 && else if(page.Key == 0xC0 &&
StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
"quantum") Trim() == "quantum")
{ {
evpdPageTitle = "Quantum Firmware Build Information page"; evpdPageTitle = "Quantum Firmware Build Information page";
evpdDecodedPage = EVPD.PrettifyPage_C0_Quantum(page.Value); evpdDecodedPage = EVPD.PrettifyPage_C0_Quantum(page.Value);
} }
else if(page.Key == 0xC0 && else if(page.Key == 0xC0 &&
StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
"seagate") Trim() == "seagate")
{ {
evpdPageTitle = "Seagate Firmware Numbers page"; evpdPageTitle = "Seagate Firmware Numbers page";
evpdDecodedPage = EVPD.PrettifyPage_C0_Seagate(page.Value); evpdDecodedPage = EVPD.PrettifyPage_C0_Seagate(page.Value);
} }
else if(page.Key == 0xC0 && else if(page.Key == 0xC0 &&
StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
"ibm") Trim() == "ibm")
{ {
evpdPageTitle = "IBM Drive Component Revision Levels page"; evpdPageTitle = "IBM Drive Component Revision Levels page";
evpdDecodedPage = EVPD.PrettifyPage_C0_IBM(page.Value); evpdDecodedPage = EVPD.PrettifyPage_C0_IBM(page.Value);
} }
else if(page.Key == 0xC1 && else if(page.Key == 0xC1 &&
StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
"ibm") Trim() == "ibm")
{ {
evpdPageTitle = "IBM Drive Serial Numbers page"; evpdPageTitle = "IBM Drive Serial Numbers page";
evpdDecodedPage = EVPD.PrettifyPage_C1_IBM(page.Value); evpdDecodedPage = EVPD.PrettifyPage_C1_IBM(page.Value);
} }
else if((page.Key == 0xC0 || page.Key == 0xC1) && else if((page.Key == 0xC0 || page.Key == 0xC1) &&
StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
"certance") Trim() == "certance")
{ {
evpdPageTitle = "Certance Drive Component Revision Levels page"; evpdPageTitle = "Certance Drive Component Revision Levels page";
evpdDecodedPage = EVPD.PrettifyPage_C0_C1_Certance(page.Value); evpdDecodedPage = EVPD.PrettifyPage_C0_C1_Certance(page.Value);
} }
else if((page.Key == 0xC2 || page.Key == 0xC3 || page.Key == 0xC4 || page.Key == 0xC5 || else if((page.Key == 0xC2 || page.Key == 0xC3 || page.Key == 0xC4 || page.Key == 0xC5 ||
page.Key == 0xC6) && page.Key == 0xC6) &&
StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
"certance") Trim() == "certance")
{ {
switch(page.Key) switch(page.Key)
{ {
@@ -592,8 +533,8 @@ namespace Aaru.Gui.Tabs
} }
else if((page.Key == 0xC0 || page.Key == 0xC1 || page.Key == 0xC2 || page.Key == 0xC3 || else if((page.Key == 0xC0 || page.Key == 0xC1 || page.Key == 0xC2 || page.Key == 0xC3 ||
page.Key == 0xC4 || page.Key == 0xC5) && page.Key == 0xC4 || page.Key == 0xC5) &&
StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
"hp") Trim() == "hp")
{ {
switch(page.Key) switch(page.Key)
{ {
@@ -626,8 +567,8 @@ namespace Aaru.Gui.Tabs
evpdDecodedPage = EVPD.PrettifyPage_C0_to_C5_HP(page.Value); evpdDecodedPage = EVPD.PrettifyPage_C0_to_C5_HP(page.Value);
} }
else if(page.Key == 0xDF && else if(page.Key == 0xDF &&
StringHandlers.CToString(inquiry.Value.VendorIdentification).ToLowerInvariant().Trim() == StringHandlers.CToString(scsiInquiry.Value.VendorIdentification).ToLowerInvariant().
"certance") Trim() == "certance")
{ {
evpdPageTitle = "Certance drive status page"; evpdPageTitle = "Certance drive status page";
evpdDecodedPage = EVPD.PrettifyPage_DF_Certance(page.Value); evpdDecodedPage = EVPD.PrettifyPage_DF_Certance(page.Value);
@@ -644,32 +585,16 @@ namespace Aaru.Gui.Tabs
page.Key); page.Key);
} }
evpdPagesList.Add(new TreeGridItem EvpdPages.Add(new ScsiPageModel
{ {
Values = new object[] Page = evpdPageTitle, Data = page.Value, Description = evpdDecodedPage
{
evpdPageTitle, evpdDecodedPage, page.Value
}
}); });
} }
} }
if(configuration != null) if(_configuration != null)
{ {
tabMmcFeatures.Visible = true; Features.SeparatedFeatures ftr = Features.Separate(_configuration);
var featuresList = new TreeGridItemCollection();
treeMmcFeatures.Columns.Add(new GridColumn
{
HeaderText = "Feature", DataCell = new TextBoxCell(0)
});
treeMmcFeatures.AllowMultipleSelection = false;
treeMmcFeatures.ShowHeader = false;
treeMmcFeatures.DataStore = featuresList;
Features.SeparatedFeatures ftr = Features.Separate(configuration);
AaruConsole.DebugWriteLine("Device-Info command", "GET CONFIGURATION length is {0} bytes", AaruConsole.DebugWriteLine("Device-Info command", "GET CONFIGURATION length is {0} bytes",
ftr.DataLength); ftr.DataLength);
@@ -924,219 +849,237 @@ namespace Aaru.Gui.Tabs
break; break;
} }
featuresList.Add(new TreeGridItem MmcFeatures.Add(new ScsiPageModel
{ {
Values = new object[] Page = featureNumber, Description = featureDescription
{
featureNumber, featureDescription
}
}); });
} }
else else
AaruConsole.DebugWriteLine("Device-Info command", AaruConsole.DebugWriteLine("Device-Info command",
"GET CONFIGURATION returned no feature descriptors"); "GET CONFIGURATION returned no feature descriptors");
} }
Invalidate();
} }
protected void OnBtnSaveInquiryBinary(object sender, EventArgs e) public byte[] InquiryData { get; }
public string ScsiInquiryText { get; }
public ObservableCollection<ScsiPageModel> ModeSensePages { get; }
public ObservableCollection<ScsiPageModel> EvpdPages { get; }
public ObservableCollection<ScsiPageModel> MmcFeatures { get; }
public ReactiveCommand<Unit, Unit> SaveInquiryBinaryCommand { get; }
public ReactiveCommand<Unit, Unit> SaveInquiryTextCommand { get; }
public ReactiveCommand<Unit, Unit> SaveModeSense6Command { get; }
public ReactiveCommand<Unit, Unit> SaveModeSense10Command { get; }
public ReactiveCommand<Unit, Unit> SaveEvpdPageCommand { get; }
public ReactiveCommand<Unit, Unit> SaveMmcFeaturesCommand { get; }
public object SelectedModeSensePage
{
get => _selectedModeSensePage;
set
{
if(value == _selectedModeSensePage)
return;
if(value is ScsiPageModel pageModel)
ModeSensePageText = pageModel.Description;
this.RaiseAndSetIfChanged(ref _selectedModeSensePage, value);
}
}
public string ModeSensePageText
{
get => _scsiModeSensePageText;
set => this.RaiseAndSetIfChanged(ref _scsiModeSensePageText, value);
}
public object SelectedEvpdPage
{
get => _selectedEvpdPage;
set
{
if(value == _selectedEvpdPage)
return;
if(value is ScsiPageModel pageModel)
EvpdPageText = pageModel.Description;
this.RaiseAndSetIfChanged(ref _selectedEvpdPage, value);
}
}
public string EvpdPageText
{
get => _evpdPageText;
set => this.RaiseAndSetIfChanged(ref _evpdPageText, value);
}
public object SelectedMmcFeature
{
get => _selectedMmcFeature;
set
{
if(value == _selectedMmcFeature)
return;
if(value is ScsiPageModel pageModel)
MmcFeatureText = pageModel.Description;
this.RaiseAndSetIfChanged(ref _selectedMmcFeature, value);
}
}
public string MmcFeatureText
{
get => _mmcFeatureText;
set => this.RaiseAndSetIfChanged(ref _mmcFeatureText, value);
}
protected async void ExecuteSaveInquiryBinaryCommand()
{ {
var dlgSaveBinary = new SaveFileDialog(); var dlgSaveBinary = new SaveFileDialog();
dlgSaveBinary.Filters.Add(new FileFilter dlgSaveBinary.Filters.Add(new FileDialogFilter
{ {
Extensions = new[] Extensions = new List<string>(new[]
{ {
"*.bin" "*.bin"
}, }),
Name = "Binary" Name = "Binary"
}); });
DialogResult result = dlgSaveBinary.ShowDialog(this); string result = await dlgSaveBinary.ShowAsync(_view);
if(result != DialogResult.Ok) if(result is null)
return; return;
var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); var saveFs = new FileStream(result, FileMode.Create);
saveFs.Write(inquiryData, 0, inquiryData.Length); saveFs.Write(InquiryData, 0, InquiryData.Length);
saveFs.Close(); saveFs.Close();
} }
protected void OnBtnSaveInquiryText(object sender, EventArgs e) protected async void ExecuteSaveInquiryTextCommand()
{ {
var dlgSaveText = new SaveFileDialog(); var dlgSaveText = new SaveFileDialog();
dlgSaveText.Filters.Add(new FileFilter dlgSaveText.Filters.Add(new FileDialogFilter
{ {
Extensions = new[] Extensions = new List<string>(new[]
{ {
"*.txt" "*.txt"
}, }),
Name = "Text" Name = "Text"
}); });
DialogResult result = dlgSaveText.ShowDialog(this); string result = await dlgSaveText.ShowAsync(_view);
if(result != DialogResult.Ok) if(result is null)
return; return;
var saveFs = new FileStream(dlgSaveText.FileName, FileMode.Create); var saveFs = new FileStream(result, FileMode.Create);
var saveSw = new StreamWriter(saveFs); var saveSw = new StreamWriter(saveFs);
saveSw.Write(txtScsiInquiry.Text); saveSw.Write(ScsiInquiryText);
saveFs.Close(); saveFs.Close();
} }
protected void OnBtnSaveMode6(object sender, EventArgs e) protected async void ExecuteSaveModeSense6Command()
{ {
var dlgSaveBinary = new SaveFileDialog(); var dlgSaveBinary = new SaveFileDialog();
dlgSaveBinary.Filters.Add(new FileFilter dlgSaveBinary.Filters.Add(new FileDialogFilter
{ {
Extensions = new[] Extensions = new List<string>(new[]
{ {
"*.bin" "*.bin"
}, }),
Name = "Binary" Name = "Binary"
}); });
DialogResult result = dlgSaveBinary.ShowDialog(this); string result = await dlgSaveBinary.ShowAsync(_view);
if(result != DialogResult.Ok) if(result is null)
return; return;
var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); var saveFs = new FileStream(result, FileMode.Create);
saveFs.Write(modeSense6, 0, modeSense6.Length); saveFs.Write(_scsiModeSense6, 0, _scsiModeSense6.Length);
saveFs.Close(); saveFs.Close();
} }
protected void OnBtnSaveMode10(object sender, EventArgs e) protected async void ExecuteSaveModeSense10Command()
{ {
var dlgSaveBinary = new SaveFileDialog(); var dlgSaveBinary = new SaveFileDialog();
dlgSaveBinary.Filters.Add(new FileFilter dlgSaveBinary.Filters.Add(new FileDialogFilter
{ {
Extensions = new[] Extensions = new List<string>(new[]
{ {
"*.bin" "*.bin"
}, }),
Name = "Binary" Name = "Binary"
}); });
DialogResult result = dlgSaveBinary.ShowDialog(this); string result = await dlgSaveBinary.ShowAsync(_view);
if(result != DialogResult.Ok) if(result is null)
return; return;
var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); var saveFs = new FileStream(result, FileMode.Create);
saveFs.Write(modeSense10, 0, modeSense10.Length); saveFs.Write(_scsiModeSense10, 0, _scsiModeSense10.Length);
saveFs.Close(); saveFs.Close();
} }
protected void OnTreeModePagesSelectedItemChanged(object sender, EventArgs e) protected async void ExecuteSaveEvpdPageCommand()
{ {
if(!(treeModeSensePages.SelectedItem is TreeGridItem item)) if(!(SelectedEvpdPage is ScsiPageModel pageModel))
return;
txtModeSensePage.Text = item.Values[1] as string;
}
protected void OnTreeEvpdPagesSelectedItemChanged(object sender, EventArgs e)
{
if(!(treeEvpdPages.SelectedItem is TreeGridItem item))
return;
txtEvpdPage.Text = item.Values[1] as string;
}
protected void OnBtnSaveEvpd(object sender, EventArgs e)
{
if(!(treeModeSensePages.SelectedItem is TreeGridItem item))
return;
if(!(item.Values[2] is byte[] data))
return; return;
var dlgSaveBinary = new SaveFileDialog(); var dlgSaveBinary = new SaveFileDialog();
dlgSaveBinary.Filters.Add(new FileFilter dlgSaveBinary.Filters.Add(new FileDialogFilter
{ {
Extensions = new[] Extensions = new List<string>(new[]
{ {
"*.bin" "*.bin"
}, }),
Name = "Binary" Name = "Binary"
}); });
DialogResult result = dlgSaveBinary.ShowDialog(this); string result = await dlgSaveBinary.ShowAsync(_view);
if(result != DialogResult.Ok) if(result is null)
return; return;
var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); var saveFs = new FileStream(result, FileMode.Create);
saveFs.Write(data, 0, data.Length); saveFs.Write(pageModel.Data, 0, pageModel.Data.Length);
saveFs.Close(); saveFs.Close();
} }
protected void OnTreeMmcFeaturesSelectedItemChanged(object sender, EventArgs e) protected async void ExecuteSaveMmcFeaturesCommand()
{
if(!(treeMmcFeatures.SelectedItem is TreeGridItem item))
return;
txtMmcFeature.Text = item.Values[1] as string;
}
protected void OnBtnSaveMmcFeatures(object sender, EventArgs e)
{ {
var dlgSaveBinary = new SaveFileDialog(); var dlgSaveBinary = new SaveFileDialog();
dlgSaveBinary.Filters.Add(new FileFilter dlgSaveBinary.Filters.Add(new FileDialogFilter
{ {
Extensions = new[] Extensions = new List<string>(new[]
{ {
"*.bin" "*.bin"
}, }),
Name = "Binary" Name = "Binary"
}); });
DialogResult result = dlgSaveBinary.ShowDialog(this); string result = await dlgSaveBinary.ShowAsync(_view);
if(result != DialogResult.Ok) if(result is null)
return; return;
var saveFs = new FileStream(dlgSaveBinary.FileName, FileMode.Create); var saveFs = new FileStream(result, FileMode.Create);
saveFs.Write(configuration, 0, configuration.Length); saveFs.Write(_configuration, 0, _configuration.Length);
saveFs.Close(); saveFs.Close();
} }
#region XAML controls
#pragma warning disable 169
#pragma warning disable 649
TabPage tabScsiInquiry;
Label lblScsiInquiry;
TextArea txtScsiInquiry;
Button btnSaveInquiryBinary;
Button btnSaveInquiryText;
TabPage tabScsiModeSense;
TreeGridView treeModeSensePages;
TextArea txtModeSensePage;
Button btnSaveMode6;
Button btnSaveMode10;
TabPage tabScsiEvpd;
TreeGridView treeEvpdPages;
TextArea txtEvpdPage;
Button btnSaveEvpd;
TabPage tabMmcFeatures;
TreeGridView treeMmcFeatures;
TextArea txtMmcFeature;
Button btnSaveMmcFeatures;
#pragma warning restore 169
#pragma warning restore 649
#endregion
} }
} }