diff --git a/DiscImageChef.Server/Areas/Admin/Controllers/ScsisController.cs b/DiscImageChef.Server/Areas/Admin/Controllers/ScsisController.cs index 1d049f21..43d3825e 100644 --- a/DiscImageChef.Server/Areas/Admin/Controllers/ScsisController.cs +++ b/DiscImageChef.Server/Areas/Admin/Controllers/ScsisController.cs @@ -1,7 +1,10 @@ using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Threading.Tasks; using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.ATA; +using DiscImageChef.Decoders.SCSI; using DiscImageChef.Server.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -150,5 +153,133 @@ namespace DiscImageChef.Server.Areas.Admin.Controllers return RedirectToAction(nameof(Index)); } + + public IActionResult Compare(int id, int rightId) + { + var model = new CompareModel + { + LeftId = id, RightId = rightId + }; + + CommonTypes.Metadata.Scsi left = _context.Scsi.FirstOrDefault(l => l.Id == id); + CommonTypes.Metadata.Scsi right = _context.Scsi.FirstOrDefault(r => r.Id == rightId); + + if(left is null) + { + model.ErrorMessage = $"SCSI with id {id} has not been found"; + model.HasError = true; + + return View(model); + } + + if(right is null) + { + model.ErrorMessage = $"SCSI with id {rightId} has not been found"; + model.HasError = true; + + return View(model); + } + + Inquiry.SCSIInquiry? leftNullable = left.Inquiry; + Inquiry.SCSIInquiry? rightNullable = right.Inquiry; + model.ValueNames = new List(); + model.LeftValues = new List(); + model.RightValues = new List(); + + if(!leftNullable.HasValue && + !rightNullable.HasValue) + { + model.AreEqual = true; + + return View(model); + } + + if(leftNullable.HasValue && + !rightNullable.HasValue) + { + model.ValueNames.Add("Decoded"); + model.LeftValues.Add("decoded"); + model.RightValues.Add("null"); + + return View(model); + } + + if(!leftNullable.HasValue) + { + model.ValueNames.Add("Decoded"); + model.LeftValues.Add("null"); + model.RightValues.Add("decoded"); + + return View(model); + } + + var leftValue = left.Inquiry.Value; + var rightValue = right.Inquiry.Value; + + foreach(FieldInfo fieldInfo in leftValue.GetType().GetFields()) + { + object lv = fieldInfo.GetValue(leftValue); + object rv = fieldInfo.GetValue(rightValue); + + if(fieldInfo.FieldType.IsArray) + { + object[] la = lv as object[]; + object[] ra = rv as object[]; + + switch(la) + { + case null when ra is null: continue; + case null: + model.ValueNames.Add(fieldInfo.Name); + model.LeftValues.Add("null"); + model.RightValues.Add("[]"); + + continue; + } + + if(ra is null) + { + model.ValueNames.Add(fieldInfo.Name); + model.LeftValues.Add("[]"); + model.RightValues.Add("null"); + + continue; + } + + if(la.SequenceEqual(ra)) + continue; + + model.ValueNames.Add(fieldInfo.Name); + model.LeftValues.Add("[]"); + model.RightValues.Add("[]"); + } + else if(lv == null && + rv == null) { } + else if(lv != null && + rv == null) + { + model.ValueNames.Add(fieldInfo.Name); + model.LeftValues.Add($"{lv}"); + model.RightValues.Add("null"); + } + else if(lv == null) + { + model.ValueNames.Add(fieldInfo.Name); + model.LeftValues.Add("null"); + model.RightValues.Add($"{rv}"); + } + else if(!lv.Equals(rv)) + + { + model.ValueNames.Add(fieldInfo.Name); + model.LeftValues.Add($"{lv}"); + model.RightValues.Add($"{rv}"); + } + } + + model.AreEqual = model.LeftValues.Count == 0 && model.RightValues.Count == 0; + + return View(model); + } } } \ No newline at end of file diff --git a/DiscImageChef.Server/Areas/Admin/Views/Scsis/Compare.cshtml b/DiscImageChef.Server/Areas/Admin/Views/Scsis/Compare.cshtml new file mode 100644 index 00000000..fe88601a --- /dev/null +++ b/DiscImageChef.Server/Areas/Admin/Views/Scsis/Compare.cshtml @@ -0,0 +1,84 @@ +@model CompareModel + +@{ + Layout = "~/Areas/Admin/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : Details.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef 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-2019 Natalia Portillo + // ****************************************************************************/ +} +

Comparing SCSI INQUIRY ID @Model.LeftId with ID @Model.RightId

+@if (Model.AreEqual) +{ +

No differences found.

+ return; +} + +@if (Model.HasError) +{ +

@Model.ErrorMessage

+ return; +} + + + + + + + + + + + @for (var i = 0; i < Model.ValueNames.Count; i++) + { + + + + + + } + +
+ Value name + + ID: @Model.LeftId + + ID: @Model.RightId +
+ @Model.ValueNames[i] + + @Model.LeftValues[i] + + @Model.RightValues[i] +
+Back to List +Delete ID @Model.LeftId +Delete ID @Model.RightId +Replace all dependencies from ID @Model.RightId with ID @Model.LeftId +Replace all dependencies from ID @Model.LeftId with ID @Model.RightId \ No newline at end of file