diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index 2dafa9b32..870870f23 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -326,6 +326,8 @@ + + @@ -1827,6 +1829,9 @@ + + + diff --git a/DiscImageChef.CommonTypes/Metadata/DeviceReportV2.cs b/DiscImageChef.CommonTypes/Metadata/DeviceReportV2.cs index a621a3018..886b759ff 100644 --- a/DiscImageChef.CommonTypes/Metadata/DeviceReportV2.cs +++ b/DiscImageChef.CommonTypes/Metadata/DeviceReportV2.cs @@ -1032,6 +1032,8 @@ namespace DiscImageChef.CommonTypes.Metadata public bool SupportsWriteInhibitDCB { get; set; } public bool SupportsWriteProtectPAC { get; set; } public ushort? VolumeLevels { get; set; } + public byte[] BinaryData { get; set; } + [JsonIgnore] public short? BlocksPerReadableUnitSql { diff --git a/DiscImageChef.Core/Devices/Report/MMC.cs b/DiscImageChef.Core/Devices/Report/MMC.cs index 68fa74a88..2292d8091 100644 --- a/DiscImageChef.Core/Devices/Report/MMC.cs +++ b/DiscImageChef.Core/Devices/Report/MMC.cs @@ -42,6 +42,26 @@ namespace DiscImageChef.Core.Devices.Report { public partial class DeviceReport { + static byte[] ClearMmcFeatures(byte[] response) + { + uint offset = 8; + + while(offset + 4 < response.Length) + { + ushort code = (ushort)((response[offset + 0] << 8) + response[offset + 1]); + + if(code != 0x0108) continue; + + byte[] data = new byte[response[offset + 3] + 4]; + + if(data.Length + offset > response.Length) data = new byte[response.Length - offset]; + Array.Copy(data, 4, response, offset + 4, data.Length - 4); + offset += (uint)data.Length; + } + + return response; + } + public MmcFeatures ReportMmcFeatures() { DicConsole.WriteLine("Querying MMC GET CONFIGURATION..."); @@ -52,7 +72,7 @@ namespace DiscImageChef.Core.Devices.Report Features.SeparatedFeatures ftr = Features.Separate(buffer); if(ftr.Descriptors == null || ftr.Descriptors.Length <= 0) return null; - MmcFeatures report = new MmcFeatures(); + MmcFeatures report = new MmcFeatures {BinaryData = ClearMmcFeatures(buffer)}; foreach(Features.FeatureDescriptor desc in ftr.Descriptors) switch(desc.Code) { diff --git a/DiscImageChef.Database/DiscImageChef.Database.csproj b/DiscImageChef.Database/DiscImageChef.Database.csproj index 9e8ca2896..8998c6f58 100644 --- a/DiscImageChef.Database/DiscImageChef.Database.csproj +++ b/DiscImageChef.Database/DiscImageChef.Database.csproj @@ -86,6 +86,8 @@ + + diff --git a/DiscImageChef.Database/Migrations/20181225152947_StoreMmcGetConfigurationResponse.Designer.cs b/DiscImageChef.Database/Migrations/20181225152947_StoreMmcGetConfigurationResponse.Designer.cs new file mode 100644 index 000000000..de45a8225 --- /dev/null +++ b/DiscImageChef.Database/Migrations/20181225152947_StoreMmcGetConfigurationResponse.Designer.cs @@ -0,0 +1,1427 @@ +// +using System; +using DiscImageChef.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace DiscImageChef.Database.Migrations +{ + [DbContext(typeof(DicContext))] + [Migration("20181225152947_StoreMmcGetConfigurationResponse")] + partial class StoreMmcGetConfigurationResponse + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.4-rtm-31024"); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ata", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Identify"); + + b.Property("ReadCapabilitiesId"); + + b.HasKey("Id"); + + b.HasIndex("ReadCapabilitiesId"); + + b.ToTable("Ata"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.BlockDescriptor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlockLength"); + + b.Property("BlockLengthSql"); + + b.Property("Blocks"); + + b.Property("BlocksSql"); + + b.Property("Density"); + + b.Property("ScsiModeId"); + + b.HasKey("Id"); + + b.HasIndex("ScsiModeId"); + + b.ToTable("BlockDescriptor"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Chs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Cylinders"); + + b.Property("CylindersSql"); + + b.Property("Heads"); + + b.Property("HeadsSql"); + + b.Property("Sectors"); + + b.Property("SectorsSql"); + + b.HasKey("Id"); + + b.ToTable("Chs"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.DensityCode", b => + { + b.Property("Code") + .ValueGeneratedOnAdd(); + + b.Property("SscSupportedMediaId"); + + b.HasKey("Code"); + + b.HasIndex("SscSupportedMediaId"); + + b.ToTable("DensityCode"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.FireWire", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Manufacturer"); + + b.Property("Product"); + + b.Property("ProductID"); + + b.Property("ProductIDSql"); + + b.Property("RemovableMedia"); + + b.Property("VendorID"); + + b.Property("VendorIDSql"); + + b.HasKey("Id"); + + b.ToTable("FireWire"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Mmc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("FeaturesId"); + + b.Property("ModeSense2AData"); + + b.HasKey("Id"); + + b.HasIndex("FeaturesId"); + + b.ToTable("Mmc"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.MmcFeatures", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AACSVersion"); + + b.Property("AGIDs"); + + b.Property("BinaryData"); + + b.Property("BindingNonceBlocks"); + + b.Property("BlocksPerReadableUnit"); + + b.Property("BlocksPerReadableUnitSql"); + + b.Property("BufferUnderrunFreeInDVD"); + + b.Property("BufferUnderrunFreeInSAO"); + + b.Property("BufferUnderrunFreeInTAO"); + + b.Property("CPRMVersion"); + + b.Property("CSSVersion"); + + b.Property("CanAudioScan"); + + b.Property("CanEject"); + + b.Property("CanEraseSector"); + + b.Property("CanExpandBDRESpareArea"); + + b.Property("CanFormat"); + + b.Property("CanFormatBDREWithoutSpare"); + + b.Property("CanFormatCert"); + + b.Property("CanFormatFRF"); + + b.Property("CanFormatQCert"); + + b.Property("CanFormatRRM"); + + b.Property("CanGenerateBindingNonce"); + + b.Property("CanLoad"); + + b.Property("CanMuteSeparateChannels"); + + b.Property("CanOverwriteSAOTrack"); + + b.Property("CanOverwriteTAOTrack"); + + b.Property("CanPlayCDAudio"); + + b.Property("CanPseudoOverwriteBDR"); + + b.Property("CanReadAllDualR"); + + b.Property("CanReadAllDualRW"); + + b.Property("CanReadBD"); + + b.Property("CanReadBDR"); + + b.Property("CanReadBDRE1"); + + b.Property("CanReadBDRE2"); + + b.Property("CanReadBDROM"); + + b.Property("CanReadBluBCA"); + + b.Property("CanReadCD"); + + b.Property("CanReadCDMRW"); + + b.Property("CanReadCPRM_MKB"); + + b.Property("CanReadDDCD"); + + b.Property("CanReadDVD"); + + b.Property("CanReadDVDPlusMRW"); + + b.Property("CanReadDVDPlusR"); + + b.Property("CanReadDVDPlusRDL"); + + b.Property("CanReadDVDPlusRW"); + + b.Property("CanReadDVDPlusRWDL"); + + b.Property("CanReadDriveAACSCertificate"); + + b.Property("CanReadHDDVD"); + + b.Property("CanReadHDDVDR"); + + b.Property("CanReadHDDVDRAM"); + + b.Property("CanReadLeadInCDText"); + + b.Property("CanReadOldBDR"); + + b.Property("CanReadOldBDRE"); + + b.Property("CanReadOldBDROM"); + + b.Property("CanReadSpareAreaInformation"); + + b.Property("CanReportDriveSerial"); + + b.Property("CanReportMediaSerial"); + + b.Property("CanTestWriteDDCDR"); + + b.Property("CanTestWriteDVD"); + + b.Property("CanTestWriteInSAO"); + + b.Property("CanTestWriteInTAO"); + + b.Property("CanUpgradeFirmware"); + + b.Property("CanWriteBD"); + + b.Property("CanWriteBDR"); + + b.Property("CanWriteBDRE1"); + + b.Property("CanWriteBDRE2"); + + b.Property("CanWriteBusEncryptedBlocks"); + + b.Property("CanWriteCDMRW"); + + b.Property("CanWriteCDRW"); + + b.Property("CanWriteCDRWCAV"); + + b.Property("CanWriteCDSAO"); + + b.Property("CanWriteCDTAO"); + + b.Property("CanWriteCSSManagedDVD"); + + b.Property("CanWriteDDCDR"); + + b.Property("CanWriteDDCDRW"); + + b.Property("CanWriteDVDPlusMRW"); + + b.Property("CanWriteDVDPlusR"); + + b.Property("CanWriteDVDPlusRDL"); + + b.Property("CanWriteDVDPlusRW"); + + b.Property("CanWriteDVDPlusRWDL"); + + b.Property("CanWriteDVDR"); + + b.Property("CanWriteDVDRDL"); + + b.Property("CanWriteDVDRW"); + + b.Property("CanWriteHDDVDR"); + + b.Property("CanWriteHDDVDRAM"); + + b.Property("CanWriteOldBDR"); + + b.Property("CanWriteOldBDRE"); + + b.Property("CanWritePackedSubchannelInTAO"); + + b.Property("CanWriteRWSubchannelInSAO"); + + b.Property("CanWriteRWSubchannelInTAO"); + + b.Property("CanWriteRaw"); + + b.Property("CanWriteRawMultiSession"); + + b.Property("CanWriteRawSubchannelInTAO"); + + b.Property("ChangerIsSideChangeCapable"); + + b.Property("ChangerSlots"); + + b.Property("ChangerSupportsDiscPresent"); + + b.Property("DBML"); + + b.Property("DVDMultiRead"); + + b.Property("EmbeddedChanger"); + + b.Property("ErrorRecoveryPage"); + + b.Property("FirmwareDate"); + + b.Property("LoadingMechanismType"); + + b.Property("Locked"); + + b.Property("LogicalBlockSize"); + + b.Property("LogicalBlockSizeSql"); + + b.Property("MultiRead"); + + b.Property("PhysicalInterfaceStandardNumber"); + + b.Property("PhysicalInterfaceStandardNumberSql"); + + b.Property("PreventJumper"); + + b.Property("SupportsAACS"); + + b.Property("SupportsBusEncryption"); + + b.Property("SupportsC2"); + + b.Property("SupportsCPRM"); + + b.Property("SupportsCSS"); + + b.Property("SupportsDAP"); + + b.Property("SupportsDeviceBusyEvent"); + + b.Property("SupportsHybridDiscs"); + + b.Property("SupportsModePage1Ch"); + + b.Property("SupportsOSSC"); + + b.Property("SupportsPWP"); + + b.Property("SupportsSWPP"); + + b.Property("SupportsSecurDisc"); + + b.Property("SupportsSeparateVolume"); + + b.Property("SupportsVCPS"); + + b.Property("SupportsWriteInhibitDCB"); + + b.Property("SupportsWriteProtectPAC"); + + b.Property("VolumeLevels"); + + b.Property("VolumeLevelsSql"); + + b.HasKey("Id"); + + b.ToTable("MmcFeatures"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.MmcSd", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CID"); + + b.Property("CSD"); + + b.Property("ExtendedCSD"); + + b.Property("OCR"); + + b.Property("SCR"); + + b.HasKey("Id"); + + b.ToTable("MmcSd"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Pcmcia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CIS"); + + b.Property("CardCode"); + + b.Property("CardCodeSql"); + + b.Property("Compliance"); + + b.Property("Manufacturer"); + + b.Property("ManufacturerCode"); + + b.Property("ManufacturerCodeSql"); + + b.Property("ProductName"); + + b.HasKey("Id"); + + b.ToTable("Pcmcia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Scsi", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("InquiryData"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("ModeSenseId"); + + b.Property("MultiMediaDeviceId"); + + b.Property("ReadCapabilitiesId"); + + b.Property("SequentialDeviceId"); + + b.Property("SupportsModeSense10"); + + b.Property("SupportsModeSense6"); + + b.Property("SupportsModeSubpages"); + + b.HasKey("Id"); + + b.HasIndex("ModeSenseId"); + + b.HasIndex("MultiMediaDeviceId"); + + b.HasIndex("ReadCapabilitiesId"); + + b.HasIndex("SequentialDeviceId"); + + b.ToTable("Scsi"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiMode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlankCheckEnabled"); + + b.Property("BufferedMode"); + + b.Property("DPOandFUA"); + + b.Property("MediumType"); + + b.Property("Speed"); + + b.Property("WriteProtected"); + + b.HasKey("Id"); + + b.ToTable("ScsiMode"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiPage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ScsiId"); + + b.Property("ScsiModeId"); + + b.Property("page"); + + b.Property("subpage"); + + b.Property("value"); + + b.HasKey("Id"); + + b.HasIndex("ScsiId"); + + b.HasIndex("ScsiModeId"); + + b.ToTable("ScsiPage"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ssc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlockSizeGranularity"); + + b.Property("MaxBlockLength"); + + b.Property("MaxBlockLengthSql"); + + b.Property("MinBlockLength"); + + b.Property("MinBlockLengthSql"); + + b.HasKey("Id"); + + b.ToTable("Ssc"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Description"); + + b.Property("Length"); + + b.Property("LengthSql"); + + b.Property("MediumType"); + + b.Property("Name"); + + b.Property("Organization"); + + b.Property("SscId"); + + b.Property("TestedSequentialMediaId"); + + b.Property("Width"); + + b.Property("WidthSql"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.HasIndex("TestedSequentialMediaId"); + + b.ToTable("SscSupportedMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SupportedDensity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BitsPerMm"); + + b.Property("BitsPerMmSql"); + + b.Property("Capacity"); + + b.Property("CapacitySql"); + + b.Property("DefaultDensity"); + + b.Property("Description"); + + b.Property("Duplicate"); + + b.Property("Name"); + + b.Property("Organization"); + + b.Property("PrimaryCode"); + + b.Property("SecondaryCode"); + + b.Property("SscId"); + + b.Property("TestedSequentialMediaId"); + + b.Property("Tracks"); + + b.Property("TracksSql"); + + b.Property("Width"); + + b.Property("WidthSql"); + + b.Property("Writable"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.HasIndex("TestedSequentialMediaId"); + + b.ToTable("SupportedDensity"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AtaId"); + + b.Property("BlockSize"); + + b.Property("BlockSizeSql"); + + b.Property("Blocks"); + + b.Property("BlocksSql"); + + b.Property("CHSId"); + + b.Property("CanReadAACS"); + + b.Property("CanReadADIP"); + + b.Property("CanReadATIP"); + + b.Property("CanReadBCA"); + + b.Property("CanReadC2Pointers"); + + b.Property("CanReadCMI"); + + b.Property("CanReadCorrectedSubchannel"); + + b.Property("CanReadCorrectedSubchannelWithC2"); + + b.Property("CanReadDCB"); + + b.Property("CanReadDDS"); + + b.Property("CanReadDMI"); + + b.Property("CanReadDiscInformation"); + + b.Property("CanReadFirstTrackPreGap"); + + b.Property("CanReadFullTOC"); + + b.Property("CanReadHDCMI"); + + b.Property("CanReadLayerCapacity"); + + b.Property("CanReadLeadIn"); + + b.Property("CanReadLeadOut"); + + b.Property("CanReadMediaID"); + + b.Property("CanReadMediaSerial"); + + b.Property("CanReadPAC"); + + b.Property("CanReadPFI"); + + b.Property("CanReadPMA"); + + b.Property("CanReadPQSubchannel"); + + b.Property("CanReadPQSubchannelWithC2"); + + b.Property("CanReadPRI"); + + b.Property("CanReadRWSubchannel"); + + b.Property("CanReadRWSubchannelWithC2"); + + b.Property("CanReadRecordablePFI"); + + b.Property("CanReadSpareAreaInformation"); + + b.Property("CanReadTOC"); + + b.Property("CurrentCHSId"); + + b.Property("Density"); + + b.Property("IdentifyData"); + + b.Property("LBA48Sectors"); + + b.Property("LBA48SectorsSql"); + + b.Property("LBASectors"); + + b.Property("LBASectorsSql"); + + b.Property("LogicalAlignment"); + + b.Property("LogicalAlignmentSql"); + + b.Property("LongBlockSize"); + + b.Property("LongBlockSizeSql"); + + b.Property("Manufacturer"); + + b.Property("MediaIsRecognized"); + + b.Property("MediumType"); + + b.Property("MediumTypeName"); + + b.Property("MmcId"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("Model"); + + b.Property("NominalRotationRate"); + + b.Property("NominalRotationRateSql"); + + b.Property("PhysicalBlockSize"); + + b.Property("PhysicalBlockSizeSql"); + + b.Property("ScsiId"); + + b.Property("SolidStateDevice"); + + b.Property("SupportsHLDTSTReadRawDVD"); + + b.Property("SupportsNECReadCDDA"); + + b.Property("SupportsPioneerReadCDDA"); + + b.Property("SupportsPioneerReadCDDAMSF"); + + b.Property("SupportsPlextorReadCDDA"); + + b.Property("SupportsPlextorReadRawDVD"); + + b.Property("SupportsRead10"); + + b.Property("SupportsRead12"); + + b.Property("SupportsRead16"); + + b.Property("SupportsRead6"); + + b.Property("SupportsReadCapacity"); + + b.Property("SupportsReadCapacity16"); + + b.Property("SupportsReadCd"); + + b.Property("SupportsReadCdMsf"); + + b.Property("SupportsReadCdMsfRaw"); + + b.Property("SupportsReadCdRaw"); + + b.Property("SupportsReadDma"); + + b.Property("SupportsReadDmaLba"); + + b.Property("SupportsReadDmaLba48"); + + b.Property("SupportsReadDmaRetry"); + + b.Property("SupportsReadDmaRetryLba"); + + b.Property("SupportsReadLba"); + + b.Property("SupportsReadLba48"); + + b.Property("SupportsReadLong"); + + b.Property("SupportsReadLong16"); + + b.Property("SupportsReadLongLba"); + + b.Property("SupportsReadLongRetry"); + + b.Property("SupportsReadLongRetryLba"); + + b.Property("SupportsReadRetry"); + + b.Property("SupportsReadRetryLba"); + + b.Property("SupportsReadSectors"); + + b.Property("SupportsSeek"); + + b.Property("SupportsSeekLba"); + + b.Property("UnformattedBPS"); + + b.Property("UnformattedBPSSql"); + + b.Property("UnformattedBPT"); + + b.Property("UnformattedBPTSql"); + + b.HasKey("Id"); + + b.HasIndex("AtaId"); + + b.HasIndex("CHSId"); + + b.HasIndex("CurrentCHSId"); + + b.HasIndex("MmcId"); + + b.HasIndex("ScsiId"); + + b.ToTable("TestedMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CanReadMediaSerial"); + + b.Property("Density"); + + b.Property("Manufacturer"); + + b.Property("MediaIsRecognized"); + + b.Property("MediumType"); + + b.Property("MediumTypeName"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("Model"); + + b.Property("SscId"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.ToTable("TestedSequentialMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Usb", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Descriptors"); + + b.Property("Manufacturer"); + + b.Property("Product"); + + b.Property("ProductID"); + + b.Property("ProductIDSql"); + + b.Property("RemovableMedia"); + + b.Property("VendorID"); + + b.Property("VendorIDSql"); + + b.HasKey("Id"); + + b.ToTable("Usb"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.CdOffset", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("Agreement"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("ModifiedWhen"); + + b.Property("Offset"); + + b.Property("Submissions"); + + b.HasKey("Id"); + + b.ToTable("CdOffsets"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Command", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Commands"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Device", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ATAId"); + + b.Property("ATAPIId"); + + b.Property("CompactFlash"); + + b.Property("FireWireId"); + + b.Property("LastSynchronized"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("MultiMediaCardId"); + + b.Property("PCMCIAId"); + + b.Property("Revision"); + + b.Property("SCSIId"); + + b.Property("SecureDigitalId"); + + b.Property("Type"); + + b.Property("USBId"); + + b.HasKey("Id"); + + b.HasIndex("ATAId"); + + b.HasIndex("ATAPIId"); + + b.HasIndex("FireWireId"); + + b.HasIndex("MultiMediaCardId"); + + b.HasIndex("PCMCIAId"); + + b.HasIndex("SCSIId"); + + b.HasIndex("SecureDigitalId"); + + b.HasIndex("USBId"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.DeviceStat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Bus"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("Revision"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("SeenDevices"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Filesystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Filesystems"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Filter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Filters"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Media", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Real"); + + b.Property("Synchronized"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.ToTable("Medias"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.MediaFormat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("MediaFormats"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.OperatingSystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.Property("Version"); + + b.HasKey("Id"); + + b.ToTable("OperatingSystems"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Partition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Partitions"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Report", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ATAId"); + + b.Property("ATAPIId"); + + b.Property("CompactFlash"); + + b.Property("Created"); + + b.Property("FireWireId"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("MultiMediaCardId"); + + b.Property("PCMCIAId"); + + b.Property("Revision"); + + b.Property("SCSIId"); + + b.Property("SecureDigitalId"); + + b.Property("Type"); + + b.Property("USBId"); + + b.Property("Uploaded"); + + b.HasKey("Id"); + + b.HasIndex("ATAId"); + + b.HasIndex("ATAPIId"); + + b.HasIndex("FireWireId"); + + b.HasIndex("MultiMediaCardId"); + + b.HasIndex("PCMCIAId"); + + b.HasIndex("SCSIId"); + + b.HasIndex("SecureDigitalId"); + + b.HasIndex("USBId"); + + b.ToTable("Reports"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("ModifiedWhen"); + + b.Property("Product"); + + b.Property("ProductId"); + + b.Property("VendorId"); + + b.HasKey("Id"); + + b.HasIndex("VendorId"); + + b.ToTable("UsbProducts"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbVendor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("ModifiedWhen"); + + b.Property("Vendor"); + + b.HasKey("Id"); + + b.ToTable("UsbVendors"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Version", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Synchronized"); + + b.Property("Value"); + + b.HasKey("Id"); + + b.ToTable("Versions"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ata", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedMedia", "ReadCapabilities") + .WithMany() + .HasForeignKey("ReadCapabilitiesId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.BlockDescriptor", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode") + .WithMany("BlockDescriptors") + .HasForeignKey("ScsiModeId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.DensityCode", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia") + .WithMany("DensityCodes") + .HasForeignKey("SscSupportedMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Mmc", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcFeatures", "Features") + .WithMany() + .HasForeignKey("FeaturesId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Scsi", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode", "ModeSense") + .WithMany() + .HasForeignKey("ModeSenseId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Mmc", "MultiMediaDevice") + .WithMany() + .HasForeignKey("MultiMediaDeviceId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedMedia", "ReadCapabilities") + .WithMany() + .HasForeignKey("ReadCapabilitiesId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc", "SequentialDevice") + .WithMany() + .HasForeignKey("SequentialDeviceId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiPage", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi") + .WithMany("EVPDPages") + .HasForeignKey("ScsiId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode") + .WithMany("ModePages") + .HasForeignKey("ScsiModeId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("SupportedMediaTypes") + .HasForeignKey("SscId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia") + .WithMany("SupportedMediaTypes") + .HasForeignKey("TestedSequentialMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SupportedDensity", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("SupportedDensities") + .HasForeignKey("SscId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia") + .WithMany("SupportedDensities") + .HasForeignKey("TestedSequentialMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata") + .WithMany("RemovableMedias") + .HasForeignKey("AtaId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Chs", "CHS") + .WithMany() + .HasForeignKey("CHSId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Chs", "CurrentCHS") + .WithMany() + .HasForeignKey("CurrentCHSId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Mmc") + .WithMany("TestedMedia") + .HasForeignKey("MmcId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi") + .WithMany("RemovableMedias") + .HasForeignKey("ScsiId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("TestedMedia") + .HasForeignKey("SscId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Device", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATA") + .WithMany() + .HasForeignKey("ATAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATAPI") + .WithMany() + .HasForeignKey("ATAPIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.FireWire", "FireWire") + .WithMany() + .HasForeignKey("FireWireId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "MultiMediaCard") + .WithMany() + .HasForeignKey("MultiMediaCardId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Pcmcia", "PCMCIA") + .WithMany() + .HasForeignKey("PCMCIAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi", "SCSI") + .WithMany() + .HasForeignKey("SCSIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "SecureDigital") + .WithMany() + .HasForeignKey("SecureDigitalId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Usb", "USB") + .WithMany() + .HasForeignKey("USBId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Report", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATA") + .WithMany() + .HasForeignKey("ATAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATAPI") + .WithMany() + .HasForeignKey("ATAPIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.FireWire", "FireWire") + .WithMany() + .HasForeignKey("FireWireId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "MultiMediaCard") + .WithMany() + .HasForeignKey("MultiMediaCardId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Pcmcia", "PCMCIA") + .WithMany() + .HasForeignKey("PCMCIAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi", "SCSI") + .WithMany() + .HasForeignKey("SCSIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "SecureDigital") + .WithMany() + .HasForeignKey("SecureDigitalId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Usb", "USB") + .WithMany() + .HasForeignKey("USBId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbProduct", b => + { + b.HasOne("DiscImageChef.Database.Models.UsbVendor", "Vendor") + .WithMany("Products") + .HasForeignKey("VendorId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/DiscImageChef.Database/Migrations/20181225152947_StoreMmcGetConfigurationResponse.cs b/DiscImageChef.Database/Migrations/20181225152947_StoreMmcGetConfigurationResponse.cs new file mode 100644 index 000000000..be06c9d8b --- /dev/null +++ b/DiscImageChef.Database/Migrations/20181225152947_StoreMmcGetConfigurationResponse.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DiscImageChef.Database.Migrations +{ + // TODO: Find how to permanently create indexes + public partial class StoreMmcGetConfigurationResponse : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex("IX_UsbVendors_ModifiedWhen", "UsbVendors"); + + migrationBuilder.DropIndex("IX_UsbProducts_ModifiedWhen", "UsbProducts"); + + migrationBuilder.DropIndex("IX_UsbProducts_ProductId", "UsbProducts"); + + migrationBuilder.AddColumn("BinaryData", "MmcFeatures", nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn("BinaryData", "MmcFeatures"); + + migrationBuilder.CreateIndex("IX_UsbVendors_ModifiedWhen", "UsbVendors", "ModifiedWhen"); + + migrationBuilder.CreateIndex("IX_UsbProducts_ModifiedWhen", "UsbProducts", "ModifiedWhen"); + + migrationBuilder.CreateIndex("IX_UsbProducts_ProductId", "UsbProducts", "ProductId"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs b/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs index 6149df69c..8042dbf53 100644 --- a/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs +++ b/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs @@ -132,6 +132,8 @@ namespace DiscImageChef.Database.Migrations b.Property("AGIDs"); + b.Property("BinaryData"); + b.Property("BindingNonceBlocks"); b.Property("BlocksPerReadableUnit"); @@ -1163,10 +1165,6 @@ namespace DiscImageChef.Database.Migrations b.HasIndex("VendorId"); - b.HasIndex("ProductId"); - - b.HasIndex("ModifiedWhen"); - b.ToTable("UsbProducts"); }); @@ -1182,8 +1180,6 @@ namespace DiscImageChef.Database.Migrations b.HasKey("Id"); - b.HasIndex("ModifiedWhen"); - b.ToTable("UsbVendors"); }); diff --git a/DiscImageChef.Server/DiscImageChef.Server.csproj b/DiscImageChef.Server/DiscImageChef.Server.csproj index a208385ee..972df27bd 100644 --- a/DiscImageChef.Server/DiscImageChef.Server.csproj +++ b/DiscImageChef.Server/DiscImageChef.Server.csproj @@ -229,6 +229,10 @@ 201812250223002_AddCdOffsets.cs + + + 201812251556377_StoreMmcGetConfigurationResponse.cs + @@ -339,6 +343,9 @@ 201812250223002_AddCdOffsets.cs + + 201812251556377_StoreMmcGetConfigurationResponse.cs + 10.0 diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs new file mode 100644 index 000000000..26501fafb --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs @@ -0,0 +1,29 @@ +// +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 StoreMmcGetConfigurationResponse : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(StoreMmcGetConfigurationResponse)); + + string IMigrationMetadata.Id + { + get { return "201812251556377_StoreMmcGetConfigurationResponse"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs new file mode 100644 index 000000000..682c8c7f3 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs @@ -0,0 +1,17 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class StoreMmcGetConfigurationResponse : DbMigration + { + public override void Up() + { + AddColumn("dbo.MmcFeatures", "BinaryData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.MmcFeatures", "BinaryData"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx new file mode 100644 index 000000000..185315020 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file