From 62d85ef221a7a78d3a1a3cb3e17746eb0fdd4cd5 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 12 Sep 2025 19:01:05 +0100 Subject: [PATCH] Add view data page for tested media with data display and decoding logic --- .../Admin/Pages/TestedMedia/Details.razor | 152 ++--- .../Admin/Pages/TestedMedia/ViewData.razor | 40 ++ .../Admin/Pages/TestedMedia/ViewData.razor.cs | 620 ++++++++++++++++++ 3 files changed, 736 insertions(+), 76 deletions(-) create mode 100644 Aaru.Server/Components/Admin/Pages/TestedMedia/ViewData.razor create mode 100644 Aaru.Server/Components/Admin/Pages/TestedMedia/ViewData.razor.cs diff --git a/Aaru.Server/Components/Admin/Pages/TestedMedia/Details.razor b/Aaru.Server/Components/Admin/Pages/TestedMedia/Details.razor index 13d83c7a..2b0181b7 100644 --- a/Aaru.Server/Components/Admin/Pages/TestedMedia/Details.razor +++ b/Aaru.Server/Components/Admin/Pages/TestedMedia/Details.razor @@ -9,11 +9,11 @@ @if(!_initialized) { -
-

Loading...

-
+
+

Loading...

+
- return; +return; }
@@ -33,11 +33,11 @@
@if(_model?.IdentifyData != null) { - @_model.IdentifyData.Length bytes + @_model.IdentifyData.Length bytes } else { - @("") + @("") }
@@ -414,7 +414,7 @@
@if(_model?.ModeSense6Data != null) { - @_model.ModeSense6Data.Length bytes + @_model.ModeSense6Data.Length bytes } else { @@ -427,7 +427,7 @@
@if(_model?.ModeSense10Data != null) { - @_model.ModeSense10Data.Length bytes + @_model.ModeSense10Data.Length bytes } else { @@ -604,7 +604,7 @@
@if(_model?.IntersessionLeadInData != null) { - @_model.IntersessionLeadInData.Length bytes + @_model.IntersessionLeadInData.Length bytes } else { @@ -617,7 +617,7 @@
@if(_model?.IntersessionLeadOutData != null) { - @_model.IntersessionLeadOutData.Length bytes + @_model.IntersessionLeadOutData.Length bytes } else { @@ -630,7 +630,7 @@
@if(_model?.Read6Data != null) { - @_model.Read6Data.Length bytes + @_model.Read6Data.Length bytes } else { @@ -643,7 +643,7 @@
@if(_model?.Read10Data != null) { - @_model.Read10Data.Length bytes + @_model.Read10Data.Length bytes } else { @@ -656,7 +656,7 @@
@if(_model?.Read12Data != null) { - @_model.Read12Data.Length bytes + @_model.Read12Data.Length bytes } else { @@ -669,7 +669,7 @@
@if(_model?.Read16Data != null) { - @_model.Read16Data.Length bytes + @_model.Read16Data.Length bytes } else { @@ -682,7 +682,7 @@
@if(_model?.ReadLong10Data != null) { - @_model.ReadLong10Data.Length bytes + @_model.ReadLong10Data.Length bytes } else { @@ -695,7 +695,7 @@
@if(_model?.ReadLong16Data != null) { - @_model.ReadLong16Data.Length bytes + @_model.ReadLong16Data.Length bytes } else { @@ -708,7 +708,7 @@
@if(_model?.ReadSectorsData != null) { - @_model.ReadSectorsData.Length bytes + @_model.ReadSectorsData.Length bytes } else { @@ -721,7 +721,7 @@
@if(_model?.ReadSectorsRetryData != null) { - @_model.ReadSectorsRetryData.Length bytes + @_model.ReadSectorsRetryData.Length bytes } else { @@ -734,7 +734,7 @@
@if(_model?.ReadDmaData != null) { - @_model.ReadDmaData.Length bytes + @_model.ReadDmaData.Length bytes } else { @@ -747,7 +747,7 @@
@if(_model?.ReadDmaRetryData != null) { - @_model.ReadDmaRetryData.Length bytes + @_model.ReadDmaRetryData.Length bytes } else { @@ -760,7 +760,7 @@
@if(_model?.ReadLbaData != null) { - @_model.ReadLbaData.Length bytes + @_model.ReadLbaData.Length bytes } else { @@ -773,7 +773,7 @@
@if(_model?.ReadRetryLbaData != null) { - @_model.ReadRetryLbaData.Length bytes + @_model.ReadRetryLbaData.Length bytes } else { @@ -786,7 +786,7 @@
@if(_model?.ReadDmaLbaData != null) { - @_model.ReadDmaLbaData.Length bytes + @_model.ReadDmaLbaData.Length bytes } else { @@ -799,7 +799,7 @@
@if(_model?.ReadDmaRetryLbaData != null) { - @_model.ReadDmaRetryLbaData.Length bytes + @_model.ReadDmaRetryLbaData.Length bytes } else { @@ -812,7 +812,7 @@
@if(_model?.ReadLba48Data != null) { - @_model.ReadLba48Data.Length bytes + @_model.ReadLba48Data.Length bytes } else { @@ -825,7 +825,7 @@
@if(_model?.ReadDmaLba48Data != null) { - @_model.ReadDmaLba48Data.Length bytes + @_model.ReadDmaLba48Data.Length bytes } else { @@ -838,7 +838,7 @@
@if(_model?.ReadLongData != null) { - @_model.ReadLongData.Length bytes + @_model.ReadLongData.Length bytes } else { @@ -851,7 +851,7 @@
@if(_model?.ReadLongRetryData != null) { - @_model.ReadLongRetryData.Length bytes + @_model.ReadLongRetryData.Length bytes } else { @@ -864,7 +864,7 @@
@if(_model?.ReadLongLbaData != null) { - @_model.ReadLongLbaData.Length bytes + @_model.ReadLongLbaData.Length bytes } else { @@ -877,7 +877,7 @@
@if(_model?.ReadLongRetryLbaData != null) { - @_model.ReadLongRetryLbaData.Length bytes + @_model.ReadLongRetryLbaData.Length bytes } else { @@ -890,7 +890,7 @@
@if(_model?.TocData != null) { - @_model.TocData.Length bytes + @_model.TocData.Length bytes } else { @@ -903,7 +903,7 @@
@if(_model?.FullTocData != null) { - @_model.FullTocData.Length bytes + @_model.FullTocData.Length bytes } else { @@ -916,7 +916,7 @@
@if(_model?.AtipData != null) { - @_model.AtipData.Length bytes + @_model.AtipData.Length bytes } else { @@ -929,7 +929,7 @@
@if(_model?.PmaData != null) { - @_model.PmaData.Length bytes + @_model.PmaData.Length bytes } else { @@ -942,7 +942,7 @@
@if(_model?.ReadCdData != null) { - @_model.ReadCdData.Length bytes + @_model.ReadCdData.Length bytes } else { @@ -955,7 +955,7 @@
@if(_model?.ReadCdMsfData != null) { - @_model.ReadCdMsfData.Length bytes + @_model.ReadCdMsfData.Length bytes } else { @@ -968,7 +968,7 @@
@if(_model?.ReadCdFullData != null) { - @_model.ReadCdFullData.Length bytes + @_model.ReadCdFullData.Length bytes } else { @@ -981,7 +981,7 @@
@if(_model?.ReadCdMsfFullData != null) { - @_model.ReadCdMsfFullData.Length bytes + @_model.ReadCdMsfFullData.Length bytes } else { @@ -994,7 +994,7 @@
@if(_model?.Track1PregapData != null) { - @_model.Track1PregapData.Length bytes + @_model.Track1PregapData.Length bytes } else { @@ -1007,7 +1007,7 @@
@if(_model?.LeadInData != null) { - @_model.LeadInData.Length bytes + @_model.LeadInData.Length bytes } else { @@ -1020,7 +1020,7 @@
@if(_model?.LeadOutData != null) { - @_model.LeadOutData.Length bytes + @_model.LeadOutData.Length bytes } else { @@ -1033,7 +1033,7 @@
@if(_model?.C2PointersData != null) { - @_model.C2PointersData.Length bytes + @_model.C2PointersData.Length bytes } else { @@ -1046,7 +1046,7 @@
@if(_model?.PQSubchannelData != null) { - @_model.PQSubchannelData.Length bytes + @_model.PQSubchannelData.Length bytes } else { @@ -1059,7 +1059,7 @@
@if(_model?.RWSubchannelData != null) { - @_model.RWSubchannelData.Length bytes + @_model.RWSubchannelData.Length bytes } else { @@ -1072,7 +1072,7 @@
@if(_model?.CorrectedSubchannelData != null) { - @_model.CorrectedSubchannelData.Length bytes + @_model.CorrectedSubchannelData.Length bytes } else { @@ -1085,7 +1085,7 @@
@if(_model?.PQSubchannelWithC2Data != null) { - @_model.PQSubchannelWithC2Data.Length bytes + @_model.PQSubchannelWithC2Data.Length bytes } else { @@ -1098,7 +1098,7 @@
@if(_model?.RWSubchannelWithC2Data != null) { - @_model.RWSubchannelWithC2Data.Length bytes + @_model.RWSubchannelWithC2Data.Length bytes } else { @@ -1111,7 +1111,7 @@
@if(_model?.CorrectedSubchannelWithC2Data != null) { - @_model.CorrectedSubchannelWithC2Data.Length bytes + @_model.CorrectedSubchannelWithC2Data.Length bytes } else { @@ -1124,7 +1124,7 @@
@if(_model?.PfiData != null) { - @_model.PfiData.Length bytes + @_model.PfiData.Length bytes } else { @@ -1137,7 +1137,7 @@
@if(_model?.DmiData != null) { - @_model.DmiData.Length bytes + @_model.DmiData.Length bytes } else { @@ -1150,7 +1150,7 @@
@if(_model?.CmiData != null) { - @_model.CmiData.Length bytes + @_model.CmiData.Length bytes } else { @@ -1163,7 +1163,7 @@
@if(_model?.DvdBcaData != null) { - @_model.DvdBcaData.Length bytes + @_model.DvdBcaData.Length bytes } else { @@ -1176,7 +1176,7 @@
@if(_model?.DvdAacsData != null) { - @_model.DvdAacsData.Length bytes + @_model.DvdAacsData.Length bytes } else { @@ -1189,7 +1189,7 @@
@if(_model?.DvdDdsData != null) { - @_model.DvdDdsData.Length bytes + @_model.DvdDdsData.Length bytes } else { @@ -1202,7 +1202,7 @@
@if(_model?.DvdSaiData != null) { - @_model.DvdSaiData.Length bytes + @_model.DvdSaiData.Length bytes } else { @@ -1215,7 +1215,7 @@
@if(_model?.PriData != null) { - @_model.PriData.Length bytes + @_model.PriData.Length bytes } else { @@ -1228,7 +1228,7 @@
@if(_model?.EmbossedPfiData != null) { - @_model.EmbossedPfiData.Length bytes + @_model.EmbossedPfiData.Length bytes } else { @@ -1241,7 +1241,7 @@
@if(_model?.AdipData != null) { - @_model.AdipData.Length bytes + @_model.AdipData.Length bytes } else { @@ -1254,7 +1254,7 @@
@if(_model?.DcbData != null) { - @_model.DcbData.Length bytes + @_model.DcbData.Length bytes } else { @@ -1267,7 +1267,7 @@
@if(_model?.HdCmiData != null) { - @_model.HdCmiData.Length bytes + @_model.HdCmiData.Length bytes } else { @@ -1280,7 +1280,7 @@
@if(_model?.DvdLayerData != null) { - @_model.DvdLayerData.Length bytes + @_model.DvdLayerData.Length bytes } else { @@ -1293,7 +1293,7 @@
@if(_model?.BluBcaData != null) { - @_model.BluBcaData.Length bytes + @_model.BluBcaData.Length bytes } else { @@ -1306,7 +1306,7 @@
@if(_model?.BluDdsData != null) { - @_model.BluDdsData.Length bytes + @_model.BluDdsData.Length bytes } else { @@ -1319,7 +1319,7 @@
@if(_model?.BluSaiData != null) { - @_model.BluSaiData.Length bytes + @_model.BluSaiData.Length bytes } else { @@ -1332,7 +1332,7 @@
@if(_model?.BluDiData != null) { - @_model.BluDiData.Length bytes + @_model.BluDiData.Length bytes } else { @@ -1345,7 +1345,7 @@
@if(_model?.PlextorReadCddaData != null) { - @_model.PlextorReadCddaData.Length bytes + @_model.PlextorReadCddaData.Length bytes } else { @@ -1358,7 +1358,7 @@
@if(_model?.PlextorReadCddaData != null) { - @_model.PlextorReadCddaData.Length bytes + @_model.PlextorReadCddaData.Length bytes } else { @@ -1371,7 +1371,7 @@
@if(_model?.PioneerReadCddaData != null) { - @_model.PioneerReadCddaData.Length bytes + @_model.PioneerReadCddaData.Length bytes } else { @@ -1384,7 +1384,7 @@
@if(_model?.PioneerReadCddaMsfData != null) { - @_model.PioneerReadCddaMsfData.Length bytes + @_model.PioneerReadCddaMsfData.Length bytes } else { @@ -1397,7 +1397,7 @@
@if(_model?.NecReadCddaData != null) { - @_model.NecReadCddaData.Length bytes + @_model.NecReadCddaData.Length bytes } else { @@ -1410,7 +1410,7 @@
@if(_model?.PlextorReadRawDVDData != null) { - @_model.PlextorReadRawDVDData.Length bytes + @_model.PlextorReadRawDVDData.Length bytes } else { @@ -1423,7 +1423,7 @@
@if(_model?.HLDTSTReadRawDVDData != null) { - @_model.HLDTSTReadRawDVDData.Length bytes + @_model.HLDTSTReadRawDVDData.Length bytes } else { @@ -1442,7 +1442,7 @@
@if(_model?.ReadCdScrambledData != null) { - @_model.ReadCdScrambledData.Length bytes + @_model.ReadCdScrambledData.Length bytes } else { @@ -1461,7 +1461,7 @@
@if(_model?.ReadF1_06Data != null) { - @_model.ReadF1_06Data.Length bytes + @_model.ReadF1_06Data.Length bytes } else { @@ -1480,7 +1480,7 @@
@if(_model?.ReadF1_06LeadOutData != null) { - @_model.ReadF1_06LeadOutData.Length bytes + @_model.ReadF1_06LeadOutData.Length bytes } else { @@ -1490,6 +1490,6 @@
- Back to List + Back to List
\ No newline at end of file diff --git a/Aaru.Server/Components/Admin/Pages/TestedMedia/ViewData.razor b/Aaru.Server/Components/Admin/Pages/TestedMedia/ViewData.razor new file mode 100644 index 00000000..6a79b8d9 --- /dev/null +++ b/Aaru.Server/Components/Admin/Pages/TestedMedia/ViewData.razor @@ -0,0 +1,40 @@ +@page "/admin/tested-media/data/{Id:int}/{data}" +@attribute [Authorize] +@layout AdminLayout +@rendermode InteractiveServer + +@inject Microsoft.EntityFrameworkCore.IDbContextFactory DbContextFactory + +View data + +@if(!_initialized) +{ +
+

Loading...

+
+ + return; +} + +@if(_notFound) +{ +
+

Data not found

+
+ + return; +} + +
+

Showing data from @_model.DataName for tested media id @_model.TestedMediaId

+ +

Hex dump:

+
+ @(new MarkupString(_model.RawDataAsHex)) +
+ +

Decoded information:

+
+ @(new MarkupString(_model.Decoded)) +
+
\ No newline at end of file diff --git a/Aaru.Server/Components/Admin/Pages/TestedMedia/ViewData.razor.cs b/Aaru.Server/Components/Admin/Pages/TestedMedia/ViewData.razor.cs new file mode 100644 index 00000000..9b34a0a8 --- /dev/null +++ b/Aaru.Server/Components/Admin/Pages/TestedMedia/ViewData.razor.cs @@ -0,0 +1,620 @@ +using System.Web; +using Aaru.CommonTypes; +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.Helpers; +using Aaru.Server.Database; +using Aaru.Server.Database.Models; +using Microsoft.AspNetCore.Components; +using Cartridge = Aaru.Decoders.Bluray.Cartridge; +using DDS = Aaru.Decoders.Bluray.DDS; +using DMI = Aaru.Decoders.Xbox.DMI; +using Sector = Aaru.Decoders.CD.Sector; +using Spare = Aaru.Decoders.Bluray.Spare; + +namespace Aaru.Server.Components.Admin.Pages.TestedMedia; + +public partial class ViewData +{ + bool _initialized; + TestedMediaDataModel _model; + bool _notFound; + [Parameter] + public string Data { get; set; } = string.Empty; + [Parameter] + public int Id { get; set; } + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + _initialized = true; + + await using DbContext ctx = await DbContextFactory.CreateDbContextAsync(); + + if(string.IsNullOrWhiteSpace(Data)) + { + _notFound = true; + + return; + } + + CommonTypes.Metadata.TestedMedia? testedMedia = ctx.TestedMedia.FirstOrDefault(m => m.Id == Id); + + if(testedMedia == null) + { + _notFound = true; + + return; + } + + _model = new TestedMediaDataModel + { + TestedMediaId = Id, + DataName = Data + }; + + byte[] buffer; + byte[] sector = new byte[2352]; + byte[] subq = new byte[16]; + byte[]? fullsub = new byte[96]; + bool c2Errors = false; + bool scrambled = false; + + switch(Data) + { + case nameof(testedMedia.AdipData): + buffer = testedMedia.AdipData; + + break; + case nameof(testedMedia.AtipData): + buffer = testedMedia.AtipData; + _model.Decoded = ATIP.Prettify(buffer); + + break; + case nameof(testedMedia.BluBcaData): + buffer = testedMedia.BluBcaData; + + break; + case nameof(testedMedia.BluDdsData): + buffer = testedMedia.BluDdsData; + _model.Decoded = DDS.Prettify(buffer); + + break; + case nameof(testedMedia.BluDiData): + buffer = testedMedia.BluDiData; + _model.Decoded = DI.Prettify(buffer); + + break; + case nameof(testedMedia.BluPacData): + buffer = testedMedia.BluPacData; + _model.Decoded = Cartridge.Prettify(buffer); + + break; + case nameof(testedMedia.BluSaiData): + buffer = testedMedia.BluSaiData; + _model.Decoded = Spare.Prettify(buffer); + + break; + case nameof(testedMedia.C2PointersData): + buffer = testedMedia.C2PointersData; + + if(buffer is null || buffer.Length < 2352 || buffer.All(static c => c == 0)) break; + + Array.Copy(buffer, 0, sector, 0, 2352); + + _model.Decoded = Sector.Prettify(sector); + + for(int i = 2352; i < buffer.Length; i++) + { + if(buffer[i] == 0x00) continue; + + c2Errors = true; + + break; + } + + _model.Decoded += "\n" + (c2Errors ? "C2 errors found." : "No C2 errors."); + + break; + case nameof(testedMedia.CmiData): + buffer = testedMedia.CmiData; + _model.Decoded = CSS_CPRM.PrettifyLeadInCopyright(buffer); + + break; + case nameof(testedMedia.CorrectedSubchannelData): + buffer = testedMedia.CorrectedSubchannelData; + + if(buffer is null || buffer.Length < 2352 || buffer.All(static c => c == 0)) break; + + Array.Copy(buffer, 0, sector, 0, 2352); + + _model.Decoded = Sector.Prettify(sector); + + if(buffer.Length < 2448) break; + + Array.Copy(buffer, 2352, fullsub, 0, 96); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + break; + case nameof(testedMedia.CorrectedSubchannelWithC2Data): + buffer = testedMedia.CorrectedSubchannelWithC2Data; + + if(buffer is null || buffer.Length < 2352 || buffer.All(static c => c == 0)) break; + + Array.Copy(buffer, 0, sector, 0, 2352); + + _model.Decoded = Sector.Prettify(sector); + + if(buffer.Length < 2448) break; + + for(int i = 2352; i < 2616; i++) + { + if(buffer[i] == 0x00) continue; + + c2Errors = true; + + break; + } + + _model.Decoded += "\n" + (c2Errors ? "C2 errors found." : "No C2 errors."); + + break; + case nameof(testedMedia.DcbData): + buffer = testedMedia.DcbData; + + break; + case nameof(testedMedia.DmiData): + buffer = testedMedia.DmiData; + + if(DMI.IsXbox(buffer)) + _model.Decoded = DMI.PrettifyXbox(buffer); + else if(DMI.IsXbox360(buffer)) _model.Decoded = DMI.PrettifyXbox360(buffer); + + break; + case nameof(testedMedia.DvdAacsData): + buffer = testedMedia.DvdAacsData; + + break; + case nameof(testedMedia.DvdBcaData): + buffer = testedMedia.DvdBcaData; + + break; + case nameof(testedMedia.DvdDdsData): + buffer = testedMedia.DvdDdsData; + _model.Decoded = Decoders.DVD.DDS.Prettify(buffer); + + break; + case nameof(testedMedia.DvdLayerData): + buffer = testedMedia.DvdLayerData; + + break; + case nameof(testedMedia.DvdSaiData): + buffer = testedMedia.DvdSaiData; + _model.Decoded = Decoders.DVD.Spare.Prettify(buffer); + + break; + case nameof(testedMedia.EmbossedPfiData): + buffer = testedMedia.EmbossedPfiData; + _model.Decoded = PFI.Prettify(buffer, MediaType.DVDROM); // TODO: Get real media type here + + break; + case nameof(testedMedia.FullTocData): + buffer = testedMedia.FullTocData; + _model.Decoded = FullTOC.Prettify(buffer); + + break; + case nameof(testedMedia.HdCmiData): + buffer = testedMedia.HdCmiData; + + break; + case nameof(testedMedia.HLDTSTReadRawDVDData): + buffer = testedMedia.HLDTSTReadRawDVDData; + + break; + case nameof(testedMedia.LiteOnReadRawDVDData): + buffer = testedMedia.LiteOnReadRawDVDData; + + break; + case nameof(testedMedia.IdentifyData): + buffer = testedMedia.IdentifyData; + _model.Decoded = Identify.Prettify(buffer); + + break; + case nameof(testedMedia.IntersessionLeadInData): + buffer = testedMedia.IntersessionLeadInData; + + break; + case nameof(testedMedia.IntersessionLeadOutData): + buffer = testedMedia.IntersessionLeadOutData; + + break; + case nameof(testedMedia.LeadInData): + buffer = testedMedia.LeadInData; + _model.Decoded = Sector.Prettify(buffer); + + break; + case nameof(testedMedia.LeadOutData): + buffer = testedMedia.LeadOutData; + _model.Decoded = Sector.Prettify(buffer); + + break; + case nameof(testedMedia.ModeSense6Data): + buffer = testedMedia.ModeSense6Data; + _model.Decoded = Modes.PrettifyModeHeader6(buffer, PeripheralDeviceTypes.DirectAccess); + + break; + case nameof(testedMedia.ModeSense10Data): + buffer = testedMedia.ModeSense10Data; + _model.Decoded = Modes.PrettifyModeHeader10(buffer, PeripheralDeviceTypes.DirectAccess); + + break; + case nameof(testedMedia.NecReadCddaData): + buffer = testedMedia.NecReadCddaData; + + break; + case nameof(testedMedia.PfiData): + buffer = testedMedia.PfiData; + _model.Decoded = PFI.Prettify(buffer, MediaType.DVDROM); // TODO: Get real media type here + + break; + case nameof(testedMedia.PioneerReadCddaData): + buffer = testedMedia.PioneerReadCddaData; + + break; + case nameof(testedMedia.PioneerReadCddaMsfData): + buffer = testedMedia.PioneerReadCddaMsfData; + + break; + case nameof(testedMedia.PlextorReadCddaData): + buffer = testedMedia.PlextorReadCddaData; + + break; + case nameof(testedMedia.PlextorReadRawDVDData): + buffer = testedMedia.PlextorReadRawDVDData; + + break; + case nameof(testedMedia.PmaData): + buffer = testedMedia.PmaData; + _model.Decoded = PMA.Prettify(buffer); + + break; + case nameof(testedMedia.PQSubchannelData): + buffer = testedMedia.PQSubchannelData; + + if(buffer is null || buffer.Length < 2352 || buffer.All(static c => c == 0)) break; + + Array.Copy(buffer, 0, sector, 0, 2352); + + _model.Decoded = Sector.Prettify(sector); + + if(buffer.Length < 2368) break; + + Array.Copy(buffer, 2352, subq, 0, 16); + fullsub = Subchannel.ConvertQToRaw(subq); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + break; + case nameof(testedMedia.PQSubchannelWithC2Data): + buffer = testedMedia.PQSubchannelWithC2Data; + + if(buffer is null || buffer.Length < 2352 || buffer.All(static c => c == 0)) break; + + Array.Copy(buffer, 0, sector, 0, 2352); + + _model.Decoded = Sector.Prettify(sector); + + if(buffer.Length < 2368) break; + + Array.Copy(buffer, 2646, subq, 0, 16); + fullsub = Subchannel.ConvertQToRaw(subq); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + for(int i = 2352; i < 2646; i++) + { + if(buffer[i] == 0x00) continue; + + c2Errors = true; + + break; + } + + _model.Decoded += "\n" + (c2Errors ? "C2 errors found." : "No C2 errors."); + + break; + case nameof(testedMedia.PriData): + buffer = testedMedia.PriData; + + break; + case nameof(testedMedia.Read6Data): + buffer = testedMedia.Read6Data; + + break; + case nameof(testedMedia.Read10Data): + buffer = testedMedia.Read10Data; + + break; + case nameof(testedMedia.Read12Data): + buffer = testedMedia.Read12Data; + + break; + case nameof(testedMedia.Read16Data): + buffer = testedMedia.Read16Data; + + break; + case nameof(testedMedia.ReadCdData): + buffer = testedMedia.ReadCdData; + + break; + case nameof(testedMedia.ReadCdFullData): + buffer = testedMedia.ReadCdFullData; + _model.Decoded = Sector.Prettify(buffer); + + break; + case nameof(testedMedia.ReadCdMsfData): + buffer = testedMedia.ReadCdMsfData; + + break; + case nameof(testedMedia.ReadCdMsfFullData): + buffer = testedMedia.ReadCdMsfFullData; + _model.Decoded = Sector.Prettify(buffer); + + break; + case nameof(testedMedia.ReadDmaData): + buffer = testedMedia.ReadDmaData; + + break; + case nameof(testedMedia.ReadDmaLba48Data): + buffer = testedMedia.ReadDmaLba48Data; + + break; + case nameof(testedMedia.ReadDmaLbaData): + buffer = testedMedia.ReadDmaLbaData; + + break; + case nameof(testedMedia.ReadDmaRetryData): + buffer = testedMedia.ReadDmaRetryData; + + break; + case nameof(testedMedia.ReadDmaRetryLbaData): + buffer = testedMedia.ReadDmaRetryLbaData; + + break; + case nameof(testedMedia.ReadLba48Data): + buffer = testedMedia.ReadLba48Data; + + break; + case nameof(testedMedia.ReadLbaData): + buffer = testedMedia.ReadLbaData; + + break; + case nameof(testedMedia.ReadLong10Data): + buffer = testedMedia.ReadLong10Data; + + break; + case nameof(testedMedia.ReadLong16Data): + buffer = testedMedia.ReadLong16Data; + + break; + case nameof(testedMedia.ReadLongData): + buffer = testedMedia.ReadLongData; + + break; + case nameof(testedMedia.ReadLongLbaData): + buffer = testedMedia.ReadLongLbaData; + + break; + case nameof(testedMedia.ReadLongRetryData): + buffer = testedMedia.ReadLongRetryData; + + break; + case nameof(testedMedia.ReadLongRetryLbaData): + buffer = testedMedia.ReadLongRetryLbaData; + + break; + case nameof(testedMedia.ReadRetryLbaData): + buffer = testedMedia.ReadRetryLbaData; + + break; + case nameof(testedMedia.ReadSectorsData): + buffer = testedMedia.ReadSectorsData; + + break; + case nameof(testedMedia.ReadSectorsRetryData): + buffer = testedMedia.ReadSectorsRetryData; + + break; + case nameof(testedMedia.RWSubchannelData): + buffer = testedMedia.RWSubchannelData; + + if(buffer is null || buffer.Length < 2352 || buffer.All(static c => c == 0)) break; + + Array.Copy(buffer, 0, sector, 0, 2352); + + _model.Decoded = Sector.Prettify(sector); + + if(buffer.Length < 2448) break; + + Array.Copy(buffer, 2352, fullsub, 0, 96); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + break; + case nameof(testedMedia.RWSubchannelWithC2Data): + buffer = testedMedia.RWSubchannelWithC2Data; + + if(buffer is null || buffer.Length < 2352 || buffer.All(static c => c == 0)) break; + + Array.Copy(buffer, 0, sector, 0, 2352); + + _model.Decoded = Sector.Prettify(sector); + + if(buffer.Length < 2448) break; + + Array.Copy(buffer, 2352, fullsub, 0, 96); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + for(int i = 2448; i < buffer.Length; i++) + { + if(buffer[i] == 0x00) continue; + + c2Errors = true; + + break; + } + + _model.Decoded += "\n" + (c2Errors ? "C2 errors found." : "No C2 errors."); + + break; + case nameof(testedMedia.TocData): + buffer = testedMedia.TocData; + _model.Decoded = TOC.Prettify(buffer); + + break; + case nameof(testedMedia.Track1PregapData): + buffer = testedMedia.Track1PregapData; + + _model.Decoded = Sector.Prettify(buffer); + + break; + case nameof(testedMedia.ReadCdScrambledData): + buffer = testedMedia.ReadCdScrambledData; + + break; + case nameof(testedMedia.ReadF1_06Data): + buffer = testedMedia.ReadF1_06Data; + + if(buffer.Length != 0xB00) + { + _model.Decoded = Sense.PrettifySense(buffer); + + break; + } + + Array.Copy(buffer, 0, sector, 0, 2352); + + if((sector[0xD] & 0x80) == 0x80) + { + scrambled = true; + Sector.Scramble(sector); + } + + _model.Decoded = Sector.Prettify(sector) + "\n" + (scrambled ? "Scrambled." : "Descrambled."); + + Array.Copy(buffer, 2352, fullsub, 0, 96); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + Array.Copy(buffer, 2448, subq, 0, 16); + fullsub = Subchannel.ConvertQToRaw(subq); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + for(int i = 2468; i < 2762; i++) + { + if(buffer[i] == 0x00) continue; + + c2Errors = true; + + break; + } + + _model.Decoded += "\n" + (c2Errors ? "C2 errors found." : "No C2 errors."); + + break; + case nameof(testedMedia.ReadF1_06LeadOutData): + buffer = testedMedia.ReadF1_06LeadOutData; + + if(buffer.Length != 0xB00) + { + _model.Decoded = Sense.PrettifySense(buffer); + + break; + } + + Array.Copy(buffer, 0, sector, 0, 2352); + + if((sector[0xD] & 0x80) == 0x80) + { + scrambled = true; + Sector.Scramble(sector); + } + + _model.Decoded = Sector.Prettify(sector) + "\n" + (scrambled ? "Scrambled." : "Descrambled."); + + Array.Copy(buffer, 2352, fullsub, 0, 96); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + Array.Copy(buffer, 2448, subq, 0, 16); + fullsub = Subchannel.ConvertQToRaw(subq); + + _model.Decoded += "\n" + GetPrettySub(fullsub); + + for(int i = 2468; i < 2762; i++) + { + if(buffer[i] == 0x00) continue; + + c2Errors = true; + + break; + } + + _model.Decoded += "\n" + (c2Errors ? "C2 errors found." : "No C2 errors."); + + break; + default: + _notFound = true; + + return; + } + + _model.RawDataAsHex = PrintHex.ByteArrayToHexArrayString(buffer); + + if(_model.RawDataAsHex != null) + _model.RawDataAsHex = HttpUtility.HtmlEncode(_model.RawDataAsHex).Replace("\n", "
"); + + if(_model.Decoded != null) _model.Decoded = HttpUtility.HtmlEncode(_model.Decoded).Replace("\n", "
"); + + StateHasChanged(); + } + + static string GetPrettySub(byte[] sub) + { + byte[] deint = Subchannel.Deinterleave(sub); + + bool validP = true; + bool validRw = true; + + for(int i = 0; i < 12; i++) + { + if(deint[i] == 0x00 || deint[i] == 0xFF) continue; + + validP = false; + + break; + } + + for(int i = 24; i < 96; i++) + { + if(deint[i] == 0x00) continue; + + validRw = false; + + break; + } + + byte[] q = new byte[12]; + Array.Copy(deint, 12, q, 0, 12); + + return Subchannel.PrettifyQ(q, deint[21] > 0x10, 16, !validP, false, validRw); + } +} \ No newline at end of file