Store and use undecoded buffers for ATA IDENTIFY (PACKET) DEVICE, SCSI INQUIRY and SCSI MODE PAGE 2Ah in device reports.

This commit is contained in:
2018-12-23 21:38:01 +00:00
parent 3440242478
commit 7c21a8df1e
4 changed files with 450 additions and 416 deletions

View File

@@ -39,6 +39,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text; using System.Text;
using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Enums;
using DiscImageChef.Decoders.ATA; using DiscImageChef.Decoders.ATA;
@@ -74,6 +75,18 @@ namespace DiscImageChef.CommonTypes.Metadata
{ {
SCSI = new Scsi(reportV1.SCSI); SCSI = new Scsi(reportV1.SCSI);
Type = DeviceType.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) if(reportV1.ATAPI != null)
@@ -211,8 +224,6 @@ namespace DiscImageChef.CommonTypes.Metadata
public class Ata public class Ata
{ {
public Identify.IdentifyDevice? IdentifyDevice;
public Ata() { } public Ata() { }
public Ata(ataType ata) public Ata(ataType ata)
@@ -229,11 +240,7 @@ namespace DiscImageChef.CommonTypes.Metadata
RemovableMedias.Add(new TestedMedia(ataRemovableMedia, true)); RemovableMedias.Add(new TestedMedia(ataRemovableMedia, true));
} }
if(Identify != null) if(Identify != null) return;
{
IdentifyDevice = Decoders.ATA.Identify.Decode(Identify);
return;
}
Identify.IdentifyDevice identifyDevice = new Identify.IdentifyDevice(); Identify.IdentifyDevice identifyDevice = new Identify.IdentifyDevice();
@@ -398,9 +405,11 @@ namespace DiscImageChef.CommonTypes.Metadata
if(ata.WRVSectorCountMode2Specified) identifyDevice.WRVSectorCountMode2 = ata.WRVSectorCountMode2; 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] [JsonIgnore]
public int Id { get; set; } public int Id { get; set; }
public byte[] Identify { get; set; } public byte[] Identify { get; set; }
@@ -447,8 +456,6 @@ namespace DiscImageChef.CommonTypes.Metadata
public class Scsi public class Scsi
{ {
public Inquiry.SCSIInquiry? Inquiry;
public Scsi() { } public Scsi() { }
public Scsi(scsiType scsi) public Scsi(scsiType scsi)
@@ -482,11 +489,7 @@ namespace DiscImageChef.CommonTypes.Metadata
if(scsi.SequentialDevice != null) SequentialDevice = new Ssc(scsi.SequentialDevice); if(scsi.SequentialDevice != null) SequentialDevice = new Ssc(scsi.SequentialDevice);
if(InquiryData != null) if(InquiryData != null) return;
{
Inquiry = Decoders.SCSI.Inquiry.Decode(InquiryData);
return;
}
Inquiry.SCSIInquiry inq = new Inquiry.SCSIInquiry(); Inquiry.SCSIInquiry inq = new Inquiry.SCSIInquiry();
@@ -553,9 +556,11 @@ namespace DiscImageChef.CommonTypes.Metadata
inq.WBus16 = scsi.Inquiry.WideBus16; inq.WBus16 = scsi.Inquiry.WideBus16;
inq.WBus32 = scsi.Inquiry.WideBus32; inq.WBus32 = scsi.Inquiry.WideBus32;
Inquiry = inq; InquiryData = Decoders.SCSI.Inquiry.Encode(inq);
} }
public Inquiry.SCSIInquiry? Inquiry => Decoders.SCSI.Inquiry.Decode(InquiryData);
[JsonIgnore] [JsonIgnore]
public int Id { get; set; } public int Id { get; set; }
public byte[] InquiryData { get; set; } public byte[] InquiryData { get; set; }
@@ -672,60 +677,72 @@ namespace DiscImageChef.CommonTypes.Metadata
public Mmc(mmcType mmc) public Mmc(mmcType mmc)
{ {
if(mmc.ModeSense2A != null) if(mmc.ModeSense2A != null)
ModeSense2A = new Modes.ModePage_2A ModeSense2AData = Modes.EncodeModePage_2A(new Modes.ModePage_2A
{ {
AccurateCDDA = mmc.ModeSense2A.AccurateCDDA, AccurateCDDA = mmc.ModeSense2A.AccurateCDDA,
BCK = mmc.ModeSense2A.BCK, BCK = mmc.ModeSense2A.BCK,
BufferSize = mmc.ModeSense2A.BufferSize, BufferSize = mmc.ModeSense2A.BufferSize,
BUF = mmc.ModeSense2A.BufferUnderRunProtection, BUF = mmc.ModeSense2A.BufferUnderRunProtection,
Eject = mmc.ModeSense2A.CanEject, Eject = mmc.ModeSense2A.CanEject,
Lock = mmc.ModeSense2A.CanLockMedia, Lock = mmc.ModeSense2A.CanLockMedia,
CDDACommand = mmc.ModeSense2A.CDDACommand, CDDACommand = mmc.ModeSense2A.CDDACommand,
Composite = mmc.ModeSense2A.CompositeAudioVideo, Composite = mmc.ModeSense2A.CompositeAudioVideo,
CMRSupported = (ushort)(mmc.ModeSense2A.CSSandCPPMSupported ? 1 : 0), CMRSupported =
CurrentSpeed = mmc.ModeSense2A.CurrentSpeed, (ushort)(mmc.ModeSense2A.CSSandCPPMSupported
CurrentWriteSpeed = mmc.ModeSense2A.CurrentWriteSpeed, ? 1
CurrentWriteSpeedSelected = mmc.ModeSense2A.CurrentWriteSpeedSelected, : 0),
SDP = mmc.ModeSense2A.DeterministicSlotChanger, CurrentSpeed = mmc.ModeSense2A.CurrentSpeed,
DigitalPort1 = mmc.ModeSense2A.DigitalPort1, CurrentWriteSpeed = mmc.ModeSense2A.CurrentWriteSpeed,
DigitalPort2 = mmc.ModeSense2A.DigitalPort2, CurrentWriteSpeedSelected =
LeadInPW = mmc.ModeSense2A.LeadInPW, mmc.ModeSense2A.CurrentWriteSpeedSelected,
LoadingMechanism = mmc.ModeSense2A.LoadingMechanismType, SDP = mmc.ModeSense2A.DeterministicSlotChanger,
LockState = mmc.ModeSense2A.LockStatus, DigitalPort1 = mmc.ModeSense2A.DigitalPort1,
LSBF = mmc.ModeSense2A.LSBF, DigitalPort2 = mmc.ModeSense2A.DigitalPort2,
MaximumSpeed = mmc.ModeSense2A.MaximumSpeed, LeadInPW = mmc.ModeSense2A.LeadInPW,
MaxWriteSpeed = mmc.ModeSense2A.MaximumWriteSpeed, LoadingMechanism =
AudioPlay = mmc.ModeSense2A.PlaysAudio, mmc.ModeSense2A.LoadingMechanismType,
PreventJumper = mmc.ModeSense2A.PreventJumperStatus, LockState = mmc.ModeSense2A.LockStatus,
RCK = mmc.ModeSense2A.RCK, LSBF = mmc.ModeSense2A.LSBF,
ReadBarcode = mmc.ModeSense2A.ReadsBarcode, MaximumSpeed = mmc.ModeSense2A.MaximumSpeed,
SCC = mmc.ModeSense2A.ReadsBothSides, MaxWriteSpeed = mmc.ModeSense2A.MaximumWriteSpeed,
ReadCDR = mmc.ModeSense2A.ReadsCDR, AudioPlay = mmc.ModeSense2A.PlaysAudio,
ReadCDRW = mmc.ModeSense2A.ReadsCDRW, PreventJumper = mmc.ModeSense2A.PreventJumperStatus,
DeinterlaveSubchannel = mmc.ModeSense2A.ReadsDeinterlavedSubchannel, RCK = mmc.ModeSense2A.RCK,
ReadDVDR = mmc.ModeSense2A.ReadsDVDR, ReadBarcode = mmc.ModeSense2A.ReadsBarcode,
ReadDVDRAM = mmc.ModeSense2A.ReadsDVDRAM, SCC = mmc.ModeSense2A.ReadsBothSides,
ReadDVDROM = mmc.ModeSense2A.ReadsDVDROM, ReadCDR = mmc.ModeSense2A.ReadsCDR,
ISRC = mmc.ModeSense2A.ReadsISRC, ReadCDRW = mmc.ModeSense2A.ReadsCDRW,
Mode2Form2 = mmc.ModeSense2A.ReadsMode2Form2, DeinterlaveSubchannel =
Mode2Form1 = mmc.ModeSense2A.ReadsMode2Form1, mmc.ModeSense2A.ReadsDeinterlavedSubchannel,
Method2 = mmc.ModeSense2A.ReadsPacketCDR, ReadDVDR = mmc.ModeSense2A.ReadsDVDR,
Subchannel = mmc.ModeSense2A.ReadsSubchannel, ReadDVDRAM = mmc.ModeSense2A.ReadsDVDRAM,
UPC = mmc.ModeSense2A.ReadsUPC, ReadDVDROM = mmc.ModeSense2A.ReadsDVDROM,
C2Pointer = mmc.ModeSense2A.ReturnsC2Pointers, ISRC = mmc.ModeSense2A.ReadsISRC,
RotationControlSelected = mmc.ModeSense2A.RotationControlSelected, Mode2Form2 = mmc.ModeSense2A.ReadsMode2Form2,
SeparateChannelMute = mmc.ModeSense2A.SeparateChannelMute, Mode2Form1 = mmc.ModeSense2A.ReadsMode2Form1,
SeparateChannelVolume = mmc.ModeSense2A.SeparateChannelVolume, Method2 = mmc.ModeSense2A.ReadsPacketCDR,
SSS = mmc.ModeSense2A.SSS, Subchannel = mmc.ModeSense2A.ReadsSubchannel,
MultiSession = mmc.ModeSense2A.SupportsMultiSession, UPC = mmc.ModeSense2A.ReadsUPC,
SupportedVolumeLevels = mmc.ModeSense2A.SupportedVolumeLevels, C2Pointer = mmc.ModeSense2A.ReturnsC2Pointers,
TestWrite = mmc.ModeSense2A.TestWrite, RotationControlSelected =
WriteCDR = mmc.ModeSense2A.WritesCDR, mmc.ModeSense2A.RotationControlSelected,
WriteCDRW = mmc.ModeSense2A.WritesCDRW, SeparateChannelMute =
WriteDVDR = mmc.ModeSense2A.WritesDVDR, mmc.ModeSense2A.SeparateChannelMute,
WriteDVDRAM = mmc.ModeSense2A.WritesDVDRAM, SeparateChannelVolume =
WriteSpeedPerformanceDescriptors = mmc.ModeSense2A.WriteSpeedPerformanceDescriptors 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.Features != null) Features = new MmcFeatures(mmc.Features);
if(mmc.TestedMedia == null) return; if(mmc.TestedMedia == null) return;
@@ -735,10 +752,11 @@ namespace DiscImageChef.CommonTypes.Metadata
} }
[JsonIgnore] [JsonIgnore]
public int Id { get; set; } public int Id { get; set; }
public virtual Modes.ModePage_2A ModeSense2A { get; set; } public virtual Modes.ModePage_2A ModeSense2A => Modes.DecodeModePage_2A(ModeSense2AData);
public virtual MmcFeatures Features { get; set; } public virtual MmcFeatures Features { get; set; }
public virtual List<TestedMedia> TestedMedia { get; set; } public virtual List<TestedMedia> TestedMedia { get; set; }
public byte[] ModeSense2AData { get; set; }
} }
public class MmcFeatures public class MmcFeatures

View File

@@ -51,9 +51,7 @@ namespace DiscImageChef.Core.Devices.Report
if(sense || !Inquiry.Decode(buffer).HasValue) return null; if(sense || !Inquiry.Decode(buffer).HasValue) return null;
report.Inquiry = Inquiry.Decode(buffer); report.InquiryData = buffer;
if(debug) report.InquiryData = buffer;
return report; return report;
} }
@@ -82,7 +80,7 @@ namespace DiscImageChef.Core.Devices.Report
return evpds.Count > 0 ? evpds : null; 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; Modes.DecodedMode? decMode = null;
PeripheralDeviceTypes devType = dev.ScsiType; PeripheralDeviceTypes devType = dev.ScsiType;
@@ -157,7 +155,7 @@ namespace DiscImageChef.Core.Devices.Report
modePages.Add(modePage); modePages.Add(modePage);
if(modePage.page == 0x2A && modePage.subpage == 0x00) 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; if(modePages.Count > 0) report.SCSI.ModeSense.ModePages = modePages;

View File

@@ -37,6 +37,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Threading; using System.Threading;
using System.Xml;
using System.Xml.Serialization; using System.Xml.Serialization;
using DiscImageChef.CommonTypes.Interop; using DiscImageChef.CommonTypes.Interop;
using DiscImageChef.CommonTypes.Metadata; using DiscImageChef.CommonTypes.Metadata;
@@ -44,6 +45,7 @@ using DiscImageChef.Database;
using DiscImageChef.Database.Models; using DiscImageChef.Database.Models;
using Newtonsoft.Json; using Newtonsoft.Json;
using Device = DiscImageChef.Devices.Device; using Device = DiscImageChef.Devices.Device;
using Formatting = Newtonsoft.Json.Formatting;
using MediaType = DiscImageChef.CommonTypes.MediaType; using MediaType = DiscImageChef.CommonTypes.MediaType;
using OperatingSystem = DiscImageChef.Database.Models.OperatingSystem; using OperatingSystem = DiscImageChef.Database.Models.OperatingSystem;
using Version = DiscImageChef.Database.Models.Version; using Version = DiscImageChef.Database.Models.Version;
@@ -69,338 +71,359 @@ namespace DiscImageChef.Core
{ {
if(File.Exists(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml"))) if(File.Exists(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")))
{ {
Stats allStats = new Stats(); try
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)
{ {
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) ?? if(allStats.Commands.Analyze > 0)
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
{ {
Bus = device.Bus, Command command = ctx.Commands.FirstOrDefault(c => c.Name == "analyze" && c.Synchronized) ??
Manufacturer = device.Manufacturer, new Command {Name = "analyze", Synchronized = true};
Model = device.Model,
Revision = device.Revision, command.Count += (ulong)allStats.Commands.Analyze;
Synchronized = true 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) if(allStats.OperatingSystems != null)
foreach(MediaStats media in allStats.Medias) foreach(OsStats operatingSystem in allStats.OperatingSystems)
{ {
if(string.IsNullOrWhiteSpace(media.type)) continue; if(string.IsNullOrWhiteSpace(operatingSystem.name) ||
string.IsNullOrWhiteSpace(operatingSystem.version)) continue;
Database.Models.Media existing = OperatingSystem existing =
ctx.Medias.FirstOrDefault(c => c.Type == media.type && c.Real == media.real && ctx.OperatingSystems.FirstOrDefault(c => c.Name == operatingSystem.name &&
c.Synchronized) ?? new Database.Models.Media 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; if(allStats.Medias != null)
ctx.Medias.Update(existing); foreach(MediaStats media in allStats.Medias)
} {
if(string.IsNullOrWhiteSpace(media.type)) continue;
ctx.SaveChanges(); Database.Models.Media existing =
File.Delete(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")); 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; if(Settings.Settings.Current.Stats == null) return;

View File

@@ -168,7 +168,7 @@ namespace DiscImageChef.Commands
if(!Identify.Decode(buffer).HasValue) break; 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; if(report.ATA.IdentifyDevice == null) break;
@@ -199,8 +199,7 @@ namespace DiscImageChef.Commands
System.Console.ReadKey(true); System.Console.ReadKey(true);
DicConsole.WriteLine("Querying ATA IDENTIFY..."); DicConsole.WriteLine("Querying ATA IDENTIFY...");
dev.AtaIdentify(out buffer, out _, dev.Timeout, out _); dev.AtaIdentify(out buffer, out _, dev.Timeout, out _);
report.ATA.IdentifyDevice = Identify.Decode(buffer); report.ATA.Identify = buffer;
if(options.Debug) report.ATA.Identify = buffer;
List<TestedMedia> mediaTests = new List<TestedMedia>(); List<TestedMedia> mediaTests = new List<TestedMedia>();
pressedKey = new ConsoleKeyInfo(); pressedKey = new ConsoleKeyInfo();
@@ -252,9 +251,7 @@ namespace DiscImageChef.Commands
if(!Identify.Decode(buffer).HasValue) return; if(!Identify.Decode(buffer).HasValue) return;
Identify.IdentifyDevice? atapiIdNullable = Identify.Decode(buffer); Identify.IdentifyDevice? atapiIdNullable = Identify.Decode(buffer);
if(atapiIdNullable != null) report.ATAPI = new Ata {IdentifyDevice = atapiIdNullable}; report.ATAPI.Identify = buffer;
if(options.Debug) report.ATAPI.Identify = buffer;
goto case DeviceType.SCSI; goto case DeviceType.SCSI;
case DeviceType.SCSI: case DeviceType.SCSI:
@@ -297,9 +294,7 @@ namespace DiscImageChef.Commands
report.SCSI.EVPDPages = reporter.ReportEvpdPages(); report.SCSI.EVPDPages = reporter.ReportEvpdPages();
Modes.ModePage_2A cdromMode = null; reporter.ReportScsiModes(ref report, out byte[] cdromMode);
reporter.ReportScsiModes(ref report, ref cdromMode);
string mediumManufacturer; string mediumManufacturer;
byte[] senseBuffer; byte[] senseBuffer;
@@ -313,18 +308,18 @@ namespace DiscImageChef.Commands
report.SCSI.MultiMediaDevice = new Mmc report.SCSI.MultiMediaDevice = new Mmc
{ {
ModeSense2A = cdromMode, Features = reporter.ReportMmcFeatures() ModeSense2AData = cdromMode, Features = reporter.ReportMmcFeatures()
}; };
if(cdromMode != null) if(cdromMode != null)
{ {
mediaTypes.Add("CD-ROM"); mediaTypes.Add("CD-ROM");
mediaTypes.Add("Audio CD"); mediaTypes.Add("Audio CD");
if(cdromMode.ReadCDR) mediaTypes.Add("CD-R"); if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadCDR) mediaTypes.Add("CD-R");
if(cdromMode.ReadCDRW) mediaTypes.Add("CD-RW"); if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadCDRW) mediaTypes.Add("CD-RW");
if(cdromMode.ReadDVDROM) mediaTypes.Add("DVD-ROM"); if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadDVDROM) mediaTypes.Add("DVD-ROM");
if(cdromMode.ReadDVDRAM) mediaTypes.Add("DVD-RAM"); if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadDVDRAM) mediaTypes.Add("DVD-RAM");
if(cdromMode.ReadDVDR) mediaTypes.Add("DVD-R"); if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadDVDR) mediaTypes.Add("DVD-R");
} }
if(report.SCSI.MultiMediaDevice.Features != null) if(report.SCSI.MultiMediaDevice.Features != null)