From 6b625807147cf4fe38c7b88b125df87f1009e5ec Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 18 Jul 2020 19:37:46 +0100 Subject: [PATCH] Add admin pages to view GD-ROM device report data. --- Aaru.Server/Aaru.Server.csproj | 15 + .../GdRomSwapDiscCapabilitiesController.cs | 391 ++++++ .../Areas/Admin/Views/Devices/Details.cshtml | 6 + .../GdRomSwapDiscCapabilities/Delete.cshtml | 1151 +++++++++++++++++ .../GdRomSwapDiscCapabilities/Details.cshtml | 1146 ++++++++++++++++ .../GdRomSwapDiscCapabilities/ViewData.cshtml | 29 + .../Areas/Admin/Views/Reports/Details.cshtml | 6 + 7 files changed, 2744 insertions(+) create mode 100644 Aaru.Server/Areas/Admin/Controllers/GdRomSwapDiscCapabilitiesController.cs create mode 100644 Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/Delete.cshtml create mode 100644 Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/Details.cshtml create mode 100644 Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/ViewData.cshtml diff --git a/Aaru.Server/Aaru.Server.csproj b/Aaru.Server/Aaru.Server.csproj index ad7cae00..3f6a144d 100644 --- a/Aaru.Server/Aaru.Server.csproj +++ b/Aaru.Server/Aaru.Server.csproj @@ -109,4 +109,19 @@ + + + true + PreserveNewest + + + true + PreserveNewest + + + true + PreserveNewest + + + diff --git a/Aaru.Server/Areas/Admin/Controllers/GdRomSwapDiscCapabilitiesController.cs b/Aaru.Server/Areas/Admin/Controllers/GdRomSwapDiscCapabilitiesController.cs new file mode 100644 index 00000000..0a393755 --- /dev/null +++ b/Aaru.Server/Areas/Admin/Controllers/GdRomSwapDiscCapabilitiesController.cs @@ -0,0 +1,391 @@ +using System; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using Aaru.CommonTypes.Metadata; +using Aaru.Decoders.CD; +using Aaru.Server.Models; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace Aaru.Server.Areas.Admin.Controllers +{ + [Area("Admin"), Authorize] + public class GdRomSwapDiscCapabilitiesController : Controller + { + readonly AaruServerContext _context; + + public GdRomSwapDiscCapabilitiesController(AaruServerContext context) => _context = context; + + // GET: Admin/GdRomSwapDiscCapabilities/Details/5 + public async Task Details(int? id) + { + if(id == null) + { + return NotFound(); + } + + GdRomSwapDiscCapabilities caps = + await _context.GdRomSwapDiscCapabilities.FirstOrDefaultAsync(m => m.Id == id); + + if(caps == null) + { + return NotFound(); + } + + return View(caps); + } + + // GET: Admin/GdRomSwapDiscCapabilities/Delete/5 + public async Task Delete(int? id) + { + if(id == null) + { + return NotFound(); + } + + GdRomSwapDiscCapabilities caps = + await _context.GdRomSwapDiscCapabilities.FirstOrDefaultAsync(m => m.Id == id); + + if(caps == null) + { + return NotFound(); + } + + return View(caps); + } + + // POST: Admin/GdRomSwapDiscCapabilities/Delete/5 + [HttpPost, ActionName("Delete"), ValidateAntiForgeryToken] + public async Task DeleteConfirmed(int id) + { + GdRomSwapDiscCapabilities caps = await _context.GdRomSwapDiscCapabilities.FindAsync(id); + _context.GdRomSwapDiscCapabilities.Remove(caps); + await _context.SaveChangesAsync(); + + return RedirectToAction("Index", "Admin"); + } + + public IActionResult ViewData(int id, string data) + { + if(string.IsNullOrWhiteSpace(data)) + return NotFound(); + + GdRomSwapDiscCapabilities caps = _context.GdRomSwapDiscCapabilities.FirstOrDefault(m => m.Id == id); + + if(caps == null) + { + return NotFound(); + } + + var model = new TestedMediaDataModel + { + TestedMediaId = id, DataName = data + }; + + byte[] buffer; + var sb = new StringBuilder(); + byte[] sector = new byte[2352]; + byte[] subq = new byte[16]; + byte[] fullsub = new byte[96]; + + bool audio = true; + bool pq = false; + bool rw = false; + + switch(data) + { + case nameof(caps.Lba0Data): + buffer = caps.Lba0Data; + audio = false; + + break; + case nameof(caps.Lba0ScrambledData): + buffer = caps.Lba0ScrambledData; + + break; + case nameof(caps.Lba44990Data): + buffer = caps.Lba44990Data; + audio = false; + + break; + case nameof(caps.Lba44990PqData): + buffer = caps.Lba44990PqData; + audio = false; + pq = true; + + break; + case nameof(caps.Lba44990RwData): + buffer = caps.Lba44990RwData; + audio = false; + rw = true; + + break; + case nameof(caps.Lba44990AudioData): + buffer = caps.Lba44990AudioData; + + break; + case nameof(caps.Lba44990AudioPqData): + buffer = caps.Lba44990AudioPqData; + pq = true; + + break; + case nameof(caps.Lba44990AudioRwData): + buffer = caps.Lba44990AudioRwData; + rw = true; + + break; + case nameof(caps.Lba45000Data): + buffer = caps.Lba45000Data; + audio = false; + + break; + case nameof(caps.Lba45000PqData): + buffer = caps.Lba45000PqData; + audio = false; + pq = true; + + break; + case nameof(caps.Lba45000RwData): + buffer = caps.Lba45000RwData; + audio = false; + rw = true; + + break; + case nameof(caps.Lba45000AudioData): + buffer = caps.Lba45000AudioData; + + break; + case nameof(caps.Lba45000AudioPqData): + buffer = caps.Lba45000AudioPqData; + pq = true; + + break; + case nameof(caps.Lba45000AudioRwData): + buffer = caps.Lba45000AudioRwData; + rw = true; + + break; + case nameof(caps.Lba50000Data): + buffer = caps.Lba50000Data; + audio = false; + + break; + case nameof(caps.Lba50000PqData): + buffer = caps.Lba50000PqData; + audio = false; + pq = true; + + break; + case nameof(caps.Lba50000RwData): + buffer = caps.Lba50000RwData; + audio = false; + rw = true; + + break; + case nameof(caps.Lba50000AudioData): + buffer = caps.Lba50000AudioData; + + break; + case nameof(caps.Lba50000AudioPqData): + buffer = caps.Lba50000AudioPqData; + pq = true; + + break; + case nameof(caps.Lba50000AudioRwData): + buffer = caps.Lba50000AudioRwData; + rw = true; + + break; + case nameof(caps.Lba100000Data): + buffer = caps.Lba100000Data; + audio = false; + + break; + case nameof(caps.Lba100000PqData): + buffer = caps.Lba100000PqData; + audio = false; + pq = true; + + break; + case nameof(caps.Lba100000RwData): + buffer = caps.Lba100000RwData; + audio = false; + rw = true; + + break; + case nameof(caps.Lba100000AudioData): + buffer = caps.Lba100000AudioData; + + break; + case nameof(caps.Lba100000AudioPqData): + buffer = caps.Lba100000AudioPqData; + pq = true; + + break; + case nameof(caps.Lba100000AudioRwData): + buffer = caps.Lba100000AudioRwData; + rw = true; + + break; + case nameof(caps.Lba400000Data): + buffer = caps.Lba400000Data; + audio = false; + + break; + case nameof(caps.Lba400000PqData): + buffer = caps.Lba400000PqData; + audio = false; + pq = true; + + break; + case nameof(caps.Lba400000RwData): + buffer = caps.Lba400000RwData; + audio = false; + rw = true; + + break; + case nameof(caps.Lba400000AudioData): + buffer = caps.Lba400000AudioData; + + break; + case nameof(caps.Lba400000AudioPqData): + buffer = caps.Lba400000AudioPqData; + pq = true; + + break; + case nameof(caps.Lba400000AudioRwData): + buffer = caps.Lba400000AudioRwData; + rw = true; + + break; + case nameof(caps.Lba450000Data): + buffer = caps.Lba450000Data; + audio = false; + + break; + case nameof(caps.Lba450000PqData): + buffer = caps.Lba450000PqData; + audio = false; + pq = true; + + break; + case nameof(caps.Lba450000RwData): + buffer = caps.Lba450000RwData; + audio = false; + rw = true; + + break; + case nameof(caps.Lba450000AudioData): + buffer = caps.Lba450000AudioData; + + break; + case nameof(caps.Lba450000AudioPqData): + buffer = caps.Lba450000AudioPqData; + pq = true; + + break; + case nameof(caps.Lba450000AudioRwData): + buffer = caps.Lba450000AudioRwData; + rw = true; + + break; + default: return NotFound(); + } + + if(pq && + buffer != null && + buffer.Length % 2368 != 0) + pq = false; + + if(rw && + buffer != null && + buffer.Length % 2448 != 0) + rw = false; + + int blockSize = pq + ? 2368 + : rw + ? 2448 + : 2352; + + model.RawDataAsHex = PrintHex.ByteArrayToHexArrayString(buffer); + + if(model.RawDataAsHex != null) + model.RawDataAsHex = HttpUtility.HtmlEncode(model.RawDataAsHex).Replace("\n", "
"); + + if(buffer == null) + return View(model); + + for(int i = 0; i < buffer.Length; i += blockSize) + { + if(audio) + { + sb.AppendLine("Audio or scrambled data sector."); + } + else + { + Array.Copy(buffer, i, sector, 0, 2352); + + sb.AppendLine(Sector.Prettify(sector)); + } + + if(pq) + { + Array.Copy(buffer, i + 2352, subq, 0, 16); + fullsub = Subchannel.ConvertQToRaw(subq); + + sb.AppendLine(GetPrettySub(fullsub)); + } + else if(rw) + { + Array.Copy(buffer, i + 2352, fullsub, 0, 96); + + sb.AppendLine(GetPrettySub(fullsub)); + } + + sb.AppendLine(); + } + + model.Decoded = HttpUtility.HtmlEncode(sb.ToString()).Replace("\n", "
"); + + return View(model); + } + + 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 diff --git a/Aaru.Server/Areas/Admin/Views/Devices/Details.cshtml b/Aaru.Server/Areas/Admin/Views/Devices/Details.cshtml index f7c25f3e..6ff13323 100644 --- a/Aaru.Server/Areas/Admin/Views/Devices/Details.cshtml +++ b/Aaru.Server/Areas/Admin/Views/Devices/Details.cshtml @@ -139,6 +139,12 @@ USB report } +@if(Model.Report.GdRomSwapDiscCapabilitiesId != null) +{ + +} @if(Model.Report.FireWire != null) {
diff --git a/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/Delete.cshtml b/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/Delete.cshtml new file mode 100644 index 00000000..31262c0f --- /dev/null +++ b/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/Delete.cshtml @@ -0,0 +1,1151 @@ +@using Aaru.Decoders.SCSI +@model Aaru.CommonTypes.Metadata.GdRomSwapDiscCapabilities + +@{ + Layout = "~/Areas/Admin/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "Aaru Server"; +} +@{ + // /*************************************************************************** + // Aaru Data Preservation Suite + // ---------------------------------------------------------------------------- + // + // Filename : Delete.cshtml + // Author(s) : Natalia Portillo + // + // Component : Aaru Server. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library 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 + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2020 Natalia Portillo + // ****************************************************************************/ +} +

Are you sure you want to delete this?

+
+

GD-ROM swap-trick capabilities report

+
+@if(Model.TestCrashed) +{ +

Computer crashed while testing.

+} +else if(Model.RecognizedSwapDisc) +{ +

Swap disc Lead-Out starts at @($"{Model.SwapDiscLeadOutPMIN:X2}"):@($"{Model.SwapDiscLeadOutPSEC:X2}"):@($"{Model.SwapDiscLeadOutPFRAM:X2}") (@($"{Model.SwapDiscLeadOutStart}") sectors).

+
+
+
Minimum readable sector in HD area:
+
@Model.MinimumReadableSectorInHdArea
+
Maximum readable sector in HD area:
+
@Model.MaximumReadableSectorInHdArea
+ @if(Model.MaximumReadablePqInHdArea != null) + { +
Contents of last readable sector in HD area (with PQ):
+
+ @Model.MaximumReadablePqInHdArea.Length bytes +
+ } + @if(Model.MaximumReadableRwInHdArea != null) + { +
Contents of last readable sector in HD area (with RW):
+
+ @Model.MaximumReadableRwInHdArea.Length bytes +
+ } +
+ + + + + + + + + + + + @if(Model.Lba0Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba0ScrambledReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000AudioRwReadable) + { + + } + else + { + + } + + + +
LBARead modeStatusDataSense
0Data + ✔️ + + ❌️ + + @if(Model.Lba0Data != null) + { + @Model.Lba0Data.Length bytes + } + + @if(Model.Lba0DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba0Sense)).Replace(" ", "
")) + } +
0Audio (scrambled) + ✔️ + + ❌️ + + @if(Model.Lba0ScrambledData != null) + { + @Model.Lba0ScrambledData.Length bytes + } + + @if(Model.Lba0ScrambledDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba0ScrambledSense)).Replace(" ", "
")) + } +
44990Data + ✔️ + + ❌️ + + @if(Model.Lba44990Data != null) + { + @Model.Lba44990Data.Length bytes + } + + @if(Model.Lba44990DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990Sense)).Replace(" ", "
")) + } +
44990Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba44990PqData != null) + { + @Model.Lba44990PqData.Length bytes + } + + @if(Model.Lba44990PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990PqSense)).Replace(" ", "
")) + } +
44990Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba44990RwData != null) + { + @Model.Lba44990RwData.Length bytes + } + + @if(Model.Lba44990RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990RwSense)).Replace(" ", "
")) + } +
44990Audio + ✔️ + + ❌️ + + @if(Model.Lba44990AudioData != null) + { + @Model.Lba44990AudioData.Length bytes + } + + @if(Model.Lba44990AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990AudioSense)).Replace(" ", "
")) + } +
44990Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba44990AudioRwData != null) + { + @Model.Lba44990AudioRwData.Length bytes + } + + @if(Model.Lba44990AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990AudioPqSense)).Replace(" ", "
")) + } +
44990Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba44990AudioRwData != null) + { + @Model.Lba44990AudioRwData.Length bytes + } + + @if(Model.Lba44990AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990AudioRwSense)).Replace(" ", "
")) + } +
45000Data + ✔️ + + ❌️ + + @if(Model.Lba45000Data != null) + { + @Model.Lba45000Data.Length bytes + } + + @if(Model.Lba45000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000Sense)).Replace(" ", "
")) + } +
45000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba45000PqData != null) + { + @Model.Lba45000PqData.Length bytes + } + + @if(Model.Lba45000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000PqSense)).Replace(" ", "
")) + } +
45000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba45000RwData != null) + { + @Model.Lba45000RwData.Length bytes + } + + @if(Model.Lba45000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000RwSense)).Replace(" ", "
")) + } +
45000Audio + ✔️ + + ❌️ + + @if(Model.Lba45000AudioData != null) + { + @Model.Lba45000AudioData.Length bytes + } + + @if(Model.Lba45000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000AudioSense)).Replace(" ", "
")) + } +
45000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba45000AudioRwData != null) + { + @Model.Lba45000AudioRwData.Length bytes + } + + @if(Model.Lba45000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000AudioPqSense)).Replace(" ", "
")) + } +
45000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba45000AudioRwData != null) + { + @Model.Lba45000AudioRwData.Length bytes + } + + @if(Model.Lba45000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000AudioRwSense)).Replace(" ", "
")) + } +
50000Data + ✔️ + + ❌️ + + @if(Model.Lba50000Data != null) + { + @Model.Lba50000Data.Length bytes + } + + @if(Model.Lba50000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000Sense)).Replace(" ", "
")) + } +
50000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba50000PqData != null) + { + @Model.Lba50000PqData.Length bytes + } + + @if(Model.Lba50000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000PqSense)).Replace(" ", "
")) + } +
50000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba50000RwData != null) + { + @Model.Lba50000RwData.Length bytes + } + + @if(Model.Lba50000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000RwSense)).Replace(" ", "
")) + } +
50000Audio + ✔️ + + ❌️ + + @if(Model.Lba50000AudioData != null) + { + @Model.Lba50000AudioData.Length bytes + } + + @if(Model.Lba50000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000AudioSense)).Replace(" ", "
")) + } +
50000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba50000AudioRwData != null) + { + @Model.Lba50000AudioRwData.Length bytes + } + + @if(Model.Lba50000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000AudioPqSense)).Replace(" ", "
")) + } +
50000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba50000AudioRwData != null) + { + @Model.Lba50000AudioRwData.Length bytes + } + + @if(Model.Lba50000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000AudioRwSense)).Replace(" ", "
")) + } +
100000Data + ✔️ + + ❌️ + + @if(Model.Lba100000Data != null) + { + @Model.Lba100000Data.Length bytes + } + + @if(Model.Lba100000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000Sense)).Replace(" ", "
")) + } +
100000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba100000PqData != null) + { + @Model.Lba100000PqData.Length bytes + } + + @if(Model.Lba100000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000PqSense)).Replace(" ", "
")) + } +
100000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba100000RwData != null) + { + @Model.Lba100000RwData.Length bytes + } + + @if(Model.Lba100000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000RwSense)).Replace(" ", "
")) + } +
100000Audio + ✔️ + + ❌️ + + @if(Model.Lba100000AudioData != null) + { + @Model.Lba100000AudioData.Length bytes + } + + @if(Model.Lba100000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000AudioSense)).Replace(" ", "
")) + } +
100000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba100000AudioRwData != null) + { + @Model.Lba100000AudioRwData.Length bytes + } + + @if(Model.Lba100000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000AudioPqSense)).Replace(" ", "
")) + } +
100000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba100000AudioRwData != null) + { + @Model.Lba100000AudioRwData.Length bytes + } + + @if(Model.Lba100000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000AudioRwSense)).Replace(" ", "
")) + } +
400000Data + ✔️ + + ❌️ + + @if(Model.Lba400000Data != null) + { + @Model.Lba400000Data.Length bytes + } + + @if(Model.Lba400000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000Sense)).Replace(" ", "
")) + } +
400000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba400000PqData != null) + { + @Model.Lba400000PqData.Length bytes + } + + @if(Model.Lba400000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000PqSense)).Replace(" ", "
")) + } +
400000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba400000RwData != null) + { + @Model.Lba400000RwData.Length bytes + } + + @if(Model.Lba400000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000RwSense)).Replace(" ", "
")) + } +
400000Audio + ✔️ + + ❌️ + + @if(Model.Lba400000AudioData != null) + { + @Model.Lba400000AudioData.Length bytes + } + + @if(Model.Lba400000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000AudioSense)).Replace(" ", "
")) + } +
400000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba400000AudioRwData != null) + { + @Model.Lba400000AudioRwData.Length bytes + } + + @if(Model.Lba400000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000AudioPqSense)).Replace(" ", "
")) + } +
400000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba400000AudioRwData != null) + { + @Model.Lba400000AudioRwData.Length bytes + } + + @if(Model.Lba400000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000AudioRwSense)).Replace(" ", "
")) + } +
450000Data + ✔️ + + ❌️ + + @if(Model.Lba450000Data != null) + { + @Model.Lba450000Data.Length bytes + } + + @if(Model.Lba450000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000Sense)).Replace(" ", "
")) + } +
450000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba450000PqData != null) + { + @Model.Lba450000PqData.Length bytes + } + + @if(Model.Lba450000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000PqSense)).Replace(" ", "
")) + } +
450000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba450000RwData != null) + { + @Model.Lba450000RwData.Length bytes + } + + @if(Model.Lba450000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000RwSense)).Replace(" ", "
")) + } +
450000Audio + ✔️ + + ❌️ + + @if(Model.Lba450000AudioData != null) + { + @Model.Lba450000AudioData.Length bytes + } + + @if(Model.Lba450000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000AudioSense)).Replace(" ", "
")) + } +
450000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba450000AudioRwData != null) + { + @Model.Lba450000AudioRwData.Length bytes + } + + @if(Model.Lba450000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000AudioPqSense)).Replace(" ", "
")) + } +
450000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba450000AudioRwData != null) + { + @Model.Lba450000AudioRwData.Length bytes + } + + @if(Model.Lba450000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000AudioRwSense)).Replace(" ", "
")) + } +
+} +else +{ +

Swap disc not recognized, or firmware reset after tray opened.

+} +
+ + +
+
\ No newline at end of file diff --git a/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/Details.cshtml b/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/Details.cshtml new file mode 100644 index 00000000..867ee5b4 --- /dev/null +++ b/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/Details.cshtml @@ -0,0 +1,1146 @@ +@using Aaru.Decoders.SCSI +@model Aaru.CommonTypes.Metadata.GdRomSwapDiscCapabilities + +@{ + Layout = "~/Areas/Admin/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "Aaru Server"; +} +@{ + // /*************************************************************************** + // Aaru Data Preservation Suite + // ---------------------------------------------------------------------------- + // + // Filename : Details.cshtml + // Author(s) : Natalia Portillo + // + // Component : Aaru Server. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library 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 + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2020 Natalia Portillo + // ****************************************************************************/ +} +
+

GD-ROM swap-trick capabilities report

+
+@if(Model.TestCrashed) +{ +

Computer crashed while testing.

+} +else if(Model.RecognizedSwapDisc) +{ +

Swap disc Lead-Out starts at @($"{Model.SwapDiscLeadOutPMIN:X2}"):@($"{Model.SwapDiscLeadOutPSEC:X2}"):@($"{Model.SwapDiscLeadOutPFRAM:X2}") (@($"{Model.SwapDiscLeadOutStart}") sectors).

+
+
+
Minimum readable sector in HD area:
+
@Model.MinimumReadableSectorInHdArea
+
Maximum readable sector in HD area:
+
@Model.MaximumReadableSectorInHdArea
+ @if(Model.MaximumReadablePqInHdArea != null) + { +
Contents of last readable sector in HD area (with PQ):
+
+ @Model.MaximumReadablePqInHdArea.Length bytes +
+ } + @if(Model.MaximumReadableRwInHdArea != null) + { +
Contents of last readable sector in HD area (with RW):
+
+ @Model.MaximumReadableRwInHdArea.Length bytes +
+ } +
+ + + + + + + + + + + + @if(Model.Lba0Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba0ScrambledReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba44990AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba45000AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba50000AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba100000AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba400000AudioRwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000Readable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000PqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000RwReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000AudioReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000AudioPqReadable) + { + + } + else + { + + } + + + + + + + @if(Model.Lba450000AudioRwReadable) + { + + } + else + { + + } + + + +
LBARead modeStatusDataSense
0Data + ✔️ + + ❌️ + + @if(Model.Lba0Data != null) + { + @Model.Lba0Data.Length bytes + } + + @if(Model.Lba0DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba0Sense)).Replace(" ", "
")) + } +
0Audio (scrambled) + ✔️ + + ❌️ + + @if(Model.Lba0ScrambledData != null) + { + @Model.Lba0ScrambledData.Length bytes + } + + @if(Model.Lba0ScrambledDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba0ScrambledSense)).Replace(" ", "
")) + } +
44990Data + ✔️ + + ❌️ + + @if(Model.Lba44990Data != null) + { + @Model.Lba44990Data.Length bytes + } + + @if(Model.Lba44990DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990Sense)).Replace(" ", "
")) + } +
44990Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba44990PqData != null) + { + @Model.Lba44990PqData.Length bytes + } + + @if(Model.Lba44990PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990PqSense)).Replace(" ", "
")) + } +
44990Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba44990RwData != null) + { + @Model.Lba44990RwData.Length bytes + } + + @if(Model.Lba44990RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990RwSense)).Replace(" ", "
")) + } +
44990Audio + ✔️ + + ❌️ + + @if(Model.Lba44990AudioData != null) + { + @Model.Lba44990AudioData.Length bytes + } + + @if(Model.Lba44990AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990AudioSense)).Replace(" ", "
")) + } +
44990Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba44990AudioRwData != null) + { + @Model.Lba44990AudioRwData.Length bytes + } + + @if(Model.Lba44990AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990AudioPqSense)).Replace(" ", "
")) + } +
44990Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba44990AudioRwData != null) + { + @Model.Lba44990AudioRwData.Length bytes + } + + @if(Model.Lba44990AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba44990AudioRwSense)).Replace(" ", "
")) + } +
45000Data + ✔️ + + ❌️ + + @if(Model.Lba45000Data != null) + { + @Model.Lba45000Data.Length bytes + } + + @if(Model.Lba45000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000Sense)).Replace(" ", "
")) + } +
45000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba45000PqData != null) + { + @Model.Lba45000PqData.Length bytes + } + + @if(Model.Lba45000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000PqSense)).Replace(" ", "
")) + } +
45000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba45000RwData != null) + { + @Model.Lba45000RwData.Length bytes + } + + @if(Model.Lba45000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000RwSense)).Replace(" ", "
")) + } +
45000Audio + ✔️ + + ❌️ + + @if(Model.Lba45000AudioData != null) + { + @Model.Lba45000AudioData.Length bytes + } + + @if(Model.Lba45000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000AudioSense)).Replace(" ", "
")) + } +
45000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba45000AudioRwData != null) + { + @Model.Lba45000AudioRwData.Length bytes + } + + @if(Model.Lba45000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000AudioPqSense)).Replace(" ", "
")) + } +
45000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba45000AudioRwData != null) + { + @Model.Lba45000AudioRwData.Length bytes + } + + @if(Model.Lba45000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba45000AudioRwSense)).Replace(" ", "
")) + } +
50000Data + ✔️ + + ❌️ + + @if(Model.Lba50000Data != null) + { + @Model.Lba50000Data.Length bytes + } + + @if(Model.Lba50000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000Sense)).Replace(" ", "
")) + } +
50000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba50000PqData != null) + { + @Model.Lba50000PqData.Length bytes + } + + @if(Model.Lba50000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000PqSense)).Replace(" ", "
")) + } +
50000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba50000RwData != null) + { + @Model.Lba50000RwData.Length bytes + } + + @if(Model.Lba50000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000RwSense)).Replace(" ", "
")) + } +
50000Audio + ✔️ + + ❌️ + + @if(Model.Lba50000AudioData != null) + { + @Model.Lba50000AudioData.Length bytes + } + + @if(Model.Lba50000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000AudioSense)).Replace(" ", "
")) + } +
50000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba50000AudioRwData != null) + { + @Model.Lba50000AudioRwData.Length bytes + } + + @if(Model.Lba50000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000AudioPqSense)).Replace(" ", "
")) + } +
50000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba50000AudioRwData != null) + { + @Model.Lba50000AudioRwData.Length bytes + } + + @if(Model.Lba50000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba50000AudioRwSense)).Replace(" ", "
")) + } +
100000Data + ✔️ + + ❌️ + + @if(Model.Lba100000Data != null) + { + @Model.Lba100000Data.Length bytes + } + + @if(Model.Lba100000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000Sense)).Replace(" ", "
")) + } +
100000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba100000PqData != null) + { + @Model.Lba100000PqData.Length bytes + } + + @if(Model.Lba100000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000PqSense)).Replace(" ", "
")) + } +
100000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba100000RwData != null) + { + @Model.Lba100000RwData.Length bytes + } + + @if(Model.Lba100000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000RwSense)).Replace(" ", "
")) + } +
100000Audio + ✔️ + + ❌️ + + @if(Model.Lba100000AudioData != null) + { + @Model.Lba100000AudioData.Length bytes + } + + @if(Model.Lba100000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000AudioSense)).Replace(" ", "
")) + } +
100000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba100000AudioRwData != null) + { + @Model.Lba100000AudioRwData.Length bytes + } + + @if(Model.Lba100000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000AudioPqSense)).Replace(" ", "
")) + } +
100000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba100000AudioRwData != null) + { + @Model.Lba100000AudioRwData.Length bytes + } + + @if(Model.Lba100000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba100000AudioRwSense)).Replace(" ", "
")) + } +
400000Data + ✔️ + + ❌️ + + @if(Model.Lba400000Data != null) + { + @Model.Lba400000Data.Length bytes + } + + @if(Model.Lba400000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000Sense)).Replace(" ", "
")) + } +
400000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba400000PqData != null) + { + @Model.Lba400000PqData.Length bytes + } + + @if(Model.Lba400000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000PqSense)).Replace(" ", "
")) + } +
400000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba400000RwData != null) + { + @Model.Lba400000RwData.Length bytes + } + + @if(Model.Lba400000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000RwSense)).Replace(" ", "
")) + } +
400000Audio + ✔️ + + ❌️ + + @if(Model.Lba400000AudioData != null) + { + @Model.Lba400000AudioData.Length bytes + } + + @if(Model.Lba400000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000AudioSense)).Replace(" ", "
")) + } +
400000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba400000AudioRwData != null) + { + @Model.Lba400000AudioRwData.Length bytes + } + + @if(Model.Lba400000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000AudioPqSense)).Replace(" ", "
")) + } +
400000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba400000AudioRwData != null) + { + @Model.Lba400000AudioRwData.Length bytes + } + + @if(Model.Lba400000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba400000AudioRwSense)).Replace(" ", "
")) + } +
450000Data + ✔️ + + ❌️ + + @if(Model.Lba450000Data != null) + { + @Model.Lba450000Data.Length bytes + } + + @if(Model.Lba450000DecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000Sense)).Replace(" ", "
")) + } +
450000Data (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba450000PqData != null) + { + @Model.Lba450000PqData.Length bytes + } + + @if(Model.Lba450000PqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000PqSense)).Replace(" ", "
")) + } +
450000Data (with RW) + ✔️ + + ❌️ + + @if(Model.Lba450000RwData != null) + { + @Model.Lba450000RwData.Length bytes + } + + @if(Model.Lba450000RwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000RwSense)).Replace(" ", "
")) + } +
450000Audio + ✔️ + + ❌️ + + @if(Model.Lba450000AudioData != null) + { + @Model.Lba450000AudioData.Length bytes + } + + @if(Model.Lba450000AudioDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000AudioSense)).Replace(" ", "
")) + } +
450000Audio (with PQ) + ✔️ + + ❌️ + + @if(Model.Lba450000AudioRwData != null) + { + @Model.Lba450000AudioRwData.Length bytes + } + + @if(Model.Lba450000AudioPqDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000AudioPqSense)).Replace(" ", "
")) + } +
450000Audio (with RW) + ✔️ + + ❌️ + + @if(Model.Lba450000AudioRwData != null) + { + @Model.Lba450000AudioRwData.Length bytes + } + + @if(Model.Lba450000AudioRwDecodedSense != null) + { + @Html.Raw(Html.Encode(Sense.PrettifySense(Model.Lba450000AudioRwSense)).Replace(" ", "
")) + } +
+} +else +{ +

Swap disc not recognized, or firmware reset after tray opened.

+} +
\ No newline at end of file diff --git a/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/ViewData.cshtml b/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/ViewData.cshtml new file mode 100644 index 00000000..8bf03b50 --- /dev/null +++ b/Aaru.Server/Areas/Admin/Views/GdRomSwapDiscCapabilities/ViewData.cshtml @@ -0,0 +1,29 @@ +@model TestedMediaDataModel + +@{ + ViewBag.Title = $"{Model.DataName} data"; + Layout = "_Layout"; +} +

Showing data from @Model.DataName for GD-ROM capabilities id @Model.TestedMediaId

+@if(Model.Decoded is null && + Model.RawDataAsHex is null) +{ +
No data found
+} + +@if(Model.RawDataAsHex != null) +{ +

Hex dump:

+
+ @Html.Raw(Model.RawDataAsHex) +
+} + + +@if(Model.Decoded != null) +{ +

Decoded information:

+
+ @Html.Raw(Model.Decoded) +
+} \ No newline at end of file diff --git a/Aaru.Server/Areas/Admin/Views/Reports/Details.cshtml b/Aaru.Server/Areas/Admin/Views/Reports/Details.cshtml index c831b2af..1319e480 100644 --- a/Aaru.Server/Areas/Admin/Views/Reports/Details.cshtml +++ b/Aaru.Server/Areas/Admin/Views/Reports/Details.cshtml @@ -92,6 +92,12 @@ USB report
} +@if(Model.Report.GdRomSwapDiscCapabilitiesId != null) +{ + +} @if(Model.Report.FireWire != null) {