Migrate media tags decoding window from Eto.Forms to Avalonia.

This commit is contained in:
2020-04-14 17:44:46 +01:00
parent fb8ea8b72d
commit 3b10f60e16
8 changed files with 307 additions and 310 deletions

View File

@@ -1245,6 +1245,7 @@
<e p="IsrcModel.cs" t="Include" />
<e p="LbaModel.cs" t="Include" />
<e p="MediaStatsModel.cs" t="Include" />
<e p="MediaTagModel.cs" t="Include" />
<e p="NameCountModel.cs" t="Include" />
<e p="PartitionModel.cs" t="Include" />
<e p="PartitionSchemeModel.cs" t="Include" />
@@ -1296,6 +1297,7 @@
<e p="BlurayInfoViewModel.cs" t="Include" />
<e p="CompactDiscInfoViewModel.cs" t="Include" />
<e p="ConsoleWindowViewModel.cs" t="Include" />
<e p="DecodeMediaTagsViewModel.cs" t="Include" />
<e p="DvdInfoViewModel.cs" t="Include" />
<e p="DvdWritableInfoViewModel.cs" t="Include" />
<e p="EncodingsDialogViewModel.cs" t="Include" />
@@ -1322,6 +1324,8 @@
<e p="AboutDialog.xaml.cs" t="Include" />
<e p="ConsoleDialog.xaml" t="Include" />
<e p="ConsoleDialog.xaml.cs" t="Include" />
<e p="DecodeMediaTagsWindow.xaml" t="Include" />
<e p="DecodeMediaTagsWindow.xaml.cs" t="Include" />
<e p="EncodingsDialog.xaml" t="Include" />
<e p="EncodingsDialog.xaml.cs" t="Include" />
<e p="ImageChecksumWindow.xaml" t="Include" />

View File

@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!--
// /***************************************************************************
// The Disc Image Chef
// ============================================================================
//
// Filename : frmDecodeMediaTags.xeto
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Form to decode media tags of images.
//
// ==[ Description ] ==========================================================
//
// Defines the structure for the decode media tags GUI window.
//
// ==[ 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
// ****************************************************************************/
-->
<Form xmlns="http://schema.picoe.ca/eto.forms" Title="Decode media tags" ClientSize="600, 450" Padding="10">
<StackLayout Orientation="Vertical" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<StackLayout Orientation="Horizontal" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<Label Text="Tag:" ID="lblTag"/>
<ComboBox ID="cmbTag" ReadOnly="True" SelectedIndexChanged="OnCmbTagSelectedIndexChanged"/>
</StackLayout>
<StackLayoutItem Expand="True">
<TabControl>
<TabPage Text="HexView" ID="tabPrintHex">
<TextArea ID="txtPrintHex"/>
</TabPage>
<TabPage Text="Decoded" ID="tabDecoded">
<TextArea ID="txtDecoded"/>
</TabPage>
</TabControl>
</StackLayoutItem>
</StackLayout>
</Form>

View File

@@ -1,241 +0,0 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : frmDecodeMediaTags.xeto.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Form to decode media tags of images.
//
// --[ Description ] ----------------------------------------------------------
//
// Implements media tag decode form.
//
// --[ 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.ObjectModel;
using System.Text;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Structs.Devices.SCSI;
using Aaru.Decoders.ATA;
using Aaru.Decoders.Bluray;
using Aaru.Decoders.CD;
using Aaru.Decoders.DVD;
using Aaru.Decoders.SCSI;
using Aaru.Decoders.SCSI.MMC;
using Aaru.Decoders.Xbox;
using Eto.Forms;
using Eto.Serialization.Xaml;
using BCA = Aaru.Decoders.Bluray.BCA;
using Cartridge = Aaru.Decoders.Bluray.Cartridge;
using DDS = Aaru.Decoders.DVD.DDS;
using DMI = Aaru.Decoders.Xbox.DMI;
using Inquiry = Aaru.Decoders.SCSI.Inquiry;
using Spare = Aaru.Decoders.DVD.Spare;
namespace Aaru.Gui.Forms
{
// TODO: Decode long sector components
// TODO: Panel with string representation of contents
public class frmDecodeMediaTags : Form
{
const int HEX_COLUMNS = 32;
readonly IMediaImage inputFormat;
readonly ObservableCollection<MediaTagWithData> lstTags;
public frmDecodeMediaTags(IMediaImage inputFormat)
{
this.inputFormat = inputFormat;
XamlReader.Load(this);
lstTags = new ObservableCollection<MediaTagWithData>();
cmbTag.ItemTextBinding = Binding.Property((MediaTagWithData p) => p.Tag.ToString());
cmbTag.ItemKeyBinding = Binding.Property((MediaTagWithData p) => p.Tag.ToString());
cmbTag.DataStore = lstTags;
tabDecoded.Visible = false;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
foreach(MediaTagType tag in inputFormat.Info.ReadableMediaTags)
try
{
byte[] data = inputFormat.ReadDiskTag(tag);
lstTags.Add(new MediaTagWithData
{
Tag = tag, Data = data
});
}
catch
{
//ignore
}
}
// TODO: More graphically aware decoders
void OnCmbTagSelectedIndexChanged(object sender, EventArgs e)
{
if(!(cmbTag.SelectedValue is MediaTagWithData tagWithData))
return;
// TODO: Decoders should be able to handle tags with/without length header
txtPrintHex.Text = PrintHex.ByteArrayToHexArrayString(tagWithData.Data, HEX_COLUMNS);
tabDecoded.Visible = true;
switch(tagWithData.Tag)
{
case MediaTagType.CD_TOC:
txtDecoded.Text = TOC.Prettify(tagWithData.Data);
break;
case MediaTagType.CD_SessionInfo:
txtDecoded.Text = Session.Prettify(tagWithData.Data);
break;
case MediaTagType.CD_FullTOC:
txtDecoded.Text = FullTOC.Prettify(tagWithData.Data);
break;
case MediaTagType.CD_PMA:
txtDecoded.Text = PMA.Prettify(tagWithData.Data);
break;
case MediaTagType.CD_ATIP:
txtDecoded.Text = ATIP.Prettify(tagWithData.Data);
break;
case MediaTagType.CD_TEXT:
txtDecoded.Text = CDTextOnLeadIn.Prettify(tagWithData.Data);
break;
case MediaTagType.CD_MCN:
txtDecoded.Text = Encoding.ASCII.GetString(tagWithData.Data);
break;
case MediaTagType.DVD_PFI:
txtDecoded.Text = PFI.Prettify(tagWithData.Data);
break;
case MediaTagType.DVD_CMI:
txtDecoded.Text = CSS_CPRM.PrettifyLeadInCopyright(tagWithData.Data);
break;
case MediaTagType.DVDRAM_DDS:
txtDecoded.Text = DDS.Prettify(tagWithData.Data);
break;
case MediaTagType.DVDRAM_SpareArea:
txtDecoded.Text = Spare.Prettify(tagWithData.Data);
break;
case MediaTagType.DVDR_PFI:
txtDecoded.Text = PFI.Prettify(tagWithData.Data);
break;
case MediaTagType.HDDVD_MediumStatus:
txtDecoded.Text = PFI.Prettify(tagWithData.Data);
break;
case MediaTagType.BD_DI:
txtDecoded.Text = DI.Prettify(tagWithData.Data);
break;
case MediaTagType.BD_BCA:
txtDecoded.Text = BCA.Prettify(tagWithData.Data);
break;
case MediaTagType.BD_DDS:
txtDecoded.Text = Decoders.Bluray.DDS.Prettify(tagWithData.Data);
break;
case MediaTagType.BD_CartridgeStatus:
txtDecoded.Text = Cartridge.Prettify(tagWithData.Data);
break;
case MediaTagType.BD_SpareArea:
txtDecoded.Text = Decoders.Bluray.Spare.Prettify(tagWithData.Data);
break;
case MediaTagType.MMC_WriteProtection:
txtDecoded.Text = WriteProtect.PrettifyWriteProtectionStatus(tagWithData.Data);
break;
case MediaTagType.MMC_DiscInformation:
txtDecoded.Text = DiscInformation.Prettify(tagWithData.Data);
break;
case MediaTagType.SCSI_INQUIRY:
txtDecoded.Text = Inquiry.Prettify(tagWithData.Data);
break;
case MediaTagType.SCSI_MODEPAGE_2A:
txtDecoded.Text = Modes.PrettifyModePage_2A(tagWithData.Data);
break;
case MediaTagType.ATA_IDENTIFY:
case MediaTagType.ATAPI_IDENTIFY:
txtDecoded.Text = Identify.Prettify(tagWithData.Data);
break;
case MediaTagType.Xbox_SecuritySector:
txtDecoded.Text = SS.Prettify(tagWithData.Data);
break;
case MediaTagType.SCSI_MODESENSE_6:
txtDecoded.Text = Modes.PrettifyModeHeader6(tagWithData.Data, PeripheralDeviceTypes.DirectAccess);
break;
case MediaTagType.SCSI_MODESENSE_10:
txtDecoded.Text = Modes.PrettifyModeHeader10(tagWithData.Data, PeripheralDeviceTypes.DirectAccess);
break;
case MediaTagType.Xbox_DMI:
txtDecoded.Text = DMI.IsXbox360(tagWithData.Data) ? DMI.PrettifyXbox360(tagWithData.Data)
: DMI.PrettifyXbox(tagWithData.Data);
break;
default:
tabDecoded.Visible = false;
break;
}
}
class MediaTagWithData
{
public MediaTagType Tag { get; set; }
public byte[] Data { get; set; }
}
#region XAML IDs
Label lblTag;
ComboBox cmbTag;
TabPage tabPrintHex;
TextArea txtPrintHex;
TabPage tabDecoded;
TextArea txtDecoded;
#endregion
}
}

View File

@@ -0,0 +1,12 @@
using Aaru.CommonTypes.Enums;
namespace Aaru.Gui.Models
{
public class MediaTagModel
{
public MediaTagType Tag { get; set; }
public byte[] Data { get; set; }
public string Decoded { get; set; }
public string Name => Tag.ToString();
}
}

View File

@@ -0,0 +1,218 @@
using System.Collections.ObjectModel;
using System.Text;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Structs.Devices.SCSI;
using Aaru.Decoders.ATA;
using Aaru.Decoders.Bluray;
using Aaru.Decoders.CD;
using Aaru.Decoders.DVD;
using Aaru.Decoders.SCSI;
using Aaru.Decoders.SCSI.MMC;
using Aaru.Decoders.Xbox;
using Aaru.Gui.Models;
using ReactiveUI;
using BCA = Aaru.Decoders.Bluray.BCA;
using Cartridge = Aaru.Decoders.DVD.Cartridge;
using DDS = Aaru.Decoders.DVD.DDS;
using DMI = Aaru.Decoders.Xbox.DMI;
using Inquiry = Aaru.Decoders.SCSI.Inquiry;
using Spare = Aaru.Decoders.DVD.Spare;
namespace Aaru.Gui.ViewModels
{
public class DecodeMediaTagsViewModel : ViewModelBase
{
const int HEX_COLUMNS = 32;
string _decodedText;
bool _decodedVisible;
string _hexViewText;
MediaTagModel _selectedTag;
public DecodeMediaTagsViewModel(IMediaImage inputFormat)
{
TagsList = new ObservableCollection<MediaTagModel>();
foreach(MediaTagType tag in inputFormat.Info.ReadableMediaTags)
try
{
byte[] data = inputFormat.ReadDiskTag(tag);
TagsList.Add(new MediaTagModel
{
Tag = tag, Data = data
});
}
catch
{
//ignore
}
}
public string Title { get; }
public ObservableCollection<MediaTagModel> TagsList { get; }
public MediaTagModel SelectedTag
{
get => _selectedTag;
set
{
this.RaiseAndSetIfChanged(ref _selectedTag, value);
if(value is null)
return;
// TODO: Decoders should be able to handle tags with/without length header
HexViewText = PrintHex.ByteArrayToHexArrayString(value.Data, HEX_COLUMNS);
DecodedVisible = true;
if(value.Decoded != null)
{
DecodedText = value.Decoded;
return;
}
switch(value.Tag)
{
case MediaTagType.CD_TOC:
DecodedText = TOC.Prettify(value.Data);
break;
case MediaTagType.CD_SessionInfo:
DecodedText = Session.Prettify(value.Data);
break;
case MediaTagType.CD_FullTOC:
DecodedText = FullTOC.Prettify(value.Data);
break;
case MediaTagType.CD_PMA:
DecodedText = PMA.Prettify(value.Data);
break;
case MediaTagType.CD_ATIP:
DecodedText = ATIP.Prettify(value.Data);
break;
case MediaTagType.CD_TEXT:
DecodedText = CDTextOnLeadIn.Prettify(value.Data);
break;
case MediaTagType.CD_MCN:
DecodedText = Encoding.ASCII.GetString(value.Data);
break;
case MediaTagType.DVD_PFI:
DecodedText = PFI.Prettify(value.Data);
break;
case MediaTagType.DVD_CMI:
DecodedText = CSS_CPRM.PrettifyLeadInCopyright(value.Data);
break;
case MediaTagType.DVDRAM_DDS:
DecodedText = DDS.Prettify(value.Data);
break;
case MediaTagType.DVDRAM_SpareArea:
DecodedText = Spare.Prettify(value.Data);
break;
case MediaTagType.DVDR_PFI:
DecodedText = PFI.Prettify(value.Data);
break;
case MediaTagType.HDDVD_MediumStatus:
DecodedText = PFI.Prettify(value.Data);
break;
case MediaTagType.BD_DI:
DecodedText = DI.Prettify(value.Data);
break;
case MediaTagType.BD_BCA:
DecodedText = BCA.Prettify(value.Data);
break;
case MediaTagType.BD_DDS:
DecodedText = Decoders.Bluray.DDS.Prettify(value.Data);
break;
case MediaTagType.BD_CartridgeStatus:
DecodedText = Cartridge.Prettify(value.Data);
break;
case MediaTagType.BD_SpareArea:
DecodedText = Decoders.Bluray.Spare.Prettify(value.Data);
break;
case MediaTagType.MMC_WriteProtection:
DecodedText = WriteProtect.PrettifyWriteProtectionStatus(value.Data);
break;
case MediaTagType.MMC_DiscInformation:
DecodedText = DiscInformation.Prettify(value.Data);
break;
case MediaTagType.SCSI_INQUIRY:
DecodedText = Inquiry.Prettify(value.Data);
break;
case MediaTagType.SCSI_MODEPAGE_2A:
DecodedText = Modes.PrettifyModePage_2A(value.Data);
break;
case MediaTagType.ATA_IDENTIFY:
case MediaTagType.ATAPI_IDENTIFY:
DecodedText = Identify.Prettify(value.Data);
break;
case MediaTagType.Xbox_SecuritySector:
DecodedText = SS.Prettify(value.Data);
break;
case MediaTagType.SCSI_MODESENSE_6:
DecodedText = Modes.PrettifyModeHeader6(value.Data, PeripheralDeviceTypes.DirectAccess);
break;
case MediaTagType.SCSI_MODESENSE_10:
DecodedText = Modes.PrettifyModeHeader10(value.Data, PeripheralDeviceTypes.DirectAccess);
break;
case MediaTagType.Xbox_DMI:
DecodedText = DMI.IsXbox360(value.Data) ? DMI.PrettifyXbox360(value.Data)
: DMI.PrettifyXbox(value.Data);
break;
default:
DecodedVisible = false;
break;
}
if(DecodedText != null)
value.Decoded = DecodedText;
}
}
public string HexViewText
{
get => _hexViewText;
set => this.RaiseAndSetIfChanged(ref _hexViewText, value);
}
public bool DecodedVisible
{
get => _decodedVisible;
set => this.RaiseAndSetIfChanged(ref _decodedVisible, value);
}
public string DecodedText
{
get => _decodedText;
set => this.RaiseAndSetIfChanged(ref _decodedText, value);
}
}
}

View File

@@ -30,6 +30,7 @@ namespace Aaru.Gui.ViewModels
readonly IMediaImage _imageFormat;
readonly string _imagePath;
readonly Window _view;
DecodeMediaTagsWindow _decodeMediaTagsWindow;
IFilter _filter;
ImageChecksumWindow _imageChecksumWindow;
ImageConvertWindow _imageConvertWindow;
@@ -830,23 +831,22 @@ namespace Aaru.Gui.ViewModels
protected void ExecuteDecodeMediaTagCommand()
{
/* TODO: frmDecodeMediaTags
if(frmDecodeMediaTags != null)
if(_decodeMediaTagsWindow != null)
{
frmDecodeMediaTags.Show();
_decodeMediaTagsWindow.Show();
return;
}
frmDecodeMediaTags = new frmDecodeMediaTags(imageFormat);
frmDecodeMediaTags.Closed += (s, ea) =>
_decodeMediaTagsWindow = new DecodeMediaTagsWindow
{
frmDecodeMediaTags = null;
DataContext = new DecodeMediaTagsViewModel(_imageFormat)
};
frmDecodeMediaTags.Show();
*/
_decodeMediaTagsWindow.Closed += (sender, args) =>
{
_decodeMediaTagsWindow = null;
};
}
}
}

View File

@@ -0,0 +1,36 @@
<Window xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:Aaru.Gui.ViewModels;assembly=Aaru.Gui"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800"
d:DesignHeight="450" Width="480" Height="320" x:Class="Aaru.Gui.Views.DecodeMediaTagsWindow"
Icon="/Assets/aaru-logo.png" CanResize="False" Title="{Binding Title}">
<Design.DataContext>
<vm:DecodeMediaTagsViewModel />
</Design.DataContext>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Tag:" />
<ComboBox Items="{Binding TagsList}" SelectedItem="{Binding SelectedTag}">
<ComboBox.DataTemplates>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.DataTemplates>
</ComboBox>
</StackPanel>
<TabControl>
<TabItem>
<TabItem.Header>
<TextBlock Text="HexView" />
</TabItem.Header>
<TextBox IsReadOnly="True" Text="{Binding HexViewText}" />
</TabItem>
<TabItem IsVisible="{Binding DecodedVisible}">
<TabItem.Header>
<TextBlock Text="Decoded" />
</TabItem.Header>
<TextBox IsReadOnly="True" Text="{Binding DecodedText}" />
</TabItem>
</TabControl>
</StackPanel>
</Window>

View File

@@ -0,0 +1,19 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Aaru.Gui.Views
{
public class DecodeMediaTagsWindow : Window
{
public DecodeMediaTagsWindow()
{
InitializeComponent();
#if DEBUG
this.AttachDevTools();
#endif
}
void InitializeComponent() => AvaloniaXamlLoader.Load(this);
}
}