mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user