diff --git a/DiscImageChef.CommonTypes/Metadata/DeviceReportV2.cs b/DiscImageChef.CommonTypes/Metadata/DeviceReportV2.cs index ea35d0b33..a621a3018 100644 --- a/DiscImageChef.CommonTypes/Metadata/DeviceReportV2.cs +++ b/DiscImageChef.CommonTypes/Metadata/DeviceReportV2.cs @@ -39,6 +39,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Linq; using System.Text; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.Decoders.ATA; @@ -74,6 +75,18 @@ namespace DiscImageChef.CommonTypes.Metadata { SCSI = new Scsi(reportV1.SCSI); Type = DeviceType.SCSI; + + if(SCSI.ModeSense?.ModePages?.FirstOrDefault(p => p.page == 0x2A)?.value != null) + { + if(SCSI.MultiMediaDevice != null) + SCSI.MultiMediaDevice.ModeSense2AData = + SCSI.ModeSense?.ModePages?.FirstOrDefault(p => p.page == 0x2A)?.value; + else if(SCSI.Inquiry?.PeripheralDeviceType == (byte)PeripheralDeviceTypes.MultiMediaDevice) + SCSI.MultiMediaDevice = new Mmc + { + ModeSense2AData = SCSI.ModeSense?.ModePages?.FirstOrDefault(p => p.page == 0x2A)?.value + }; + } } if(reportV1.ATAPI != null) @@ -211,8 +224,6 @@ namespace DiscImageChef.CommonTypes.Metadata public class Ata { - public Identify.IdentifyDevice? IdentifyDevice; - public Ata() { } public Ata(ataType ata) @@ -229,11 +240,7 @@ namespace DiscImageChef.CommonTypes.Metadata RemovableMedias.Add(new TestedMedia(ataRemovableMedia, true)); } - if(Identify != null) - { - IdentifyDevice = Decoders.ATA.Identify.Decode(Identify); - return; - } + if(Identify != null) return; Identify.IdentifyDevice identifyDevice = new Identify.IdentifyDevice(); @@ -398,9 +405,11 @@ namespace DiscImageChef.CommonTypes.Metadata if(ata.WRVSectorCountMode2Specified) identifyDevice.WRVSectorCountMode2 = ata.WRVSectorCountMode2; - IdentifyDevice = identifyDevice; + Identify = Decoders.ATA.Identify.Encode(identifyDevice); } + public Identify.IdentifyDevice? IdentifyDevice => Decoders.ATA.Identify.Decode(Identify); + [JsonIgnore] public int Id { get; set; } public byte[] Identify { get; set; } @@ -447,8 +456,6 @@ namespace DiscImageChef.CommonTypes.Metadata public class Scsi { - public Inquiry.SCSIInquiry? Inquiry; - public Scsi() { } public Scsi(scsiType scsi) @@ -482,11 +489,7 @@ namespace DiscImageChef.CommonTypes.Metadata if(scsi.SequentialDevice != null) SequentialDevice = new Ssc(scsi.SequentialDevice); - if(InquiryData != null) - { - Inquiry = Decoders.SCSI.Inquiry.Decode(InquiryData); - return; - } + if(InquiryData != null) return; Inquiry.SCSIInquiry inq = new Inquiry.SCSIInquiry(); @@ -553,9 +556,11 @@ namespace DiscImageChef.CommonTypes.Metadata inq.WBus16 = scsi.Inquiry.WideBus16; inq.WBus32 = scsi.Inquiry.WideBus32; - Inquiry = inq; + InquiryData = Decoders.SCSI.Inquiry.Encode(inq); } + public Inquiry.SCSIInquiry? Inquiry => Decoders.SCSI.Inquiry.Decode(InquiryData); + [JsonIgnore] public int Id { get; set; } public byte[] InquiryData { get; set; } @@ -672,60 +677,72 @@ namespace DiscImageChef.CommonTypes.Metadata public Mmc(mmcType mmc) { if(mmc.ModeSense2A != null) - ModeSense2A = new Modes.ModePage_2A + ModeSense2AData = Modes.EncodeModePage_2A(new Modes.ModePage_2A { - AccurateCDDA = mmc.ModeSense2A.AccurateCDDA, - BCK = mmc.ModeSense2A.BCK, - BufferSize = mmc.ModeSense2A.BufferSize, - BUF = mmc.ModeSense2A.BufferUnderRunProtection, - Eject = mmc.ModeSense2A.CanEject, - Lock = mmc.ModeSense2A.CanLockMedia, - CDDACommand = mmc.ModeSense2A.CDDACommand, - Composite = mmc.ModeSense2A.CompositeAudioVideo, - CMRSupported = (ushort)(mmc.ModeSense2A.CSSandCPPMSupported ? 1 : 0), - CurrentSpeed = mmc.ModeSense2A.CurrentSpeed, - CurrentWriteSpeed = mmc.ModeSense2A.CurrentWriteSpeed, - CurrentWriteSpeedSelected = mmc.ModeSense2A.CurrentWriteSpeedSelected, - SDP = mmc.ModeSense2A.DeterministicSlotChanger, - DigitalPort1 = mmc.ModeSense2A.DigitalPort1, - DigitalPort2 = mmc.ModeSense2A.DigitalPort2, - LeadInPW = mmc.ModeSense2A.LeadInPW, - LoadingMechanism = mmc.ModeSense2A.LoadingMechanismType, - LockState = mmc.ModeSense2A.LockStatus, - LSBF = mmc.ModeSense2A.LSBF, - MaximumSpeed = mmc.ModeSense2A.MaximumSpeed, - MaxWriteSpeed = mmc.ModeSense2A.MaximumWriteSpeed, - AudioPlay = mmc.ModeSense2A.PlaysAudio, - PreventJumper = mmc.ModeSense2A.PreventJumperStatus, - RCK = mmc.ModeSense2A.RCK, - ReadBarcode = mmc.ModeSense2A.ReadsBarcode, - SCC = mmc.ModeSense2A.ReadsBothSides, - ReadCDR = mmc.ModeSense2A.ReadsCDR, - ReadCDRW = mmc.ModeSense2A.ReadsCDRW, - DeinterlaveSubchannel = mmc.ModeSense2A.ReadsDeinterlavedSubchannel, - ReadDVDR = mmc.ModeSense2A.ReadsDVDR, - ReadDVDRAM = mmc.ModeSense2A.ReadsDVDRAM, - ReadDVDROM = mmc.ModeSense2A.ReadsDVDROM, - ISRC = mmc.ModeSense2A.ReadsISRC, - Mode2Form2 = mmc.ModeSense2A.ReadsMode2Form2, - Mode2Form1 = mmc.ModeSense2A.ReadsMode2Form1, - Method2 = mmc.ModeSense2A.ReadsPacketCDR, - Subchannel = mmc.ModeSense2A.ReadsSubchannel, - UPC = mmc.ModeSense2A.ReadsUPC, - C2Pointer = mmc.ModeSense2A.ReturnsC2Pointers, - RotationControlSelected = mmc.ModeSense2A.RotationControlSelected, - SeparateChannelMute = mmc.ModeSense2A.SeparateChannelMute, - SeparateChannelVolume = mmc.ModeSense2A.SeparateChannelVolume, - SSS = mmc.ModeSense2A.SSS, - MultiSession = mmc.ModeSense2A.SupportsMultiSession, - SupportedVolumeLevels = mmc.ModeSense2A.SupportedVolumeLevels, - TestWrite = mmc.ModeSense2A.TestWrite, - WriteCDR = mmc.ModeSense2A.WritesCDR, - WriteCDRW = mmc.ModeSense2A.WritesCDRW, - WriteDVDR = mmc.ModeSense2A.WritesDVDR, - WriteDVDRAM = mmc.ModeSense2A.WritesDVDRAM, - WriteSpeedPerformanceDescriptors = mmc.ModeSense2A.WriteSpeedPerformanceDescriptors - }; + AccurateCDDA = mmc.ModeSense2A.AccurateCDDA, + BCK = mmc.ModeSense2A.BCK, + BufferSize = mmc.ModeSense2A.BufferSize, + BUF = mmc.ModeSense2A.BufferUnderRunProtection, + Eject = mmc.ModeSense2A.CanEject, + Lock = mmc.ModeSense2A.CanLockMedia, + CDDACommand = mmc.ModeSense2A.CDDACommand, + Composite = mmc.ModeSense2A.CompositeAudioVideo, + CMRSupported = + (ushort)(mmc.ModeSense2A.CSSandCPPMSupported + ? 1 + : 0), + CurrentSpeed = mmc.ModeSense2A.CurrentSpeed, + CurrentWriteSpeed = mmc.ModeSense2A.CurrentWriteSpeed, + CurrentWriteSpeedSelected = + mmc.ModeSense2A.CurrentWriteSpeedSelected, + SDP = mmc.ModeSense2A.DeterministicSlotChanger, + DigitalPort1 = mmc.ModeSense2A.DigitalPort1, + DigitalPort2 = mmc.ModeSense2A.DigitalPort2, + LeadInPW = mmc.ModeSense2A.LeadInPW, + LoadingMechanism = + mmc.ModeSense2A.LoadingMechanismType, + LockState = mmc.ModeSense2A.LockStatus, + LSBF = mmc.ModeSense2A.LSBF, + MaximumSpeed = mmc.ModeSense2A.MaximumSpeed, + MaxWriteSpeed = mmc.ModeSense2A.MaximumWriteSpeed, + AudioPlay = mmc.ModeSense2A.PlaysAudio, + PreventJumper = mmc.ModeSense2A.PreventJumperStatus, + RCK = mmc.ModeSense2A.RCK, + ReadBarcode = mmc.ModeSense2A.ReadsBarcode, + SCC = mmc.ModeSense2A.ReadsBothSides, + ReadCDR = mmc.ModeSense2A.ReadsCDR, + ReadCDRW = mmc.ModeSense2A.ReadsCDRW, + DeinterlaveSubchannel = + mmc.ModeSense2A.ReadsDeinterlavedSubchannel, + ReadDVDR = mmc.ModeSense2A.ReadsDVDR, + ReadDVDRAM = mmc.ModeSense2A.ReadsDVDRAM, + ReadDVDROM = mmc.ModeSense2A.ReadsDVDROM, + ISRC = mmc.ModeSense2A.ReadsISRC, + Mode2Form2 = mmc.ModeSense2A.ReadsMode2Form2, + Mode2Form1 = mmc.ModeSense2A.ReadsMode2Form1, + Method2 = mmc.ModeSense2A.ReadsPacketCDR, + Subchannel = mmc.ModeSense2A.ReadsSubchannel, + UPC = mmc.ModeSense2A.ReadsUPC, + C2Pointer = mmc.ModeSense2A.ReturnsC2Pointers, + RotationControlSelected = + mmc.ModeSense2A.RotationControlSelected, + SeparateChannelMute = + mmc.ModeSense2A.SeparateChannelMute, + SeparateChannelVolume = + mmc.ModeSense2A.SeparateChannelVolume, + SSS = mmc.ModeSense2A.SSS, + MultiSession = mmc.ModeSense2A.SupportsMultiSession, + SupportedVolumeLevels = + mmc.ModeSense2A.SupportedVolumeLevels, + TestWrite = mmc.ModeSense2A.TestWrite, + WriteCDR = mmc.ModeSense2A.WritesCDR, + WriteCDRW = mmc.ModeSense2A.WritesCDRW, + WriteDVDR = mmc.ModeSense2A.WritesDVDR, + WriteDVDRAM = mmc.ModeSense2A.WritesDVDRAM, + WriteSpeedPerformanceDescriptors = + mmc.ModeSense2A.WriteSpeedPerformanceDescriptors + }); + if(mmc.Features != null) Features = new MmcFeatures(mmc.Features); if(mmc.TestedMedia == null) return; @@ -735,10 +752,11 @@ namespace DiscImageChef.CommonTypes.Metadata } [JsonIgnore] - public int Id { get; set; } - public virtual Modes.ModePage_2A ModeSense2A { get; set; } - public virtual MmcFeatures Features { get; set; } - public virtual List TestedMedia { get; set; } + public int Id { get; set; } + public virtual Modes.ModePage_2A ModeSense2A => Modes.DecodeModePage_2A(ModeSense2AData); + public virtual MmcFeatures Features { get; set; } + public virtual List TestedMedia { get; set; } + public byte[] ModeSense2AData { get; set; } } public class MmcFeatures diff --git a/DiscImageChef.Core/Devices/Report/Scsi.cs b/DiscImageChef.Core/Devices/Report/Scsi.cs index 66d98ee94..f969e90f1 100644 --- a/DiscImageChef.Core/Devices/Report/Scsi.cs +++ b/DiscImageChef.Core/Devices/Report/Scsi.cs @@ -51,9 +51,7 @@ namespace DiscImageChef.Core.Devices.Report if(sense || !Inquiry.Decode(buffer).HasValue) return null; - report.Inquiry = Inquiry.Decode(buffer); - - if(debug) report.InquiryData = buffer; + report.InquiryData = buffer; return report; } @@ -82,7 +80,7 @@ namespace DiscImageChef.Core.Devices.Report return evpds.Count > 0 ? evpds : null; } - public void ReportScsiModes(ref DeviceReportV2 report, ref Modes.ModePage_2A cdromMode) + public void ReportScsiModes(ref DeviceReportV2 report, out byte[] cdromMode) { Modes.DecodedMode? decMode = null; PeripheralDeviceTypes devType = dev.ScsiType; @@ -157,7 +155,7 @@ namespace DiscImageChef.Core.Devices.Report modePages.Add(modePage); if(modePage.page == 0x2A && modePage.subpage == 0x00) - cdromMode = Modes.DecodeModePage_2A(page.PageResponse); + cdromMode = page.PageResponse; } if(modePages.Count > 0) report.SCSI.ModeSense.ModePages = modePages; diff --git a/DiscImageChef.Core/Statistics.cs b/DiscImageChef.Core/Statistics.cs index c9cc5ec2f..38018453c 100644 --- a/DiscImageChef.Core/Statistics.cs +++ b/DiscImageChef.Core/Statistics.cs @@ -37,6 +37,7 @@ using System.IO; using System.Linq; using System.Net; using System.Threading; +using System.Xml; using System.Xml.Serialization; using DiscImageChef.CommonTypes.Interop; using DiscImageChef.CommonTypes.Metadata; @@ -44,6 +45,7 @@ using DiscImageChef.Database; using DiscImageChef.Database.Models; using Newtonsoft.Json; using Device = DiscImageChef.Devices.Device; +using Formatting = Newtonsoft.Json.Formatting; using MediaType = DiscImageChef.CommonTypes.MediaType; using OperatingSystem = DiscImageChef.Database.Models.OperatingSystem; using Version = DiscImageChef.Database.Models.Version; @@ -69,338 +71,359 @@ namespace DiscImageChef.Core { if(File.Exists(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml"))) { - Stats allStats = new Stats(); - XmlSerializer xs = new XmlSerializer(allStats.GetType()); - StreamReader sr = new StreamReader(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")); - allStats = (Stats)xs.Deserialize(sr); - sr.Close(); - - if(allStats.Commands != null) + try { - if(allStats.Commands.Analyze > 0) + Stats allStats = new Stats(); + XmlSerializer xs = new XmlSerializer(allStats.GetType()); + StreamReader sr = + new StreamReader(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")); + allStats = (Stats)xs.Deserialize(sr); + sr.Close(); + + if(allStats.Commands != null) { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "analyze" && c.Synchronized) ?? - new Command {Name = "analyze", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Analyze; - ctx.Commands.Update(command); - } - - if(allStats.Commands.Benchmark > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "benchmark" && c.Synchronized) ?? - new Command {Name = "benchmark", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Benchmark; - ctx.Commands.Update(command); - } - - if(allStats.Commands.Checksum > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "checksum" && c.Synchronized) ?? - new Command {Name = "checksum", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Checksum; - ctx.Commands.Update(command); - } - - if(allStats.Commands.Compare > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "compare" && c.Synchronized) ?? - new Command {Name = "compare", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Compare; - ctx.Commands.Update(command); - } - - if(allStats.Commands.ConvertImage > 0) - { - Command command = - ctx.Commands.FirstOrDefault(c => c.Name == "convert-image" && c.Synchronized) ?? - new Command {Name = "convert-image", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.ConvertImage; - ctx.Commands.Update(command); - } - - if(allStats.Commands.CreateSidecar > 0) - { - Command command = - ctx.Commands.FirstOrDefault(c => c.Name == "create-sidecar" && c.Synchronized) ?? - new Command {Name = "create-sidecar", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.CreateSidecar; - ctx.Commands.Update(command); - } - - if(allStats.Commands.Decode > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "decode" && c.Synchronized) ?? - new Command {Name = "decode", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Decode; - ctx.Commands.Update(command); - } - - if(allStats.Commands.DeviceInfo > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "device-info" && c.Synchronized) ?? - new Command {Name = "device-info", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.DeviceInfo; - ctx.Commands.Update(command); - } - - if(allStats.Commands.DeviceReport > 0) - { - Command command = - ctx.Commands.FirstOrDefault(c => c.Name == "device-report" && c.Synchronized) ?? - new Command {Name = "device-report", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.DeviceReport; - ctx.Commands.Update(command); - } - - if(allStats.Commands.DumpMedia > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "dump-media" && c.Synchronized) ?? - new Command {Name = "dump-media", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.DumpMedia; - ctx.Commands.Update(command); - } - - if(allStats.Commands.Entropy > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "entropy" && c.Synchronized) ?? - new Command {Name = "entropy", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Entropy; - ctx.Commands.Update(command); - } - - if(allStats.Commands.ExtractFiles > 0) - { - Command command = - ctx.Commands.FirstOrDefault(c => c.Name == "extract-files" && c.Synchronized) ?? - new Command {Name = "extract-files", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.ExtractFiles; - ctx.Commands.Update(command); - } - - if(allStats.Commands.Formats > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "formats" && c.Synchronized) ?? - new Command {Name = "formats", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Formats; - ctx.Commands.Update(command); - } - - if(allStats.Commands.ImageInfo > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "image-info" && c.Synchronized) ?? - new Command {Name = "image-info", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.ImageInfo; - ctx.Commands.Update(command); - } - - if(allStats.Commands.ListDevices > 0) - { - Command command = - ctx.Commands.FirstOrDefault(c => c.Name == "list-devices" && c.Synchronized) ?? - new Command {Name = "list-devices", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.ListDevices; - ctx.Commands.Update(command); - } - - if(allStats.Commands.ListEncodings > 0) - { - Command command = - ctx.Commands.FirstOrDefault(c => c.Name == "list-encodings" && c.Synchronized) ?? - new Command {Name = "list-encodings", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.ListEncodings; - ctx.Commands.Update(command); - } - - if(allStats.Commands.Ls > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "ls" && c.Synchronized) ?? - new Command {Name = "ls", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Ls; - ctx.Commands.Update(command); - } - - if(allStats.Commands.MediaInfo > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "media-info" && c.Synchronized) ?? - new Command {Name = "media-info", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.MediaInfo; - ctx.Commands.Update(command); - } - - if(allStats.Commands.MediaScan > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "media-scan" && c.Synchronized) ?? - new Command {Name = "media-scan", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.MediaScan; - ctx.Commands.Update(command); - } - - if(allStats.Commands.PrintHex > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "printhex" && c.Synchronized) ?? - new Command {Name = "printhex", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.PrintHex; - ctx.Commands.Update(command); - } - - if(allStats.Commands.Verify > 0) - { - Command command = ctx.Commands.FirstOrDefault(c => c.Name == "verify" && c.Synchronized) ?? - new Command {Name = "verify", Synchronized = true}; - - command.Count += (ulong)allStats.Commands.Verify; - ctx.Commands.Update(command); - } - } - - if(allStats.OperatingSystems != null) - foreach(OsStats operatingSystem in allStats.OperatingSystems) - { - if(string.IsNullOrWhiteSpace(operatingSystem.name) || - string.IsNullOrWhiteSpace(operatingSystem.version)) continue; - - OperatingSystem existing = - ctx.OperatingSystems.FirstOrDefault(c => c.Name == operatingSystem.name && - c.Version == operatingSystem.version && - c.Synchronized) ?? new OperatingSystem - { - Name = operatingSystem.name, Version = operatingSystem.version, Synchronized = true - }; - - existing.Count += (ulong)operatingSystem.Value; - ctx.OperatingSystems.Update(existing); - } - - if(allStats.Versions != null) - foreach(NameValueStats nvs in allStats.Versions) - { - if(string.IsNullOrWhiteSpace(nvs.name)) continue; - - Version existing = ctx.Versions.FirstOrDefault(c => c.Value == nvs.name && c.Synchronized) ?? - new Version {Value = nvs.name, Synchronized = true}; - - existing.Count += (ulong)nvs.Value; - ctx.Versions.Update(existing); - } - - if(allStats.Filesystems != null) - foreach(NameValueStats nvs in allStats.Filesystems) - { - if(string.IsNullOrWhiteSpace(nvs.name)) continue; - - Filesystem existing = - ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? - new Filesystem {Name = nvs.name, Synchronized = true}; - - existing.Count += (ulong)nvs.Value; - ctx.Filesystems.Update(existing); - } - - if(allStats.Partitions != null) - foreach(NameValueStats nvs in allStats.Partitions) - { - if(string.IsNullOrWhiteSpace(nvs.name)) continue; - - Partition existing = ctx.Partitions.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? - new Partition {Name = nvs.name, Synchronized = true}; - - existing.Count += (ulong)nvs.Value; - ctx.Partitions.Update(existing); - } - - if(allStats.Filesystems != null) - foreach(NameValueStats nvs in allStats.Filesystems) - { - if(string.IsNullOrWhiteSpace(nvs.name)) continue; - - Filesystem existing = - ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? - new Filesystem {Name = nvs.name, Synchronized = true}; - - existing.Count += (ulong)nvs.Value; - ctx.Filesystems.Update(existing); - } - - if(allStats.MediaImages != null) - foreach(NameValueStats nvs in allStats.MediaImages) - { - if(string.IsNullOrWhiteSpace(nvs.name)) continue; - - MediaFormat existing = - ctx.MediaFormats.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? - new MediaFormat {Name = nvs.name, Synchronized = true}; - - existing.Count += (ulong)nvs.Value; - ctx.MediaFormats.Update(existing); - } - - if(allStats.Filters != null) - foreach(NameValueStats nvs in allStats.Filters) - { - if(string.IsNullOrWhiteSpace(nvs.name)) continue; - - Filter existing = ctx.Filters.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? - new Filter {Name = nvs.name, Synchronized = true}; - - existing.Count += (ulong)nvs.Value; - ctx.Filters.Update(existing); - } - - if(allStats.Devices != null) - foreach(DeviceStats device in allStats.Devices) - { - if(ctx.SeenDevices.Any(d => d.Manufacturer == device.Manufacturer && d.Model == device.Model && - d.Revision == device.Revision && d.Bus == device.Bus)) - continue; - - ctx.SeenDevices.Add(new DeviceStat + if(allStats.Commands.Analyze > 0) { - Bus = device.Bus, - Manufacturer = device.Manufacturer, - Model = device.Model, - Revision = device.Revision, - Synchronized = true - }); + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "analyze" && c.Synchronized) ?? + new Command {Name = "analyze", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Analyze; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Benchmark > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "benchmark" && c.Synchronized) ?? + new Command {Name = "benchmark", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Benchmark; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Checksum > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "checksum" && c.Synchronized) ?? + new Command {Name = "checksum", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Checksum; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Compare > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "compare" && c.Synchronized) ?? + new Command {Name = "compare", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Compare; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ConvertImage > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "convert-image" && c.Synchronized) ?? + new Command {Name = "convert-image", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ConvertImage; + ctx.Commands.Update(command); + } + + if(allStats.Commands.CreateSidecar > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "create-sidecar" && c.Synchronized) ?? + new Command {Name = "create-sidecar", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.CreateSidecar; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Decode > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "decode" && c.Synchronized) ?? + new Command {Name = "decode", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Decode; + ctx.Commands.Update(command); + } + + if(allStats.Commands.DeviceInfo > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "device-info" && c.Synchronized) ?? + new Command {Name = "device-info", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.DeviceInfo; + ctx.Commands.Update(command); + } + + if(allStats.Commands.DeviceReport > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "device-report" && c.Synchronized) ?? + new Command {Name = "device-report", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.DeviceReport; + ctx.Commands.Update(command); + } + + if(allStats.Commands.DumpMedia > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "dump-media" && c.Synchronized) ?? + new Command {Name = "dump-media", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.DumpMedia; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Entropy > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "entropy" && c.Synchronized) ?? + new Command {Name = "entropy", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Entropy; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ExtractFiles > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "extract-files" && c.Synchronized) ?? + new Command {Name = "extract-files", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ExtractFiles; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Formats > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "formats" && c.Synchronized) ?? + new Command {Name = "formats", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Formats; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ImageInfo > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "image-info" && c.Synchronized) ?? + new Command {Name = "image-info", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ImageInfo; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ListDevices > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "list-devices" && c.Synchronized) ?? + new Command {Name = "list-devices", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ListDevices; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ListEncodings > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "list-encodings" && c.Synchronized) ?? + new Command {Name = "list-encodings", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ListEncodings; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Ls > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "ls" && c.Synchronized) ?? + new Command {Name = "ls", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Ls; + ctx.Commands.Update(command); + } + + if(allStats.Commands.MediaInfo > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "media-info" && c.Synchronized) ?? + new Command {Name = "media-info", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.MediaInfo; + ctx.Commands.Update(command); + } + + if(allStats.Commands.MediaScan > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "media-scan" && c.Synchronized) ?? + new Command {Name = "media-scan", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.MediaScan; + ctx.Commands.Update(command); + } + + if(allStats.Commands.PrintHex > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "printhex" && c.Synchronized) ?? + new Command {Name = "printhex", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.PrintHex; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Verify > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "verify" && c.Synchronized) ?? + new Command {Name = "verify", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Verify; + ctx.Commands.Update(command); + } } - if(allStats.Medias != null) - foreach(MediaStats media in allStats.Medias) - { - if(string.IsNullOrWhiteSpace(media.type)) continue; + if(allStats.OperatingSystems != null) + foreach(OsStats operatingSystem in allStats.OperatingSystems) + { + if(string.IsNullOrWhiteSpace(operatingSystem.name) || + string.IsNullOrWhiteSpace(operatingSystem.version)) continue; - Database.Models.Media existing = - ctx.Medias.FirstOrDefault(c => c.Type == media.type && c.Real == media.real && - c.Synchronized) ?? new Database.Models.Media + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Name == operatingSystem.name && + c.Version == operatingSystem.version && + c.Synchronized) ?? new OperatingSystem + { + Name = operatingSystem.name, + Version = operatingSystem.version, + Synchronized = true + }; + + existing.Count += (ulong)operatingSystem.Value; + ctx.OperatingSystems.Update(existing); + } + + if(allStats.Versions != null) + foreach(NameValueStats nvs in allStats.Versions) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Version existing = + ctx.Versions.FirstOrDefault(c => c.Value == nvs.name && c.Synchronized) ?? + new Version {Value = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Versions.Update(existing); + } + + if(allStats.Filesystems != null) + foreach(NameValueStats nvs in allStats.Filesystems) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filesystem existing = + ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new Filesystem {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Filesystems.Update(existing); + } + + if(allStats.Partitions != null) + foreach(NameValueStats nvs in allStats.Partitions) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Partition existing = + ctx.Partitions.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new Partition {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Partitions.Update(existing); + } + + if(allStats.Filesystems != null) + foreach(NameValueStats nvs in allStats.Filesystems) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filesystem existing = + ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new Filesystem {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Filesystems.Update(existing); + } + + if(allStats.MediaImages != null) + foreach(NameValueStats nvs in allStats.MediaImages) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + MediaFormat existing = + ctx.MediaFormats.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new MediaFormat {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.MediaFormats.Update(existing); + } + + if(allStats.Filters != null) + foreach(NameValueStats nvs in allStats.Filters) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filter existing = ctx.Filters.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new Filter {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Filters.Update(existing); + } + + if(allStats.Devices != null) + foreach(DeviceStats device in allStats.Devices) + { + if(ctx.SeenDevices.Any(d => d.Manufacturer == device.Manufacturer && + d.Model == device.Model && + d.Revision == device.Revision && + d.Bus == device.Bus)) continue; + + ctx.SeenDevices.Add(new DeviceStat { - Type = media.type, Real = media.real, Synchronized = true - }; + Bus = device.Bus, + Manufacturer = device.Manufacturer, + Model = device.Model, + Revision = device.Revision, + Synchronized = true + }); + } - existing.Count += (ulong)media.Value; - ctx.Medias.Update(existing); - } + if(allStats.Medias != null) + foreach(MediaStats media in allStats.Medias) + { + if(string.IsNullOrWhiteSpace(media.type)) continue; - ctx.SaveChanges(); - File.Delete(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")); + Database.Models.Media existing = + ctx.Medias.FirstOrDefault(c => c.Type == media.type && c.Real == media.real && + c.Synchronized) ?? new Database.Models.Media + { + Type = media.type, Real = media.real, Synchronized = true + }; + + existing.Count += (ulong)media.Value; + ctx.Medias.Update(existing); + } + + ctx.SaveChanges(); + File.Delete(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")); + } + catch(XmlException) + { + // Do not care about it + } } if(Settings.Settings.Current.Stats == null) return; diff --git a/DiscImageChef/Commands/DeviceReport.cs b/DiscImageChef/Commands/DeviceReport.cs index 8fd8bc704..b90092483 100644 --- a/DiscImageChef/Commands/DeviceReport.cs +++ b/DiscImageChef/Commands/DeviceReport.cs @@ -168,7 +168,7 @@ namespace DiscImageChef.Commands if(!Identify.Decode(buffer).HasValue) break; - report.ATA = new Ata {IdentifyDevice = Identify.Decode(buffer)}; + report.ATA = new Ata {Identify = buffer}; if(report.ATA.IdentifyDevice == null) break; @@ -199,8 +199,7 @@ namespace DiscImageChef.Commands System.Console.ReadKey(true); DicConsole.WriteLine("Querying ATA IDENTIFY..."); dev.AtaIdentify(out buffer, out _, dev.Timeout, out _); - report.ATA.IdentifyDevice = Identify.Decode(buffer); - if(options.Debug) report.ATA.Identify = buffer; + report.ATA.Identify = buffer; List mediaTests = new List(); pressedKey = new ConsoleKeyInfo(); @@ -252,9 +251,7 @@ namespace DiscImageChef.Commands if(!Identify.Decode(buffer).HasValue) return; Identify.IdentifyDevice? atapiIdNullable = Identify.Decode(buffer); - if(atapiIdNullable != null) report.ATAPI = new Ata {IdentifyDevice = atapiIdNullable}; - - if(options.Debug) report.ATAPI.Identify = buffer; + report.ATAPI.Identify = buffer; goto case DeviceType.SCSI; case DeviceType.SCSI: @@ -297,9 +294,7 @@ namespace DiscImageChef.Commands report.SCSI.EVPDPages = reporter.ReportEvpdPages(); - Modes.ModePage_2A cdromMode = null; - - reporter.ReportScsiModes(ref report, ref cdromMode); + reporter.ReportScsiModes(ref report, out byte[] cdromMode); string mediumManufacturer; byte[] senseBuffer; @@ -313,18 +308,18 @@ namespace DiscImageChef.Commands report.SCSI.MultiMediaDevice = new Mmc { - ModeSense2A = cdromMode, Features = reporter.ReportMmcFeatures() + ModeSense2AData = cdromMode, Features = reporter.ReportMmcFeatures() }; if(cdromMode != null) { mediaTypes.Add("CD-ROM"); mediaTypes.Add("Audio CD"); - if(cdromMode.ReadCDR) mediaTypes.Add("CD-R"); - if(cdromMode.ReadCDRW) mediaTypes.Add("CD-RW"); - if(cdromMode.ReadDVDROM) mediaTypes.Add("DVD-ROM"); - if(cdromMode.ReadDVDRAM) mediaTypes.Add("DVD-RAM"); - if(cdromMode.ReadDVDR) mediaTypes.Add("DVD-R"); + if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadCDR) mediaTypes.Add("CD-R"); + if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadCDRW) mediaTypes.Add("CD-RW"); + if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadDVDROM) mediaTypes.Add("DVD-ROM"); + if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadDVDRAM) mediaTypes.Add("DVD-RAM"); + if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadDVDR) mediaTypes.Add("DVD-R"); } if(report.SCSI.MultiMediaDevice.Features != null)