Implement media tag decoder on GUI.

This commit is contained in:
2018-11-18 23:01:16 +00:00
parent 634ec59925
commit 0777cd79b3
6 changed files with 290 additions and 9 deletions

View File

@@ -1620,6 +1620,8 @@
<e p="Forms" t="Include">
<e p="frmConsole.xeto" t="Include" />
<e p="frmConsole.xeto.cs" t="Include" />
<e p="frmDecodeMediaTags.xeto" t="Include" />
<e p="frmDecodeMediaTags.xeto.cs" t="Include" />
<e p="frmDump.xeto" t="Include" />
<e p="frmDump.xeto.cs" t="Include" />
<e p="frmImageChecksum.xeto" t="Include" />

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?><!--
// /***************************************************************************
// The Disc Image Chef
// ============================================================================
//
// Filename : frmDecodeMediaTags.xeto
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Form to show 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-2018 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

@@ -0,0 +1,206 @@
// /***************************************************************************
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : frmDecodeMediaTags.xeto.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Form to show 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-2018 Natalia Portillo
// ****************************************************************************/
using System;
using System.Collections.ObjectModel;
using System.Text;
using DiscImageChef.CommonTypes.Enums;
using DiscImageChef.CommonTypes.Interfaces;
using DiscImageChef.Decoders.ATA;
using DiscImageChef.Decoders.Bluray;
using DiscImageChef.Decoders.CD;
using DiscImageChef.Decoders.DVD;
using DiscImageChef.Decoders.SCSI;
using DiscImageChef.Decoders.SCSI.MMC;
using DiscImageChef.Decoders.Xbox;
using Eto.Forms;
using Eto.Serialization.Xaml;
using BCA = DiscImageChef.Decoders.Bluray.BCA;
using Cartridge = DiscImageChef.Decoders.Bluray.Cartridge;
using DDS = DiscImageChef.Decoders.DVD.DDS;
using DMI = DiscImageChef.Decoders.Xbox.DMI;
using Spare = DiscImageChef.Decoders.DVD.Spare;
namespace DiscImageChef.Gui.Forms
{
// TODO: Decode long sector components
// TODO: Panel with string representation of contents
public class frmDecodeMediaTags : Form
{
const int HEX_COLUMNS = 32;
IMediaImage inputFormat;
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

@@ -187,6 +187,12 @@ namespace DiscImageChef.Gui.Forms
menuItem = new ButtonMenuItem {Text = "View sectors"};
menuItem.Click += (a, b) => { new frmPrintHex(image).Show(); };
treeImagesMenu.Items.Add(menuItem);
if(!image.Info.ReadableMediaTags.Any()) return;
menuItem = new ButtonMenuItem {Text = "Decode media tags"};
menuItem.Click += (a, b) => { new frmDecodeMediaTags(image).Show(); };
treeImagesMenu.Items.Add(menuItem);
}
}

View File

@@ -119,6 +119,7 @@
<Button ID="btnConvert" Text="Convert to..." Click="OnBtnConvert"/>
<Button ID="btnCreateSidecar" Text="Create CICM XML sidecar..." Click="OnBtnCreateSidecar"/>
<Button ID="btnViewSectors" Text="View sectors" Click="OnBtnViewSectors"/>
<Button ID="btnDecodeMediaTags" Text="Decode media tags" Click="OnBtnDecodeMediaTags"/>
</StackLayout>
</StackLayoutItem>
</StackLayout>

View File

@@ -55,15 +55,16 @@ namespace DiscImageChef.Gui.Panels
{
public class pnlImageInfo : Panel
{
IFilter filter;
frmImageChecksum frmImageChecksum;
frmImageConvert frmImageConvert;
frmImageEntropy frmImageEntropy;
frmImageSidecar frmImageSidecar;
frmImageVerify frmImageVerify;
frmPrintHex frmPrintHex;
IMediaImage imageFormat;
string imagePath;
IFilter filter;
frmDecodeMediaTags frmDecodeMediaTags;
frmImageChecksum frmImageChecksum;
frmImageConvert frmImageConvert;
frmImageEntropy frmImageEntropy;
frmImageSidecar frmImageSidecar;
frmImageVerify frmImageVerify;
frmPrintHex frmPrintHex;
IMediaImage imageFormat;
string imagePath;
public pnlImageInfo(string imagePath, IFilter filter, IMediaImage imageFormat)
{
@@ -873,6 +874,19 @@ namespace DiscImageChef.Gui.Panels
frmPrintHex.Show();
}
protected void OnBtnDecodeMediaTags(object sender, EventArgs e)
{
if(frmDecodeMediaTags != null)
{
frmDecodeMediaTags.Show();
return;
}
frmDecodeMediaTags = new frmDecodeMediaTags(imageFormat);
frmDecodeMediaTags.Closed += (s, ea) => { frmDecodeMediaTags = null; };
frmDecodeMediaTags.Show();
}
#region XAML controls
#pragma warning disable 169
#pragma warning disable 649
@@ -923,6 +937,7 @@ namespace DiscImageChef.Gui.Panels
Button btnChecksum;
Button btnConvert;
Button btnViewSectors;
Button btnDecodeMediaTags;
#pragma warning restore 169
#pragma warning restore 649
#endregion