Add test for inter-session reading in multi-session discs to device reports.

This commit is contained in:
2019-01-02 22:27:02 +00:00
parent 80a4a65934
commit 597f27a3ae
12 changed files with 1923 additions and 0 deletions

View File

@@ -330,6 +330,8 @@
<e p="20181225152947_StoreMmcGetConfigurationResponse.cs" t="Include" />
<e p="20181225214500_StoreReadResultsInReportDatabase.Designer.cs" t="Include" />
<e p="20181225214500_StoreReadResultsInReportDatabase.cs" t="Include" />
<e p="20190102061236_AddMultisessionLeadTest.Designer.cs" t="Include" />
<e p="20190102061236_AddMultisessionLeadTest.cs" t="Include" />
<e p="DicContextModelSnapshot.cs" t="Include" />
</e>
<e p="Models" t="Include">
@@ -1853,6 +1855,9 @@
<e p="201812252219066_StoreReadResultsInReportDatabase.Designer.cs" t="Include" />
<e p="201812252219066_StoreReadResultsInReportDatabase.cs" t="Include" />
<e p="201812252219066_StoreReadResultsInReportDatabase.resx" t="Include" />
<e p="201901022133012_AddMultisessionLeadTest.Designer.cs" t="Include" />
<e p="201901022133012_AddMultisessionLeadTest.cs" t="Include" />
<e p="201901022133012_AddMultisessionLeadTest.resx" t="Include" />
<e p="Configuration.cs" t="Include" />
</e>
<e p="Models" t="Include">

View File

@@ -1338,6 +1338,11 @@ namespace DiscImageChef.CommonTypes.Metadata
public bool? SupportsReadLongRetry { get; set; }
public bool? SupportsSeek { get; set; }
public bool? CanReadingIntersessionLeadIn { get; set; }
public bool? CanReadingIntersessionLeadOut { get; set; }
public byte[] IntersessionLeadInData { get; set; }
public byte[] IntersessionLeadOutData { get; set; }
[JsonIgnore]
public long? BlocksSql
{

View File

@@ -31,9 +31,11 @@
// ****************************************************************************/
using System;
using System.Linq;
using System.Text;
using DiscImageChef.CommonTypes.Metadata;
using DiscImageChef.Console;
using DiscImageChef.Decoders.CD;
using DiscImageChef.Decoders.SCSI;
using DiscImageChef.Decoders.SCSI.MMC;
using DiscImageChef.Devices;
@@ -1210,6 +1212,129 @@ namespace DiscImageChef.Core.Devices.Report
if(mediaTest.SupportsHLDTSTReadRawDVD == true && debug) mediaTest.HLDTSTReadRawDVDData = buffer;
// This is for checking multi-session support, and inter-session lead-in/out reading, as Enhanced CD are
if(mediaType == "Enhanced CD (aka E-CD, CD-Plus or CD+)")
{
DicConsole.WriteLine("Querying CD Full TOC...");
mediaTest.CanReadFullTOC = !dev.ReadRawToc(out buffer, out senseBuffer, 1, dev.Timeout, out _);
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
if(debug) mediaTest.FullTocData = buffer;
if(mediaTest.CanReadFullTOC == true)
{
FullTOC.CDFullTOC? decodedTocNullable = FullTOC.Decode(buffer);
mediaTest.CanReadFullTOC = decodedTocNullable.HasValue;
if(mediaTest.CanReadFullTOC == true)
{
FullTOC.CDFullTOC decodedToc = decodedTocNullable.Value;
if(!decodedToc.TrackDescriptors.Any(t => t.SessionNumber > 1))
{
DicConsole
.ErrorWriteLine("Could not find second session. Have you inserted the correct type of disc?");
return null;
}
FullTOC.TrackDataDescriptor firstSessionLeadOutTrack =
decodedToc.TrackDescriptors.FirstOrDefault(t => t.SessionNumber == 1 && t.POINT == 0xA2);
FullTOC.TrackDataDescriptor secondSessionFirstTrack =
decodedToc.TrackDescriptors.FirstOrDefault(t => t.SessionNumber > 1 && t.POINT <= 99);
if(firstSessionLeadOutTrack.SessionNumber == 0 || secondSessionFirstTrack.SessionNumber == 0)
{
DicConsole
.ErrorWriteLine("Could not find second session. Have you inserted the correct type of disc?");
return null;
}
DicConsole.DebugWriteLine("SCSI Report",
"First session Lead-Out starts at {0:D2}:{1:D2}:{2:D2}",
firstSessionLeadOutTrack.PMIN, firstSessionLeadOutTrack.PSEC,
firstSessionLeadOutTrack.PFRAME);
DicConsole.DebugWriteLine("SCSI Report", "Second session starts at {0:D2}:{1:D2}:{2:D2}",
secondSessionFirstTrack.PMIN, secondSessionFirstTrack.PSEC,
secondSessionFirstTrack.PFRAME);
// Skip Lead-Out pre-gap
uint firstSessionLeadOutLba = (uint)(firstSessionLeadOutTrack.PMIN * 60 * 75 +
firstSessionLeadOutTrack.PSEC * 75 +
firstSessionLeadOutTrack.PFRAME + 150);
// Skip second session track pre-gap
uint secondSessionLeadInLba = (uint)(secondSessionFirstTrack.PMIN * 60 * 75 +
secondSessionFirstTrack.PSEC * 75 +
secondSessionFirstTrack.PFRAME - 300);
DicConsole.WriteLine("Trying SCSI READ CD in first session Lead-Out...");
mediaTest.CanReadingIntersessionLeadOut = !dev.ReadCd(out buffer, out senseBuffer,
firstSessionLeadOutLba, 2448, 1,
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.AllHeaders, true,
false, MmcErrorField.None,
MmcSubchannel.Raw, dev.Timeout, out _);
if(mediaTest.CanReadingIntersessionLeadOut == false)
{
mediaTest.CanReadingIntersessionLeadOut = !dev.ReadCd(out buffer, out senseBuffer,
firstSessionLeadOutLba, 2368, 1,
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.AllHeaders,
true, false, MmcErrorField.None,
MmcSubchannel.Q16, dev.Timeout,
out _);
if(mediaTest.CanReadingIntersessionLeadOut == false)
mediaTest.CanReadingIntersessionLeadOut = !dev.ReadCd(out buffer, out senseBuffer,
firstSessionLeadOutLba, 2352, 1,
MmcSectorTypes.AllTypes, false,
false, false,
MmcHeaderCodes.AllHeaders, true,
false, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout,
out _);
}
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadingIntersessionLeadOut);
if(debug) mediaTest.IntersessionLeadOutData = buffer;
DicConsole.WriteLine("Trying SCSI READ CD in second session Lead-In...");
mediaTest.CanReadingIntersessionLeadIn = !dev.ReadCd(out buffer, out senseBuffer,
secondSessionLeadInLba, 2448, 1,
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.AllHeaders, true,
false, MmcErrorField.None,
MmcSubchannel.Raw, dev.Timeout, out _);
if(mediaTest.CanReadingIntersessionLeadIn == false)
{
mediaTest.CanReadingIntersessionLeadIn = !dev.ReadCd(out buffer, out senseBuffer,
secondSessionLeadInLba, 2368, 1,
MmcSectorTypes.AllTypes, false, false,
false, MmcHeaderCodes.AllHeaders, true,
false, MmcErrorField.None,
MmcSubchannel.Q16, dev.Timeout, out _);
if(mediaTest.CanReadingIntersessionLeadIn == false)
mediaTest.CanReadingIntersessionLeadIn = !dev.ReadCd(out buffer, out senseBuffer,
secondSessionLeadInLba, 2352, 1,
MmcSectorTypes.AllTypes, false,
false, false,
MmcHeaderCodes.AllHeaders, true,
false, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout,
out _);
}
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
!mediaTest.CanReadingIntersessionLeadIn);
if(debug) mediaTest.IntersessionLeadInData = buffer;
}
}
}
return mediaTest;
}
}

View File

@@ -90,6 +90,8 @@
<Compile Include="Migrations\20181225152947_StoreMmcGetConfigurationResponse.Designer.cs" />
<Compile Include="Migrations\20181225214500_StoreReadResultsInReportDatabase.cs" />
<Compile Include="Migrations\20181225214500_StoreReadResultsInReportDatabase.Designer.cs" />
<Compile Include="Migrations\20190102061236_AddMultisessionLeadTest.cs" />
<Compile Include="Migrations\20190102061236_AddMultisessionLeadTest.Designer.cs" />
<Compile Include="Migrations\DicContextModelSnapshot.cs" />
<Compile Include="Models\CdOffset.cs" />
<Compile Include="Models\Command.cs" />

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace DiscImageChef.Database.Migrations
{
public partial class AddMultisessionLeadTest : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>("CanReadingIntersessionLeadIn", "TestedMedia", nullable: true);
migrationBuilder.AddColumn<bool>("CanReadingIntersessionLeadOut", "TestedMedia", nullable: true);
migrationBuilder.AddColumn<byte[]>("IntersessionLeadInData", "TestedMedia", nullable: true);
migrationBuilder.AddColumn<byte[]>("IntersessionLeadOutData", "TestedMedia", nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn("CanReadingIntersessionLeadIn", "TestedMedia");
migrationBuilder.DropColumn("CanReadingIntersessionLeadOut", "TestedMedia");
migrationBuilder.DropColumn("IntersessionLeadInData", "TestedMedia");
migrationBuilder.DropColumn("IntersessionLeadOutData", "TestedMedia");
}
}
}

View File

@@ -709,6 +709,10 @@ namespace DiscImageChef.Database.Migrations
b.Property<bool?>("CanReadTOC");
b.Property<bool?>("CanReadingIntersessionLeadIn");
b.Property<bool?>("CanReadingIntersessionLeadOut");
b.Property<byte[]>("CmiData");
b.Property<byte[]>("CorrectedSubchannelData");
@@ -743,6 +747,10 @@ namespace DiscImageChef.Database.Migrations
b.Property<byte[]>("IdentifyData");
b.Property<byte[]>("IntersessionLeadInData");
b.Property<byte[]>("IntersessionLeadOutData");
b.Property<ulong?>("LBA48Sectors");
b.Property<long?>("LBA48SectorsSql");

View File

@@ -256,6 +256,10 @@
<Compile Include="Migrations\201812252219066_StoreReadResultsInReportDatabase.Designer.cs">
<DependentUpon>201812252219066_StoreReadResultsInReportDatabase.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\201901022133012_AddMultisessionLeadTest.cs" />
<Compile Include="Migrations\201901022133012_AddMultisessionLeadTest.Designer.cs">
<DependentUpon>201901022133012_AddMultisessionLeadTest.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\Configuration.cs" />
<Compile Include="Models\CdOffset.cs" />
<Compile Include="Models\Command.cs" />
@@ -380,6 +384,9 @@
<EmbeddedResource Include="Migrations\201812252219066_StoreReadResultsInReportDatabase.resx">
<DependentUpon>201812252219066_StoreReadResultsInReportDatabase.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Migrations\201901022133012_AddMultisessionLeadTest.resx">
<DependentUpon>201901022133012_AddMultisessionLeadTest.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>

View File

@@ -0,0 +1,29 @@
// <auto-generated />
namespace DiscImageChef.Server.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")]
public sealed partial class AddMultisessionLeadTest : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddMultisessionLeadTest));
string IMigrationMetadata.Id
{
get { return "201901022133012_AddMultisessionLeadTest"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

View File

@@ -0,0 +1,23 @@
using System.Data.Entity.Migrations;
namespace DiscImageChef.Server.Migrations
{
public partial class AddMultisessionLeadTest : DbMigration
{
public override void Up()
{
AddColumn("dbo.TestedMedias", "CanReadingIntersessionLeadIn", c => c.Boolean());
AddColumn("dbo.TestedMedias", "CanReadingIntersessionLeadOut", c => c.Boolean());
AddColumn("dbo.TestedMedias", "IntersessionLeadInData", c => c.Binary());
AddColumn("dbo.TestedMedias", "IntersessionLeadOutData", c => c.Binary());
}
public override void Down()
{
DropColumn("dbo.TestedMedias", "IntersessionLeadOutData");
DropColumn("dbo.TestedMedias", "IntersessionLeadInData");
DropColumn("dbo.TestedMedias", "CanReadingIntersessionLeadOut");
DropColumn("dbo.TestedMedias", "CanReadingIntersessionLeadIn");
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -317,6 +317,7 @@ namespace DiscImageChef.Commands
{
mediaTypes.Add("CD-ROM");
mediaTypes.Add("Audio CD");
mediaTypes.Add("Enhanced CD (aka E-CD, CD-Plus or CD+)");
if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadCDR) mediaTypes.Add("CD-R");
if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadCDRW)
{
@@ -434,6 +435,8 @@ namespace DiscImageChef.Commands
mediaTypes.Add("CD-RW High Speed (marked between 8x and 12x)");
if(!mediaTypes.Contains("CD-RW (marked 4x or lower)"))
mediaTypes.Add("CD-RW (marked 4x or lower)");
if(!mediaTypes.Contains("Enhanced CD (aka E-CD, CD-Plus or CD+)"))
mediaTypes.Add("Enhanced CD (aka E-CD, CD-Plus or CD+)");
}
mediaTypes.Sort();
@@ -587,6 +590,8 @@ namespace DiscImageChef.Commands
mediaTest = reporter.ReportMmcMedia(mediaType, tryPlextor, tryPioneer, tryNec,
tryHldtst);
if(mediaTest is null) continue;
if(mediaTest.SupportsReadLong == true &&
mediaTest.LongBlockSize == mediaTest.BlockSize)
{