diff --git a/DiscImageChef.CommonTypes.csproj b/DiscImageChef.CommonTypes.csproj
index cacec77..6032dc4 100644
--- a/DiscImageChef.CommonTypes.csproj
+++ b/DiscImageChef.CommonTypes.csproj
@@ -76,6 +76,7 @@
+
diff --git a/Metadata/DeviceReportV2.cs b/Metadata/DeviceReportV2.cs
new file mode 100644
index 0000000..0fd9cd6
--- /dev/null
+++ b/Metadata/DeviceReportV2.cs
@@ -0,0 +1,422 @@
+// /***************************************************************************
+// The Disc Image Chef
+// ----------------------------------------------------------------------------
+//
+// Filename : DeviceReportV2.cs
+// Author(s) : Natalia Portillo
+//
+// Component : JSON metadata.
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Contains classes for a JSON device report.
+//
+// --[ License ] --------------------------------------------------------------
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// ----------------------------------------------------------------------------
+// Copyright © 2011-2018 Natalia Portillo
+// ****************************************************************************/
+
+using System;
+using System.Xml.Serialization;
+using DiscImageChef.Decoders.ATA;
+using DiscImageChef.Decoders.SCSI;
+using DiscImageChef.Decoders.SCSI.MMC;
+
+// ReSharper disable InconsistentNaming
+// ReSharper disable UnusedAutoPropertyAccessor.Global
+
+namespace DiscImageChef.CommonTypes.Metadata
+{
+ public class DeviceReportV2
+ {
+ public Usb USB { get; set; }
+ public FireWire FireWire { get; set; }
+ public Pcmcia PCMCIA { get; set; }
+ public bool CompactFlash { get; set; }
+ public Ata ATA { get; set; }
+ public Ata ATAPI { get; set; }
+ public Scsi SCSI { get; set; }
+ public MmcSd MultiMediaCard { get; set; }
+ public MmcSd SecureDigital { get; set; }
+ }
+
+ public class Usb
+ {
+ public ushort VendorID { get; set; }
+ public ushort ProductID { get; set; }
+ public string Manufacturer { get; set; }
+ public string Product { get; set; }
+ public bool RemovableMedia { get; set; }
+ public byte[] Descriptors { get; set; }
+ }
+
+ public class FireWire
+ {
+ public uint VendorID { get; set; }
+ public uint ProductID { get; set; }
+ public string Manufacturer { get; set; }
+ public string Product { get; set; }
+ public bool RemovableMedia { get; set; }
+ }
+
+ public class Ata
+ {
+ public Identify.IdentifyDevice? IdentifyDevice { get; set; }
+
+ public byte[] Identify { get; set; }
+
+ public TestedMedia ReadCapabilities { get; set; }
+ public TestedMedia[] RemovableMedias { get; set; }
+ }
+
+ public class Chs
+ {
+ public ushort Cylinders { get; set; }
+ public ushort Heads { get; set; }
+ public ushort Sectors { get; set; }
+ }
+
+ public class Scsi
+ {
+ public Inquiry.SCSIInquiry? Inquiry { get; set; }
+ public byte[] InquiryData { get; set; }
+ public ScsiPage[] EVPDPages { get; set; }
+ public bool SupportsModeSense6 { get; set; }
+ public bool SupportsModeSense10 { get; set; }
+ public bool SupportsModeSubpages { get; set; }
+ public ScsiMode ModeSense { get; set; }
+ public Mmc MultiMediaDevice { get; set; }
+ public TestedMedia ReadCapabilities { get; set; }
+ public TestedMedia[] RemovableMedias { get; set; }
+ public Ssc SequentialDevice { get; set; }
+ public byte[] ModeSense6Data { get; set; }
+ public byte[] ModeSense10Data { get; set; }
+ }
+
+ public class ScsiMode
+ {
+ public byte? MediumType { get; set; }
+ public bool WriteProtected { get; set; }
+ public BlockDescriptor[] BlockDescriptors { get; set; }
+ public byte? Speed { get; set; }
+ public byte? BufferedMode { get; set; }
+ public bool BlankCheckEnabled { get; set; }
+ public bool DPOandFUA { get; set; }
+ public ScsiPage[] ModePages { get; set; }
+ }
+
+ public class BlockDescriptor
+ {
+ public byte Density { get; set; }
+ public ulong? Blocks { get; set; }
+ public uint? BlockLength { get; set; }
+
+ [XmlIgnore]
+ public bool BlocksSpecified { get; set; }
+ [XmlIgnore]
+ public bool BlockLengthSpecified { get; set; }
+ }
+
+ public class ScsiPage
+ {
+ public byte page { get; set; }
+ public byte subpage { get; set; }
+ public byte[] value { get; set; }
+ }
+
+ public class Mmc
+ {
+ public Modes.ModePage_2A? ModeSense2A { get; set; }
+ public MmcFeatures Features { get; set; }
+ public TestedMedia[] TestedMedia { get; set; }
+ }
+
+ public class MmcFeatures
+ {
+ public byte? AACSVersion { get; set; }
+ public byte? AGIDs { get; set; }
+ public byte? BindingNonceBlocks { get; set; }
+ public ushort? BlocksPerReadableUnit { get; set; }
+ public bool BufferUnderrunFreeInDVD { get; set; }
+ public bool BufferUnderrunFreeInSAO { get; set; }
+ public bool BufferUnderrunFreeInTAO { get; set; }
+ public bool CanAudioScan { get; set; }
+ public bool CanEject { get; set; }
+ public bool CanEraseSector { get; set; }
+ public bool CanExpandBDRESpareArea { get; set; }
+ public bool CanFormat { get; set; }
+ public bool CanFormatBDREWithoutSpare { get; set; }
+ public bool CanFormatCert { get; set; }
+ public bool CanFormatFRF { get; set; }
+ public bool CanFormatQCert { get; set; }
+ public bool CanFormatRRM { get; set; }
+ public bool CanGenerateBindingNonce { get; set; }
+ public bool CanLoad { get; set; }
+ public bool CanMuteSeparateChannels { get; set; }
+ public bool CanOverwriteSAOTrack { get; set; }
+ public bool CanOverwriteTAOTrack { get; set; }
+ public bool CanPlayCDAudio { get; set; }
+ public bool CanPseudoOverwriteBDR { get; set; }
+ public bool CanReadAllDualR { get; set; }
+ public bool CanReadAllDualRW { get; set; }
+ public bool CanReadBD { get; set; }
+ public bool CanReadBDR { get; set; }
+ public bool CanReadBDRE1 { get; set; }
+ public bool CanReadBDRE2 { get; set; }
+ public bool CanReadBDROM { get; set; }
+ public bool CanReadBluBCA { get; set; }
+ public bool CanReadCD { get; set; }
+ public bool CanReadCDMRW { get; set; }
+ public bool CanReadCPRM_MKB { get; set; }
+ public bool CanReadDDCD { get; set; }
+ public bool CanReadDVD { get; set; }
+ public bool CanReadDVDPlusMRW { get; set; }
+ public bool CanReadDVDPlusR { get; set; }
+ public bool CanReadDVDPlusRDL { get; set; }
+ public bool CanReadDVDPlusRW { get; set; }
+ public bool CanReadDVDPlusRWDL { get; set; }
+ public bool CanReadDriveAACSCertificate { get; set; }
+ public bool CanReadHDDVD { get; set; }
+ public bool CanReadHDDVDR { get; set; }
+ public bool CanReadHDDVDRAM { get; set; }
+ public bool CanReadLeadInCDText { get; set; }
+ public bool CanReadOldBDR { get; set; }
+ public bool CanReadOldBDRE { get; set; }
+ public bool CanReadOldBDROM { get; set; }
+ public bool CanReadSpareAreaInformation { get; set; }
+ public bool CanReportDriveSerial { get; set; }
+ public bool CanReportMediaSerial { get; set; }
+ public bool CanTestWriteDDCDR { get; set; }
+ public bool CanTestWriteDVD { get; set; }
+ public bool CanTestWriteInSAO { get; set; }
+ public bool CanTestWriteInTAO { get; set; }
+ public bool CanUpgradeFirmware { get; set; }
+ public bool CanWriteBD { get; set; }
+ public bool CanWriteBDR { get; set; }
+ public bool CanWriteBDRE1 { get; set; }
+ public bool CanWriteBDRE2 { get; set; }
+ public bool CanWriteBusEncryptedBlocks { get; set; }
+ public bool CanWriteCDMRW { get; set; }
+ public bool CanWriteCDRW { get; set; }
+ public bool CanWriteCDRWCAV { get; set; }
+ public bool CanWriteCDSAO { get; set; }
+ public bool CanWriteCDTAO { get; set; }
+ public bool CanWriteCSSManagedDVD { get; set; }
+ public bool CanWriteDDCDR { get; set; }
+ public bool CanWriteDDCDRW { get; set; }
+ public bool CanWriteDVDPlusMRW { get; set; }
+ public bool CanWriteDVDPlusR { get; set; }
+ public bool CanWriteDVDPlusRDL { get; set; }
+ public bool CanWriteDVDPlusRW { get; set; }
+ public bool CanWriteDVDPlusRWDL { get; set; }
+ public bool CanWriteDVDR { get; set; }
+ public bool CanWriteDVDRDL { get; set; }
+ public bool CanWriteDVDRW { get; set; }
+ public bool CanWriteHDDVDR { get; set; }
+ public bool CanWriteHDDVDRAM { get; set; }
+ public bool CanWriteOldBDR { get; set; }
+ public bool CanWriteOldBDRE { get; set; }
+ public bool CanWritePackedSubchannelInTAO { get; set; }
+ public bool CanWriteRWSubchannelInSAO { get; set; }
+ public bool CanWriteRWSubchannelInTAO { get; set; }
+ public bool CanWriteRaw { get; set; }
+ public bool CanWriteRawMultiSession { get; set; }
+ public bool CanWriteRawSubchannelInTAO { get; set; }
+ public bool ChangerIsSideChangeCapable { get; set; }
+ public byte ChangerSlots { get; set; }
+ public bool ChangerSupportsDiscPresent { get; set; }
+ public byte? CPRMVersion { get; set; }
+ public byte? CSSVersion { get; set; }
+ public bool DBML { get; set; }
+ public bool DVDMultiRead { get; set; }
+ public bool EmbeddedChanger { get; set; }
+ public bool ErrorRecoveryPage { get; set; }
+ public DateTime? FirmwareDate { get; set; }
+ public byte? LoadingMechanismType { get; set; }
+ public bool Locked { get; set; }
+ public uint? LogicalBlockSize { get; set; }
+ public bool MultiRead { get; set; }
+ public PhysicalInterfaces? PhysicalInterfaceStandard { get; set; }
+ public uint? PhysicalInterfaceStandardNumber { get; set; }
+ public bool PreventJumper { get; set; }
+ public bool SupportsAACS { get; set; }
+ public bool SupportsBusEncryption { get; set; }
+ public bool SupportsC2 { get; set; }
+ public bool SupportsCPRM { get; set; }
+ public bool SupportsCSS { get; set; }
+ public bool SupportsDAP { get; set; }
+ public bool SupportsDeviceBusyEvent { get; set; }
+ public bool SupportsHybridDiscs { get; set; }
+ public bool SupportsModePage1Ch { get; set; }
+ public bool SupportsOSSC { get; set; }
+ public bool SupportsPWP { get; set; }
+ public bool SupportsSWPP { get; set; }
+ public bool SupportsSecurDisc { get; set; }
+ public bool SupportsSeparateVolume { get; set; }
+ public bool SupportsVCPS { get; set; }
+ public bool SupportsWriteInhibitDCB { get; set; }
+ public bool SupportsWriteProtectPAC { get; set; }
+ public ushort? VolumeLevels { get; set; }
+ }
+
+ public class TestedMedia
+ {
+ public Identify.IdentifyDevice? IdentifyDevice { get; set; }
+ public byte[] IdentifyData { get; set; }
+ public ulong? Blocks { get; set; }
+ public uint? BlockSize { get; set; }
+ public bool? CanReadAACS { get; set; }
+ public bool? CanReadADIP { get; set; }
+ public bool? CanReadATIP { get; set; }
+ public bool? CanReadBCA { get; set; }
+ public bool? CanReadC2Pointers { get; set; }
+ public bool? CanReadCMI { get; set; }
+ public bool? CanReadCorrectedSubchannel { get; set; }
+ public bool? CanReadCorrectedSubchannelWithC2 { get; set; }
+ public bool? CanReadDCB { get; set; }
+ public bool? CanReadDDS { get; set; }
+ public bool? CanReadDMI { get; set; }
+ public bool? CanReadDiscInformation { get; set; }
+ public bool? CanReadFullTOC { get; set; }
+ public bool? CanReadHDCMI { get; set; }
+ public bool? CanReadLayerCapacity { get; set; }
+ public bool? CanReadLeadIn { get; set; }
+ public bool? CanReadLeadOut { get; set; }
+ public bool? CanReadMediaID { get; set; }
+ public bool? CanReadMediaSerial { get; set; }
+ public bool? CanReadPAC { get; set; }
+ public bool? CanReadPFI { get; set; }
+ public bool? CanReadPMA { get; set; }
+ public bool? CanReadPQSubchannel { get; set; }
+ public bool? CanReadPQSubchannelWithC2 { get; set; }
+ public bool? CanReadPRI { get; set; }
+ public bool? CanReadRWSubchannel { get; set; }
+ public bool? CanReadRWSubchannelWithC2 { get; set; }
+ public bool? CanReadRecordablePFI { get; set; }
+ public bool? CanReadSpareAreaInformation { get; set; }
+ public bool? CanReadTOC { get; set; }
+ public byte? Density { get; set; }
+ public uint? LongBlockSize { get; set; }
+ public string Manufacturer { get; set; }
+ public bool MediaIsRecognized { get; set; }
+ public byte? MediumType { get; set; }
+ public string MediumTypeName { get; set; }
+ public string Model { get; set; }
+ public bool? SupportsHLDTSTReadRawDVD { get; set; }
+ public bool? SupportsNECReadCDDA { get; set; }
+ public bool? SupportsPioneerReadCDDA { get; set; }
+ public bool? SupportsPioneerReadCDDAMSF { get; set; }
+ public bool? SupportsPlextorReadCDDA { get; set; }
+ public bool? SupportsPlextorReadRawDVD { get; set; }
+ public bool? SupportsRead10 { get; set; }
+ public bool? SupportsRead12 { get; set; }
+ public bool? SupportsRead16 { get; set; }
+ public bool? SupportsRead { get; set; }
+ public bool? SupportsReadCapacity16 { get; set; }
+ public bool? SupportsReadCapacity { get; set; }
+ public bool? SupportsReadCd { get; set; }
+ public bool? SupportsReadCdMsf { get; set; }
+ public bool? SupportsReadCdRaw { get; set; }
+ public bool? SupportsReadCdMsfRaw { get; set; }
+ public bool? SupportsReadLong16 { get; set; }
+ public bool? SupportsReadLong { get; set; }
+
+ public byte[] ModeSense6Data { get; set; }
+ public byte[] ModeSense10Data { get; set; }
+
+ public Chs CHS { get; set; }
+ public Chs CurrentCHS { get; set; }
+ public uint? LBASectors { get; set; }
+ public ulong? LBA48Sectors { get; set; }
+ public ushort? LogicalAlignment { get; set; }
+ public ushort? NominalRotationRate { get; set; }
+ public uint? PhysicalBlockSize { get; set; }
+ public bool? SolidStateDevice { get; set; }
+ public ushort? UnformattedBPT { get; set; }
+ public ushort? UnformattedBPS { get; set; }
+
+ public bool? SupportsReadDmaLba { get; set; }
+ public bool? SupportsReadDmaRetryLba { get; set; }
+ public bool? SupportsReadLba { get; set; }
+ public bool? SupportsReadRetryLba { get; set; }
+ public bool? SupportsReadLongLba { get; set; }
+ public bool? SupportsReadLongRetryLba { get; set; }
+ public bool? SupportsSeekLba { get; set; }
+
+ public bool? SupportsReadDmaLba48 { get; set; }
+ public bool? SupportsReadLba48 { get; set; }
+
+ public bool? SupportsReadDma { get; set; }
+ public bool? SupportsReadDmaRetry { get; set; }
+ public bool? SupportsReadRetry { get; set; }
+ public bool? SupportsReadLongRetry { get; set; }
+ public bool? SupportsSeek { get; set; }
+ }
+
+ public class Ssc
+ {
+ public byte? BlockSizeGranularity { get; set; }
+ public uint? MaxBlockLength { get; set; }
+ public uint? MinBlockLength { get; set; }
+
+ public SupportedDensity[] SupportedDensities { get; set; }
+ public SupportedMedia[] SupportedMediaTypes { get; set; }
+ public TestedSequentialMedia[] TestedMedia { get; set; }
+ }
+
+ public struct TestedSequentialMedia
+ {
+ public bool? CanReadMediaSerial { get; set; }
+ public byte? Density { get; set; }
+ public string Manufacturer { get; set; }
+ public bool MediaIsRecognized { get; set; }
+ public byte? MediumType { get; set; }
+ public string MediumTypeName { get; set; }
+ public string Model { get; set; }
+ public SupportedDensity[] SupportedDensities { get; set; }
+ public SupportedMedia[] SupportedMediaTypes { get; set; }
+
+ public byte[] ModeSense6Data { get; set; }
+ public byte[] ModeSense10Data { get; set; }
+ }
+
+ public class Pcmcia
+ {
+ public byte[] CIS { get; set; }
+ public string Compliance { get; set; }
+ public ushort? ManufacturerCode { get; set; }
+ public ushort? CardCode { get; set; }
+ public string Manufacturer { get; set; }
+ public string ProductName { get; set; }
+ public string[] AdditionalInformation { get; set; }
+ }
+
+ public class MmcSd
+ {
+ public byte[] CID { get; set; }
+ public byte[] CSD { get; set; }
+ public byte[] OCR { get; set; }
+ public byte[] SCR { get; set; }
+ public byte[] ExtendedCSD { get; set; }
+ }
+}
\ No newline at end of file