From ba50144dca5dab8be8189a59565a8712074eb983 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 2 Dec 2015 06:34:12 +0000 Subject: [PATCH] Implemented decoding DVD-RAM medium status. --- DiscImageChef.Decoders/ChangeLog | 5 ++ DiscImageChef.Decoders/DVD/Cartridge.cs | 88 ++++++++++++++++++++++++- DiscImageChef/ChangeLog | 5 ++ DiscImageChef/Commands/MediaInfo.cs | 3 + 4 files changed, 100 insertions(+), 1 deletion(-) diff --git a/DiscImageChef.Decoders/ChangeLog b/DiscImageChef.Decoders/ChangeLog index 6f05aefd..489ab985 100644 --- a/DiscImageChef.Decoders/ChangeLog +++ b/DiscImageChef.Decoders/ChangeLog @@ -1,3 +1,8 @@ +2015-12-02 Natalia Portillo + + * DVD/Cartridge.cs: + Implemented decoding DVD-RAM medium status. + 2015-12-02 Natalia Portillo * DVD/DDS.cs: diff --git a/DiscImageChef.Decoders/DVD/Cartridge.cs b/DiscImageChef.Decoders/DVD/Cartridge.cs index bc4fa293..479d4ef7 100644 --- a/DiscImageChef.Decoders/DVD/Cartridge.cs +++ b/DiscImageChef.Decoders/DVD/Cartridge.cs @@ -36,6 +36,7 @@ // ****************************************************************************/ // //$Id$ using System; +using System.Text; namespace DiscImageChef.Decoders.DVD { @@ -53,7 +54,6 @@ namespace DiscImageChef.Decoders.DVD /// T10/1675-D revision 2c /// T10/1675-D revision 4 /// T10/1836-D revision 2g - /// ECMA 365 /// public static class Cartridge { @@ -125,6 +125,92 @@ namespace DiscImageChef.Decoders.DVD /// public byte RAMSWI; } + + public static MediumStatus? Decode(byte[] response) + { + if (response == null) + return null; + + if (response.Length != 8) + return null; + + MediumStatus status = new MediumStatus(); + + status.DataLength = (ushort)((response[0] << 8) + response[1]); + status.Reserved1 = response[2]; + status.Reserved2 = response[3]; + status.Cartridge |= (response[4] & 0x80) == 0x80; + status.OUT |= (response[4] & 0x40) == 0x40; + status.Reserved3 = (byte)((response[4] & 0x30) >> 4); + status.MSWI |= (response[4] & 0x08) == 0x08; + status.CWP |= (response[4] & 0x04) == 0x04; + status.PWP |= (response[4] & 0x02) == 0x02; + status.Reserved4 |= (response[4] & 0x01) == 0x01; + status.DiscType = response[5]; + status.Reserved5 = response[6]; + status.RAMSWI = response[7]; + + return status; + } + + public static string Prettify(MediumStatus? status) + { + if (status == null) + return null; + + MediumStatus decoded = status.Value; + StringBuilder sb = new StringBuilder(); + + if (decoded.PWP) + sb.AppendLine("Disc surface is set to write protected status"); + + if (decoded.Cartridge) + { + sb.AppendLine("Disc comes in a cartridge"); + if (decoded.OUT) + sb.AppendLine("Disc has been extracted from the cartridge"); + if (decoded.CWP) + sb.AppendLine("Cartridge is set to write protected"); + } + + switch (decoded.DiscType) + { + case 0: + sb.AppendLine("Disc shall not be written without a cartridge"); + break; + case 0x10: + sb.AppendLine("Disc may be written without a cartridge"); + break; + default: + sb.AppendFormat("Unknown disc type id {0}", decoded.DiscType).AppendLine(); + break; + } + + if (decoded.MSWI) + { + switch (decoded.RAMSWI) + { + case 0: + break; + case 1: + sb.AppendLine("Disc is write inhibited because it has been extracted from the cartridge"); + break; + case 0xFF: + sb.AppendLine("Disc is write inhibited for an unspecified reason"); + break; + default: + sb.AppendFormat("Disc has unknown reason {0} for write inhibition", decoded.RAMSWI).AppendLine(); + break; + } + } + + return sb.ToString(); + } + + public static string Prettify(byte[] response) + { + return Prettify(Decode(response)); + } } } diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index 62756095..1b1fee22 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,8 @@ +2015-12-02 Natalia Portillo + + * Commands/MediaInfo.cs: + Implemented decoding DVD-RAM medium status. + 2015-12-02 Natalia Portillo * Commands/MediaInfo.cs: diff --git a/DiscImageChef/Commands/MediaInfo.cs b/DiscImageChef/Commands/MediaInfo.cs index d2bf8519..7a4c27bf 100644 --- a/DiscImageChef/Commands/MediaInfo.cs +++ b/DiscImageChef/Commands/MediaInfo.cs @@ -423,7 +423,10 @@ namespace DiscImageChef.Commands if(sense) DicConsole.ErrorWriteLine("READ DISC STRUCTURE: Medium Status\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf)); else + { doWriteFile(outputPrefix, "_readdiscstructure_dvdram_status.bin", "SCSI READ DISC STRUCTURE", cmdBuf); + DicConsole.WriteLine("Medium Status:\n{0}", Decoders.DVD.Cartridge.Prettify(cmdBuf)); + } sense = dev.ReadDiscStructure(out cmdBuf, out senseBuf, MmcDiscStructureMediaType.DVD, 0, 0, MmcDiscStructureFormat.DVDRAM_SpareAreaInformation, 0, dev.Timeout, out duration); if(sense) DicConsole.ErrorWriteLine("READ DISC STRUCTURE: SAI\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));