diff --git a/.idea/.idea.Aaru/.idea/contentModel.xml b/.idea/.idea.Aaru/.idea/contentModel.xml
index 1d3eb4b2c..a33f1e779 100644
--- a/.idea/.idea.Aaru/.idea/contentModel.xml
+++ b/.idea/.idea.Aaru/.idea/contentModel.xml
@@ -1245,6 +1245,7 @@
+
@@ -1296,6 +1297,7 @@
+
@@ -1322,6 +1324,8 @@
+
+
diff --git a/Aaru.Gui/Forms/frmDecodeMediaTags.xeto b/Aaru.Gui/Forms/frmDecodeMediaTags.xeto
deleted file mode 100644
index e81acb90c..000000000
--- a/Aaru.Gui/Forms/frmDecodeMediaTags.xeto
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
\ No newline at end of file
diff --git a/Aaru.Gui/Forms/frmDecodeMediaTags.xeto.cs b/Aaru.Gui/Forms/frmDecodeMediaTags.xeto.cs
deleted file mode 100644
index 2ae189b0c..000000000
--- a/Aaru.Gui/Forms/frmDecodeMediaTags.xeto.cs
+++ /dev/null
@@ -1,241 +0,0 @@
-// /***************************************************************************
-// Aaru Data Preservation Suite
-// ----------------------------------------------------------------------------
-//
-// Filename : frmDecodeMediaTags.xeto.cs
-// Author(s) : Natalia Portillo
-//
-// 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 lstTags;
-
- public frmDecodeMediaTags(IMediaImage inputFormat)
- {
- this.inputFormat = inputFormat;
- XamlReader.Load(this);
-
- lstTags = new ObservableCollection();
- 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
- }
-}
\ No newline at end of file
diff --git a/Aaru.Gui/Models/MediaTagModel.cs b/Aaru.Gui/Models/MediaTagModel.cs
new file mode 100644
index 000000000..b4cd3e4d2
--- /dev/null
+++ b/Aaru.Gui/Models/MediaTagModel.cs
@@ -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();
+ }
+}
\ No newline at end of file
diff --git a/Aaru.Gui/ViewModels/DecodeMediaTagsViewModel.cs b/Aaru.Gui/ViewModels/DecodeMediaTagsViewModel.cs
new file mode 100644
index 000000000..380e83e2f
--- /dev/null
+++ b/Aaru.Gui/ViewModels/DecodeMediaTagsViewModel.cs
@@ -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();
+
+ 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 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);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Aaru.Gui/ViewModels/ImageInfoViewModel.cs b/Aaru.Gui/ViewModels/ImageInfoViewModel.cs
index 3e116ee55..2d000138d 100644
--- a/Aaru.Gui/ViewModels/ImageInfoViewModel.cs
+++ b/Aaru.Gui/ViewModels/ImageInfoViewModel.cs
@@ -27,15 +27,16 @@ namespace Aaru.Gui.ViewModels
{
public class ImageInfoViewModel : ViewModelBase
{
- readonly IMediaImage _imageFormat;
- readonly string _imagePath;
- readonly Window _view;
- IFilter _filter;
- ImageChecksumWindow _imageChecksumWindow;
- ImageConvertWindow _imageConvertWindow;
- ImageEntropyWindow _imageEntropyWindow;
- ImageVerifyWindow _imageVerifyWindow;
- ViewSectorWindow _viewSectorWindow;
+ readonly IMediaImage _imageFormat;
+ readonly string _imagePath;
+ readonly Window _view;
+ DecodeMediaTagsWindow _decodeMediaTagsWindow;
+ IFilter _filter;
+ ImageChecksumWindow _imageChecksumWindow;
+ ImageConvertWindow _imageConvertWindow;
+ ImageEntropyWindow _imageEntropyWindow;
+ ImageVerifyWindow _imageVerifyWindow;
+ ViewSectorWindow _viewSectorWindow;
public ImageInfoViewModel(string imagePath, IFilter filter, IMediaImage imageFormat, Window view)
@@ -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;
+ };
}
}
}
\ No newline at end of file
diff --git a/Aaru.Gui/Views/DecodeMediaTagsWindow.xaml b/Aaru.Gui/Views/DecodeMediaTagsWindow.xaml
new file mode 100644
index 000000000..02fd99b90
--- /dev/null
+++ b/Aaru.Gui/Views/DecodeMediaTagsWindow.xaml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Aaru.Gui/Views/DecodeMediaTagsWindow.xaml.cs b/Aaru.Gui/Views/DecodeMediaTagsWindow.xaml.cs
new file mode 100644
index 000000000..18a4787a1
--- /dev/null
+++ b/Aaru.Gui/Views/DecodeMediaTagsWindow.xaml.cs
@@ -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);
+ }
+}
\ No newline at end of file